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 > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** 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 每个测试模块目录下新建BUILD.gn编译文件,用于指定编译后可执行文件的名称、依赖的头文件、依赖的库等;具体写法如下。每个测试模块将独立编译成.bin可执行文件, 该文件可直接push到单板上进行测试。 286 287 举例: 288 289 ``` 290 import("//test/xts/tools/lite/build/suite_lite.gni") 291 hcpptest_suite("ActsDemoTest") { 292 suite_name = "acts" 293 sources = [ 294 "src/TestDemo.cpp" 295 ] 296 297 include_dirs = [ 298 "src", 299 ... 300 ] 301 deps = [ 302 ... 303 ] 304 cflags = [ "-Wno-error" ] 305 } 306 307 ``` 308 3094. acts目录下增加编译选项(BUILD.gn)样例: 310 将测试模块加入到acts目录下的编译脚本中,编译脚本为:test/xts/acts/build_lite/BUILD.gn。 311 312 313 ``` 314 lite_component("acts") { 315 ... 316 else if(board_name == "liteos_a") { 317 features += [ 318 ... 319 "//xts/acts/subsystem_lite/module_posix:ActsDemoTest" 320 ] 321 } 322 } 323 ``` 324 3255. 测试套件编译命令。 326 随版本编译,debug版本编译时会同步编译acts测试套件 327 > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** 328 > 小型系统acts独立编译成可执行文件(bin格式), 在编译产物的suites\acts目录下归档。 329 330 331### C++语言用例执行指导(适用于小型系统、标准系统用例开发) 332 333**示例:小型系统测试用例执行** 334 335目前的用例执行采用nfs共享的方式,mount到单板去执行。 336 337**环境搭建** 338 3391. 使用有限网线或无线将开发板与PC进行连接。 340 3412. 开发板配置IP、子网掩码、网关,确保开发板与PC处于同一个网段。 342 3433. PC安装nfs服务器并完成注册,启动nfs服务。 344 3454. 开发板配置mount命令,确保开发板可以访问PC端的nfs共享文件。 346 格式:mount [nfs服务器IP]:[/nfs共享目录] [/开发板目录] nfs 347 348 举例: 349 350 ``` 351 mount 192.168.1.10:/nfs /nfs nfs 352 ``` 353 354**用例执行** 355 356测试套件执行 ActsDemoTest.bin 触发用例执行,基于串口打印日志进行分析。 357 358### JS语言用例开发指导(适用于标准系统) 359 360当前使用的测试框架是HJSUnit,用于支撑OpenHarmony application测试(特指基于JS应用框架使用 Javascript 语言开发的 APP)进行自动化测试。 361 362**用例编写基础语法** 363 364测试用例为 js 语言,必须满足 JavaScript 语言编程规范: 365 366 **表7** 用例编写基础语法 367 368| 用例语法 | 描述 | 要求 | 369| -------- | -------- | -------- | 370| beforeAll | 测试套级别的预置条件,在所有测试用例开始前执行且仅执行一次,支持一个参数:预置动作函数 | 可选 | 371| afterAll | 测试套级别的清理条件,在所有测试用例结束后执行且仅执行一次,支持一个参数:清理动作函数 | 可选 | 372| beforeEach | 测试用例级别的预置条件,在每条测试用例开始前执行,执行次数与 it 定义的测试用例数一致,支持一个参数:预置动作函数 | 可选 | 373| afterEach | 测试用例级别的清理条件,在每条测试用例结束后执行,执行次数与 it 定义的测试用例数一致,支持一个参数:清理动作函数 | 可选 | 374| describe | 定义一个测试套,支持两个参数:测试套名称和测试套函数; describe 支持嵌套,每个 describe 内均可以定义 beforeAll 、beforeEach 、afterEach 和 afterAll | 必选 | 375| 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 级测试。 | 必选 | 376 377用例编写语法采用 jasmine 的标准语法,格式支持ES6格式。 378 3791. 规范用例目录:测试用例存储到entry/src/main/js/test目录。 380 381 ``` 382 ├── BUILD.gn 383 │ └──entry 384 │ │ └──src 385 │ │ │ └──main 386 │ │ │ │ └──js 387 │ │ │ │ │ └──default 388 │ │ │ │ │ │ └──pages 389 │ │ │ │ │ │ │ └──index 390 │ │ │ │ │ │ │ │ └──index.js # 入口文件 391 │ │ │ │ │ └──test # 测试代码存放目录 392 │ │ │ └── resources # hap资源存放目录 393 │ │ │ └── config.json # hap配置文件 394 ``` 395 3962. index.js示例 397 398 ``` 399 // 拉起js测试框架,加载测试用例 400 import {Core, ExpectExtend} from 'deccjsunit/index' 401 402 export default { 403 data: { 404 title: "" 405 }, 406 onInit() { 407 this.title = this.$t('strings.world'); 408 }, 409 onShow() { 410 console.info('onShow finish') 411 const core = Core.getInstance() 412 const expectExtend = new ExpectExtend({ 413 'id': 'extend' 414 }) 415 core.addService('expect', expectExtend) 416 core.init() 417 const configService = core.getDefaultService('config') 418 configService.setConfig(this) 419 require('../../../test/List.test') 420 core.execute() 421 }, 422 onReady() { 423 }, 424 } 425 ``` 426 4273. 单元测试用例示例 428 429 ``` 430 // Example1: 使用HJSUnit进行单元测试 431 describe('appInfoTest', function () { 432 it('app_info_test_001', 0, function () { 433 var info = app.getInfo() 434 expect(info.versionName).assertEqual('1.0') 435 expect(info.versionCode).assertEqual('3') 436 }) 437 }) 438 ``` 439 440### JS语言用例编译打包指导(适用于标准系统) 441 442hap包编译请参考[标准系统js应用开发指导](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/build_overview-0000001055075201)。 443 444 445## 全量编译指导(适用于标准系统) 446 4471. 全量编译 448 **命令**: 449 450 451 ``` 452 ./build.sh suite=acts system_size=standard 453 ``` 454 455 **测试用例输出目录**:out/release/suites/acts/testcases 456 457 **测试框架&用例整体输出目录**:out/release/suites/acts(编译用例时会同步编译测试套执行框架) 458 459 460## 全量用例执行指导(适用于小型系统、标准系统) 461 462**搭建测试环境** 463 464Windows工作台下安装python3.7及以上版本,确保工作台和测试设备正常连接。 465 466 **测试执行目录**(对应编译生成的out/release/suites/acts目录) 467 468``` 469├── testcase # 测试套文件存放目录 470│ └──xxx.hap # 测试套可执行hap文件 471│ └──xxx.json # 测试套对应执行配置文件 472├── tools # 测试框架工具目录 473├── run.bat # window平台测试套启动执行文件 474├── report # 测试报告生成目录 475``` 476 477**用例执行** 478 4791. 在Windows工作台上,找到从Linux服务器上拷贝下来的测试套件用例目录(对应编译生成的out/release/suites/acts目录),在Windows命令窗口进入对应目录,直接执行acts\run.bat。 480 4812. 界面启动后,输入用例执行指令。 482 - 全量执行 483 484 ``` 485 run acts 486 ``` 487 488 **图1** 运行进程 489 490 ![zh-cn_image_0000001200230833](figures/zh-cn_image_0000001200230833.gif) 491 492 - 模块执行(具体模块可以查看\acts\testcases\) 493 494 ``` 495 run –l ActsSamgrTest 496 ``` 497 498 **图2** 查看运行命令 499 500 ![zh-cn_image_0000001154351160](figures/zh-cn_image_0000001154351160.jpg) 501 502 等待执行完成。 503 5043. 查看测试报告。 505 进入acts\reports\,获取当前的执行记录,打开“summary_report.html”可以获取到测试报告。 506