• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.gn177
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_standard219
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.gn311
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/>**过滤参数**:过滤参数为一个&nbsp;32&nbsp;位的&nbsp;Int&nbsp;类型参数,0&nbsp;位&nbsp;置1表示不筛选、默认执行;0-10&nbsp;位&nbsp;置1表示测试用例类型;16-18&nbsp;位&nbsp;置1表示测试用例规模;24-28&nbsp;位&nbsp;置1表示测试层级。<br/>**测试用例类型**:置位0-10分别表示:FUNCTION&nbsp;方法类测试、PERFORMANCE&nbsp;性能类测试、POWER&nbsp;功耗类测试、RELIABILITY&nbsp;可靠性测试、SECURITY&nbsp;安全合规测试、GLOBAL&nbsp;整体性测试、COMPATIBILITY&nbsp;兼容性测试、USER&nbsp;用户测试、STANDARD&nbsp;标准测试、SAFETY&nbsp;安全特性测试,RESILIENCE&nbsp;压力测试。<br/>**测试用例规模**:置位16-18分别表示:SMALL&nbsp;小型测试、MEDIUM&nbsp;中型测试、LARGE&nbsp;大型测试。<br/>**测试层级**:置位24-28分别表示:LEVEL0-0&nbsp;级测试、LEVEL1-1&nbsp;级测试、LEVEL2-2&nbsp;级测试、LEVEL3-3&nbsp;级测试、LEVEL4-4&nbsp;级测试。 | 必选 |
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   **测试框架&amp;用例整体输出目录**: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.bat480
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