1# XTS测评用例开发指导 2 3 4## 简介 5 6XTS子系统是OpenHarmony兼容性测评套件的集合,当前包括acts(application compatibility test suite)应用兼容性测试套件,后续会拓展dcts(device compatibility test suite)设备兼容性测试套件等。 7 8XTS子系统当前包括acts与tools软件包: 9 10- acts,存放acts相关测试用例源码与配置文件,其目的是帮助终端设备厂商尽早发现软件与OpenHarmony的不兼容性,确保软件在整个开发过程中满足OpenHarmony的兼容性要求。 11 12- tools,存放acts相关测试用例开发框架。 13 14 15## 系统类型 16 17支持如下几种系统类型: 18 19- 轻量系统(mini system) 20 面向MCU类处理器例如Arm Cortex-M、RISC-V 32位的设备,硬件资源极其有限,支持的设备最小内存为128KiB,可以提供多种轻量级网络协议,轻量级的图形框架,以及丰富的IOT总线读写部件等。可支撑的产品如智能家居领域的连接类模组、传感器设备、穿戴类设备等。 21 22- 小型系统(small system) 23 面向应用处理器例如Arm Cortex-A的设备,支持的设备最小内存为1MiB,可以提供更高的安全能力、标准的图形框架、视频编解码的多媒体能力。可支撑的产品如智能家居领域的IP Camera、电子猫眼、路由器以及智慧出行域的行车记录仪等。 24 25- 标准系统(standard system) 26 面向应用处理器例如Arm Cortex-A的设备,支持的设备最小内存为128MiB,可以提供增强的交互能力、3D GPU以及硬件合成能力、更多控件以及动效更丰富的图形能力、完整的应用框架。可支撑的产品如高端的冰箱显示屏。 27 28 29## 目录 30 31 32``` 33/test/xts 34├── acts # 测试代码存放目录。 35│ └── subsystem # 标准系统子系统测试用例源码存放目录。 36│ └── subsystem_lite # 轻量系统、小型系统子系统测试用例源码存放目录。 37│ └── BUILD.gn # 标准系统测试用例编译配置。 38│ └── build_lite # 轻量系统、小型系统测试用例编译配置存放目录。 39│ └── BUILD.gn # 轻量系统、小型系统测试用例编译配置。 40└── tools # 测试工具代码存放目录。 41``` 42 43 44## 约束 45 46轻量系统用例开发语言是C,小型系统用例开发语言是C++。 47 48 49## 使用说明 50 51 **表1** 用例级别说明 52 53| 级别名称 | 基本定义 | 测试范围 | 54| -------- | -------- | -------- | 55| Level0 | 冒烟 | 验证关键功能点基本功能/最基本DFX属性在最常见输入下的表现,通过表示功能基本可运行。 | 56| Level1 | 基本 | 验证各功能点基本功能/基本DFX属性在常见输入下的表现,通过表示功能基本可测试。 | 57| Level2 | 重要 | 验证各功能点的基本功能/基本DFX属性在常规输入/常见异常情况下的表现,通过表示功能基本正常可用,可开展Beta。 | 58| Level3 | 一般 | 验证各功能点的全部功能/全部DFX属性在各种常规/非常规输入组合下,或各种正常/异常预置条件组合下的表现。 | 59| Level4 | 生僻 | 验证关键功能点在极端异常预置条件下、用户难以触及的异常输入组合下的表现。 | 60 61 **表2** 用例粒度说明 62 63| 用例规模 | 被测试对象 | 测试环境 | 64| -------- | -------- | -------- | 65| LargeTest | 业务功能/全场景特性/整机及场景级DFX | 尽量使用贴近真实的环境设备。 | 66| MediumTest | 模块/子系统集成至设备后的功能/DFX | 使用真实的单设备进行验证,可进行消息模拟,尽量不对函数进行MOCK。 | 67| SmallTest | 模块/类/函数 | 在开发者个人环境进行测试,尽量不依赖其他模块,存在大量的MOCK。 | 68 69 **表3** 测试类型说明 70 71| 测试类型名称 | 测试类型定义 | 72| -------- | -------- | 73| Function | 验证被测对象提供给用户的业务功能实现正确性的测试项,这里的“用户”可以是终端用户或开发者,功能包括业务功能及平台功能。 | 74| Performance | 验证被测对象在特定预置条件/负载模型下的处理能力的测试项,“处理能力”一般以单位时间内可处理的业务量来衡量,如呼叫/秒,帧率/秒,事件处理量/秒等。 | 75| Power | 验证被测对象在特定预置条件/负载模型下在一定时间内能源消耗量的测试项。 | 76| Reliability | 验证被测对象在正常/异常输入情况下,或业务量压力和长时间连续运行压力情况下业务表现的测试项,含稳定性、压力、故障注入、Monkey测试项。 | 77| Security | 验证系统对恶意威胁的防护能力,威胁包括但不限于未授权访问、使用、泄露、破坏、修改、毁灭,以保障信息的机密性、完整性和可用性;验证系统对用户隐私的保护能力,保障用户的隐私数据被收集、使用、保有、披露和处置符合法律规范,保障用户的隐私权;验证对各类安全规范的遵从情况,如安全设计规范、安全红线、工信部安全认证规范等,保障安全相关法律法规的合规。 | 78| Global | 验证被测对象在是否具有国际化数据支持和本地化能力的测试项,包括语言显示、输入/输出习惯、时间显示、区域特性如货币时间禁忌等等。 | 79| Compatibility | 当被测对象为应用时,包括被测对象对于自身数据的后向兼容性、对于系统的前后向兼容性、对于不同用户数据(如播放器之音频文件格式/智能短信之用户短信内容)的兼容性测试项; 当被测对象为系统时,包括被测系统对于系统自身数据的后向兼容性、以及对于生态中常用应用的兼容性测试项;当被测对象为软件时,包括被测软件对于相关的硬件的兼容性。 | 80| User | 验证被测对象在真实用户场景下的用户体验感受的测试项,注意此种情况下没有客观的“正确”与“失败”,所有的结论及评价都应该来自于用户。 | 81| Standard | 验证被测对象对于行业及公司内标准/协议/规范的遵从情况的测试项,注意此处的“标准”不包含任何安全标准,针对安全标准的测试项划归为“安全测试”类型。 | 82| Safety | 验证被测对象的Safety属性,避免产品可能对人身安全、健康以及产品本身带来的危害。 | 83| Resilience | 验证被测对象的韧性属性,确保系统受攻击时承受并保持在有定义的运行状态(包括降级)、恢复并适应攻击以保障Mission达成。 | 84 85 86## 用例开发指导 87 88根据测试系统选择测试框架和对应测试用例语言。 89 90 **表4** 系统和测试框架、开发语言对应关系 91 92| 系统 | 测试框架 | 语言 | 93| -------- | -------- | -------- | 94| 轻量系统 | hctest | c | 95| 小型系统 | hcpptest | c++ | 96| 标准系统 | HJSUnit、hcpptest | js、c++ | 97 98### C语言用例开发编译指导(适用于轻量系统产品用例开发) 99 100**示例:轻量系统测试用例开发** 101 102当前使用的测试框架是hctest,hctest测试框架支持使用C语言编写测试用例,是在开源测试框架unity的基础上进行增强和适配。 103 1041. 用例目录规范:测试用例存储到test/xts/acts仓中。 105 106 ``` 107 ├── acts 108 │ └──subsystem_lite 109 │ │ └── module_hal 110 │ │ │ └── BUILD.gn 111 │ │ │ └── src 112 │ └──build_lite 113 │ │ └── BUILD.gn 114 ``` 115 1162. src目录下用例编写样例。 117 118 1. 引用测试框架 119 120 ``` 121 #include "hctest.h" 122 ``` 123 124 2. 使用宏定义LITE_TEST_SUIT定义子系统、模块、测试套件名称。 125 126 127 ``` 128 /** 129 * @brief register a test suite named "IntTestSuite" 130 * @param test subsystem name 131 * @param example module name 132 * @param IntTestSuite test suite name 133 */ 134 LITE_TEST_SUIT(test, example, IntTestSuite); 135 ``` 136 137 3. 定义Setup与TearDown。 138 139 命名方式:测试套件名称+Setup,测试套件名称+TearDown。 140 141 Setup与TearDown必须存在,可以为空函数。 142 143 4. 使用宏定义LITE_TEST_CASE写测试用例。 144 145 包括三个参数:测试套件名称,测试用例名称,用例属性(测试类型、用例粒度、用例级别)。 146 ``` 147 LITE_TEST_CASE(IntTestSuite, TestCase001, Function | MediumTest | Level1) 148 { 149 //do something. 150 }; 151 ``` 152 5. 使用宏定义 RUN_TEST_SUITE注册测试套件。 153 154 155 ``` 156 RUN_TEST_SUITE(IntTestSuite); 157 ``` 158 1593. 测试模块的配置文件(BUILD.gn)样例: 160 在每个测试模块目录下新建BUILD.gn编译文件,用于指定编译后静态库的名称、依赖的头文件、依赖的库等;具体写法如下: 161 162 163 ``` 164 import("//test/xts/tools/lite/build/suite_lite.gni") 165 hctest_suite("ActsDemoTest") { 166 suite_name = "acts" 167 sources = [ 168 "src/test_demo.c", 169 ] 170 include_dirs = [ ] 171 cflags = [ "-Wno-error" ] 172 } 173 ``` 174 1754. acts下BUILD.gn增加编译选项。 176 需要将测试模块加入到acts目录下的编译脚本中,编译脚本路径:test/xts/acts/build_lite/BUILD.gn。 177 178 179 ``` 180 lite_component("acts") { 181 ... 182 if(board_name == "liteos_m") { 183 features += [ 184 ... 185 "//xts/acts/subsystem_lite/module_hal:ActsDemoTest" 186 ] 187 } 188 } 189 ``` 190 1915. 测试套件编译命令。 192 随版本编译,debug版本编译时会同步编译acts测试套件。 193 194 >  **说明:** 195 > acts测试套件编译中间件为静态库,最终链接到版本镜像中。 196 197### C语言用例执行指导(适用于轻量系统产品用例开发) 198 199**示例:轻量系统测试用例执行** 200 201将版本镜像烧录进开发板。 202 203**测试步骤** 204 2051. 使用串口工具登录开发板,并保存串口打印信息。 206 2072. 重启设备,查看串口日志。 208 209**测试结果分析指导** 210 211基于串口打印日志进行分析; 212 213每个测试套件执行以Start to run test suite开始,以xx Tests xx Failures xx Ignored结束。 214 215 216### C++语言用例开发编译指导(适用于小型系统、标准系统用例开发) 217 218**示例:小型系统测试用例开发**(标准参考具体样例目录:global/i18n_standard) 219 220当前使用的测试框架是hcpptest,hcpptest测试框架是在开源的googletest测试框架的基础上进行的增强和适配。 221 2221. 规范用例目录:测试用例存储到test/xts/acts仓中。 223 224 ``` 225 ├── acts 226 │ └──subsystem_lite 227 │ │ └── module_posix 228 │ │ │ └── BUILD.gn 229 │ │ │ └── src 230 │ └──build_lite 231 │ │ └── BUILD.gn 232 ``` 233 2342. 测试模块src下用例编写样例: 235 1. 引用测试框架: 236 237 需要引用gtest.h 如:\#include "gtest/gtest.h" 238 239 240 ``` 241 #include "gtest/gtest.h" 242 ``` 243 244 2. 定义Setup与TearDown。 245 246 247 ``` 248 using namespace std; 249 using namespace testing::ext; 250 class TestSuite: public testing::Test { 251 protected: 252 // Preset action of the test suite, which is executed before the first test case. 253 static void SetUpTestCase(void){ 254 } 255 // Test suite cleanup action, which is executed after the last test case. 256 static void TearDownTestCase(void){ 257 } 258 // Preset action of the test case. 259 virtual void SetUp() 260 { 261 } 262 // Cleanup action of the test case. 263 virtual void TearDown() 264 { 265 } 266 }; 267 ``` 268 269 3. 使用宏定义HWTEST或HWTEST_F写测试用例。 270 271 普通测试用例的定义:HWTEST(测试套名称, 测试用例名称, 用例标注)。 272 273 包含SetUp和TearDown的测试用例的定义 :HWTEST_F(测试套名称, 测试用例名称,用例标注)。 274 275 宏定义包括三个参数:测试套件名称,测试用例名称,用例属性(测试类型、用例粒度、用例级别)。 276 277 278 ``` 279 HWTEST_F(TestSuite, TestCase_0001, Function | MediumTest | Level1) { 280 // do something. 281 } 282 ``` 283 2843. 测试模块下用例配置文件(BUILD.gn)样例。 285 286 每个测试模块目录下新建BUILD.gn编译文件,用于指定编译后可执行文件的名称、依赖的头文件、依赖的库等;具体写法如下。每个测试模块将独立编译成.bin可执行文件, 该文件可直接push到单板上进行测试。 287 288 举例: 289 290 ``` 291 import("//test/xts/tools/lite/build/suite_lite.gni") 292 hcpptest_suite("ActsDemoTest") { 293 suite_name = "acts" 294 sources = [ 295 "src/TestDemo.cpp" 296 ] 297 298 include_dirs = [ 299 "src", 300 ... 301 ] 302 deps = [ 303 ... 304 ] 305 cflags = [ "-Wno-error" ] 306 } 307 308 ``` 309 3104. acts目录下增加编译选项(BUILD.gn)样例。 311 312 将测试模块加入到acts目录下的编译脚本中,编译脚本为:test/xts/acts/build_lite/BUILD.gn。 313 314 315 ``` 316 lite_component("acts") { 317 ... 318 else if(board_name == "liteos_a") { 319 features += [ 320 ... 321 "//xts/acts/subsystem_lite/module_posix:ActsDemoTest" 322 ] 323 } 324 } 325 ``` 326 3275. 测试套件编译命令。 328 随版本编译,debug版本编译时会同步编译acts测试套件。 329 >  **说明:** 330 > 小型系统acts独立编译成可执行文件(bin格式), 在编译产物的suites\acts目录下归档。 331 332 333### C++语言用例执行指导(适用于小型系统、标准系统用例开发) 334 335**示例:小型系统测试用例执行** 336 337目前的用例执行采用nfs共享的方式,mount到单板去执行。 338 339**环境搭建** 340 3411. 使用有限网线或无线将开发板与PC进行连接。 342 3432. 开发板配置IP、子网掩码、网关,确保开发板与PC处于同一个网段。 344 3453. PC安装nfs服务器并完成注册,启动nfs服务。 346 3474. 开发板配置mount命令,确保开发板可以访问PC端的nfs共享文件。 348 格式:mount [nfs服务器IP]:[/nfs共享目录] [/开发板目录] nfs 349 350 举例: 351 352 ``` 353 mount 192.168.1.10:/nfs /nfs nfs 354 ``` 355 356**用例执行** 357 358测试套件执行 ActsDemoTest.bin 触发用例执行,基于串口打印日志进行分析。 359 360### JS语言用例开发指导(适用于标准系统) 361 362当前使用的测试框架是HJSUnit,用于支撑OpenHarmony application测试(特指基于JS应用框架使用 Javascript 语言开发的 APP)进行自动化测试。 363 364**用例编写基础语法** 365 366测试用例为 js 语言,必须满足 JavaScript 语言编程规范。 367 368 **表7** 用例编写基础语法 369 370| 用例语法 | 描述 | 要求 | 371| -------- | -------- | -------- | 372| beforeAll | 测试套级别的预置条件,在所有测试用例开始前执行且仅执行一次,支持一个参数:预置动作函数。 | 可选 | 373| afterAll | 测试套级别的清理条件,在所有测试用例结束后执行且仅执行一次,支持一个参数:清理动作函数。 | 可选 | 374| beforeEach | 测试用例级别的预置条件,在每条测试用例开始前执行,执行次数与 it 定义的测试用例数一致,支持一个参数:预置动作函数。 | 可选 | 375| afterEach | 测试用例级别的清理条件,在每条测试用例结束后执行,执行次数与 it 定义的测试用例数一致,支持一个参数:清理动作函数。 | 可选 | 376| describe | 定义一个测试套,支持两个参数:测试套名称和测试套函数; describe 支持嵌套,每个 describe 内均可以定义 beforeAll 、beforeEach 、afterEach 和 afterAll。 | 必选 | 377| it | 定义一条测试用例,支持三个参数:用例名称,过滤参数和用例函数<br/>备注:<br/>**过滤参数**:过滤参数为一个 32 位的 Int 类型参数,0 位 置1表示不筛选、默认执行;0-10 位 置1表示测试用例类型;16-18 位 置1表示测试用例规模;24-28 位 置1表示测试层级。<br/>**测试用例类型**:置位0-10分别表示:FUNCTION 方法类测试、PERFORMANCE 性能类测试、POWER 功耗类测试、RELIABILITY 可靠性测试、SECURITY 安全合规测试、GLOBAL 整体性测试、COMPATIBILITY 兼容性测试、USER 用户测试、STANDARD 标准测试、SAFETY 安全特性测试、RESILIENCE 压力测试。<br/>**测试用例规模**:置位16-18分别表示:SMALL 小型测试、MEDIUM 中型测试、LARGE 大型测试。<br/>**测试层级**:置位24-28分别表示:LEVEL0-0 级测试、LEVEL1-1 级测试、LEVEL2-2 级测试、LEVEL3-3 级测试、LEVEL4-4 级测试。 | 必选 | 378 379用例编写语法采用 jasmine 的标准语法,格式支持ES6格式。 380 3811. 规范用例目录:测试用例存储到entry/src/main/js/test目录。 382 383 ``` 384 ├── BUILD.gn 385 │ └──entry 386 │ │ └──src 387 │ │ │ └──main 388 │ │ │ │ └──js 389 │ │ │ │ │ └──default 390 │ │ │ │ │ │ └──pages 391 │ │ │ │ │ │ │ └──index 392 │ │ │ │ │ │ │ │ └──index.js # 入口文件。 393 │ │ │ │ │ └──test # 测试代码存放目录。 394 │ │ │ └── resources # hap资源存放目录。 395 │ │ │ └── config.json # hap配置文件。 396 ``` 397 3982. index.js示例。 399 400 ``` 401 // 拉起js测试框架,加载测试用例。 402 import {Core, ExpectExtend} from 'deccjsunit/index' 403 404 export default { 405 data: { 406 title: "" 407 }, 408 onInit() { 409 this.title = this.$t('strings.world'); 410 }, 411 onShow() { 412 console.info('onShow finish') 413 const core = Core.getInstance() 414 const expectExtend = new ExpectExtend({ 415 'id': 'extend' 416 }) 417 core.addService('expect', expectExtend) 418 core.init() 419 const configService = core.getDefaultService('config') 420 configService.setConfig(this) 421 require('../../../test/List.test') 422 core.execute() 423 }, 424 onReady() { 425 }, 426 } 427 ``` 428 4293. 单元测试用例示例。 430 431 ``` 432 // Example1: 使用HJSUnit进行单元测试。 433 describe('appInfoTest', function () { 434 it('app_info_test_001', 0, function () { 435 var info = app.getInfo() 436 expect(info.versionName).assertEqual('1.0') 437 expect(info.versionCode).assertEqual('3') 438 }) 439 }) 440 ``` 441 442### JS语言用例编译打包指导(适用于标准系统) 443 444hap包编译请参考[标准系统js应用开发指导](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/build_overview-0000001055075201)。 445 446 447## 全量编译指导(适用于标准系统) 448 4491. 全量编译。 450 **命令**: 451 452 453 ``` 454 ./build.sh suite=acts system_size=standard 455 ``` 456 457 **测试用例输出目录**:out/release/suites/acts/testcases 458 459 **测试框架&用例整体输出目录**:out/release/suites/acts(编译用例时会同步编译测试套执行框架) 460 461 462## 全量用例执行指导(适用于小型系统、标准系统) 463 464**搭建测试环境** 465 466Windows工作台下安装python3.7及以上版本,确保工作台和测试设备正常连接。 467 468 **测试执行目录**(对应编译生成的out/release/suites/acts目录) 469 470``` 471├── testcase # 测试套文件存放目录。 472│ └──xxx.hap # 测试套可执行hap文件。 473│ └──xxx.json # 测试套对应执行配置文件。 474├── tools # 测试框架工具目录。 475├── run.bat # window平台测试套启动执行文件。 476├── report # 测试报告生成目录。 477``` 478 479**用例执行** 480 4811. 在Windows工作台上,找到从Linux服务器上拷贝下来的测试套件用例目录(对应编译生成的out/release/suites/acts目录),在Windows命令窗口进入对应目录,直接执行acts\run.bat。 482 4832. 界面启动后,输入用例执行指令。 484 - 全量执行。 485 486 ``` 487 run acts 488 ``` 489 490 **图1** 运行进程 491 492  493 494 - 模块执行(具体模块可以查看\acts\testcases\)。 495 496 ``` 497 run –l ActsSamgrTest 498 ``` 499 500 **图2** 查看运行命令 501 502  503 504 等待执行完成。 505 5063. 查看测试报告。 507 进入acts\reports\,获取当前的执行记录,打开“summary_report.html”可以获取到测试报告。 508