1# xDevice测试调度执行框架使用指南
2
3
4## 概述
5
6OpenHarmony开源操作系统有众多芯片场景基于其之上进行开发版本等相关产品的开发,为了保障OpenHarmony生态的兼容性,OpenHarmony提供了[兼容性测试测评服务](https://www.openharmony.cn/certification/document/guid),其中针对产品需要进行接口相关的测试执行验证,但是大量自动化用例的执行需要一套调度执行框架,并且支持生成可视化的测试报告等能力,故我们设计并开发了xdevice测试调度框架来支持该场景。
7
8### 简介
9
10xDevice测试调度框架是OpenHarmony中测试基础设施的核心组件,提供调度自动化用例执行所依赖的相关服务,支持大量自动化用例的调度执行能力,并可自带生成可视化测试报告。而xDevice二进制包会跟踪随OpenHarmony的XTS套件编译,开发者可以从XTS套件归档路径中获取xDevice工具,
11
12根据设备类型的不同,xDevice主要测试的任务场景有以下三个:
13
14- 对轻量系统设备进行XTS测试(如:Hi3861开发板)
15- 对小型系统设备进行XTS测试(如:Hi3516开发板)
16- 对标准系统设备进行XTS测试(如:RK3568开发板)
17
18### 实现原理
19
20xDevice包括以下功能模块:
21
22- command:用户与测试平台命令行交互模块,提供用户输入命令解析,命令处理。
23- config:测试框架配置模块,提供测试平台串口连接方式和USB连接方式的不同配置选项。
24- driver:测试用例执行器,提供测试用例分发,执行,结果收集等主要测试步骤定义。
25- report:测试报告模块,提供测试结果解析和测试报告生成。
26- scheduler:测试框架调度模块,提供不同类型的测试执行器调度的调度功能。
27- environment:测试框架的环境配置模块,提供设备发现,设备管理的功能。
28- testkit:测试框架工具模块,提供json解析,网络文件挂载等操作。
29- log:测试框架日志模块,提供记录任务日志以及设备日志的功能。
30
31除了上述功能模块之外,测试调度框架还依赖了用户自定义配置文件,配置文件主要分为两类。
32
33**测试任务配置文件**
34
35user_config.xml是框架提供的测试任务配置文件,用户可以根据自身环境信息配置相关内容,主要包括以下配置内容。
36
37environment环境相关配置,详解介绍如下。
38
39```xml
40<environment>
41
42 <!-- 富设备配置 -->
43<device type="usb-hdc">  <!-- type:设备连接方式,usb-hdc表示使用hdc控制设备(默认),当前框架只支持设置一个usb设备 -->
44    <ip></ip>        <!-- ip: 远端设备地址,ip和port为空时使用本地设备,非空时使用远端设备 -->
45    <port></port>    <!-- port: 远端设备端口号 -->
46    <sn></sn>        <!-- sn: 设备串号列表,串号之间使用分号;分隔,sn为空时使用本地所有设备,非空时使用指定的sn设备 -->
47</device>
48
49<!-- 轻量系统设备配置 -->
50<device type="com" label="wifiiot">    <!-- type: 设备连接方式,com表示连接方式是串口; label: 表示设备种类,如wifiiot -->
51    <serial>                           <!-- serial:  表示一个串口定义 -->
52        <com></com>                    <!-- com: 表示本地连接的串口,如COM20 -->
53        <type>cmd</type>               <!-- type 表示串口类型,cmd是命令串口 -->
54        <baud_rate>115200</baud_rate>  <!-- baud_rate、data_bits、stop_bits、timeout: 为串口波特率等串口参数 ,一般采用默认值即可 -->
55        <data_bits>8</data_bits>
56        <stop_bits>1</stop_bits>
57        <timeout>20</timeout>
58    </serial>
59    <serial>
60        <com></com>
61        <type>deploy</type>            <!-- type 表示串口类型,deploy是刷机串口 -->
62        <baud_rate>115200</baud_rate>
63    </serial>
64</device>
65
66<!-- 小型系统设备本地连接配置 -->
67<device type="com" label="ipcamera">
68    <serial>
69        <com></com>
70        <type>cmd</type>
71        <baud_rate>115200</baud_rate>
72        <data_bits>8</data_bits>
73        <stop_bits>1</stop_bits>
74        <timeout>1</timeout>
75    </serial>
76</device>
77
78<!-- 小型系统设备远端连接配置,可配置多个 -->
79<device type="com" label="ipcamera">
80    <ip></ip>
81    <port></port>
82</device>
83</environment>
84```
85
86测试用例目录设置。
87
88```xml
89<testcases>
90  <!-- dir标签和server标签同时配置时只有一个会起作用 -->
91  <!-- 指定测试用例目录,为空则默认设置为当前项目下的testcase文件夹 -->
92  <dir></dir>
93
94  <!-- nfs挂载配置,label取值为NfsServer -->
95  <server label="NfsServer">
96      <ip></ip>             <!-- 挂载环境IP地址 -->
97      <port></port>         <!-- 挂载环境端口 -->
98      <dir></dir>           <!-- 对应挂载的外部路径 -->
99      <username></username> <!-- 登录用户名 -->
100      <password></password> <!-- 登录用户密码 -->
101      <remote></remote>     <!-- nfs服务器与xDevice执行机不在同一台机器时,remote配置为true,否则为false -->
102  </server>
103</testcases>
104```
105
106资源目录设置。
107
108```xml
109<resource>
110  <!-- 指定资源目录,为空则默认设置为当前项目下的resource文件夹 -->
111  <dir></dir>
112</resource>
113```
114
115日志打印级别设置。
116
117```xml
118<!-- 默认为INFO,如需更加详细的信息可切换为DEBUG -->
119<loglevel>INFO</loglevel>
120```
121
122**测试套配置文件**
123
124设备执行的测试支撑套件是由测试配置文件所指定。
125
126每个测试套都都有一个测试配置文件,主要配置了需要使用的测试支撑套件(kits)等信息,并支持配置执行预制和清理操作。
127
128以下为配置文件样例。
129
130```json
131{
132    // 测试支撑套件描述
133    "description": "Configuration for aceceshi Tests",
134
135    // 指定执行当前测试支撑套的设备
136    "environment": {
137        "type": "device",
138        "label": "wifiiot"
139    },
140
141    // 指定设备执行的驱动
142    "driver": {
143        "type": "OHJSUnitTest",
144        "test-timeout": "700000",
145        "bundle-name": "com.open.harmony.acetestfive",
146        "package-name": "com.open.harmony.acetestfive",
147        "shell-timeout": "700000"
148    },
149    // kit的作用主要是为了支撑测试执行活动,在测试前执行预制操作(Setup),在测试后执行清理操作(Teardown)
150    "kits": [
151       {
152            "type": "ShellKit",
153            "run-command": [
154                "remount",
155                "mkdir /data/data/resource",
156                "chmod -R 777 /data/data/resource",
157                "settings put secure adb_install_need_confirm 0"
158            ],
159            "teardown-command": [
160                "remount",
161                "rm -rf /data/data/resource"
162            ]
163        },
164    ]
165}
166```
167
168### 测试命令
169
170测试命令可以分为三组:help、list、run。在指令序列中,以run为最常用的执行指令。
171
172------
173
174输入help指令可以查询框架指令帮助信息。
175
176```text
177help:
178     use help to get information.
179usage:
180     run:  Display a list of supported run command.
181     list: Display a list of supported device and task record.
182Examples:
183     help run
184     help list
185```
186
187**说明:**
188
189help run:展示run指令相关说明 。
190
191help list:展示 list指令相关说明。
192
193------
194
195list指令用来展示设备和相关的任务信息。
196
197```text
198list:
199     This command is used to display device list and task record.
200usage:
201      list
202      list history
203      list <id>
204Introduction:
205     list:         display device list
206     list history: display history record of a serial of tasks
207     list <id>:    display history record about task what contains specific id
208Examples:
209     list
210     list history
211     list 6e****90
212```
213
214 **说明:**
215
216 list: 展示设备信息。
217
218 list history: 展示任务历史信息 。
219
220 list <id>: 展示特定id的任务其历史信息。
221
222------
223
224run指令主要用于执行测试任务。
225
226```text
227run:
228     This command is used to execute the selected testcases.
229     It includes a series of processes such as use case compilation, execution, and result collection.
230usage: run [-l TESTLIST [TESTLIST ...] | -tf TESTFILE
231            [TESTFILE ...]] [-tc TESTCASE] [-c CONFIG] [-sn DEVICE_SN]
232            [-rp REPORT_PATH [REPORT_PATH ...]]
233            [-respath RESOURCE_PATH [RESOURCE_PATH ...]]
234            [-tcpath TESTCASES_PATH [TESTCASES_PATH ...]]
235            [-ta TESTARGS [TESTARGS ...]] [-pt]
236            [-env TEST_ENVIRONMENT [TEST_ENVIRONMENT ...]]
237            [-e EXECTYPE] [-t [TESTTYPE [TESTTYPE ...]]]
238            [-td TESTDRIVER] [-tl TESTLEVEL] [-bv BUILD_VARIANT]
239            [-cov COVERAGE] [--retry RETRY] [--session SESSION]
240            [--dryrun] [--reboot-per-module] [--check-device]
241            [--repeat REPEAT]
242            action task
243Specify tests to run.
244  positional arguments:
245   action                Specify action
246   task                  Specify task name,such as "ssts", "acts", "hits"
247```
248
249run指令基本使用方法如下。
250
251| xDevice命令  |                             功能                             |                             示例                             |
252| :----------: | :----------------------------------------------------------: | :----------------------------------------------------------: |
253|   run xts    |       运行所有指定类型的XTS模块,如acts,hits,ssys等        |                           run acts                           |
254|  run -l xxx  |            运行指定的模块测试套,模块间用分号隔离            |           run -l ActsWifiServiceTest;ActsLwipTest            |
255|   run -sn    |            指定运行设备的SN号,多个SN号用分号隔离            | run acts -sn 10.117.183.37:17001<br/>run acts -sn 88Y02******57723;VEG02******16642 |
256|   run -rp    | 指定报告生成的路径,默认会在工作目录的reports下用时间戳或任务ID建立子目录 | run acts -rp /suites/hits/xdevice_reports/2020.09.28-14.21.26 |
257| run -respath |             指定测试资源路径,默认为resource目录             | run acts -respath /cloud/zidane/xts/release/suites/resource  |
258|   run -ta    | 指定模块运行参数,可以指定运行模块用例中指定的用例,多个用例用逗号隔离,目前支持JS驱动测试套 | run acts -ta class:ohos.hardware.soundtrigger.SoundTriggerTest#testKeyphraseParcelUnparcel_noUsers |
259| run --retry  |        重新运行上一次任务的失败用例,生成新的测试报告        | run –retryrun --retry --session 2020-10-30-17-15-11(任务目录名) |
260
261### 测试报告
262
263框架执行run指令,控制台会输出对应的log打印,还会生成对应的执行结果报告。如果使用了-rp参数指定报告路径,那么报告就会生成在指定的路径下。否则报告会存放在默认目录。
264
265```text
266当前报告目录(默认目录/指定目录)
267    ├── result(模块执行结果存放目录)
268    │     ├── <模块名>.xml
269    │     ├──  ... ...
270271    ├── log (设备和任务运行log存放目录)
272    │     ├── <设备1>.log
273    │     ├── ... ...
274    │     ├── <任务>.log
275    ├── summary_report.xml(任务汇总数据报告)
276    ├── summary_report.html(任务汇总可视化报告)
277    ├── details_report.html(用例执性可视化报告)
278    ├── failures_report.html(失败用例可视化报告,无失败用例时不生成)
279    ├── summary.ini(记录测试类型,使用的设备,开始和结束时间等信息)
280    ├── task_info.record(记录执行命令,失败用例清单等信息)
281    ├── xxxx.zip(对上述文件进行压缩得到的压缩文件)
282    ├── summary_report.hash(对压缩文件进行sha256加密得到的文件)
283    └── ... ...
284```
285
286
287## 环境准备
288
289
290### 环境要求
291
292- python版本>=3.7
293- pyserial>=3.3
294- paramiko>=2.7.1
295- rsa>=4.0
296
297
298### 安装xDevice
299
300- 安装基础框架xDevice。
301
302  1. 进入xDevice根目录。
303
304     ```bash
305     cd testfwk_xdevice
306     ```
307
308  2. 打开控制台,执行如下命令。
309
310     ```bash
311     python setup.py install
312     ```
313
314- 安装OpenHarmony驱动插件ohos。
315
316  1. 进行plugin/ohos目录。
317
318     ```bash
319     cd testfwk_xdevice/plugin/ohos
320     ```
321
322  2. 打开控制台,当前用户下执行如下命令。
323
324     ```bash
325     python setup.py install
326     ```
327
328### 检验环境是否搭建成功
329
330检验xDevice是否安装成功。
331
3321. 进入xDevice根目录。
333
334   ```bash
335   cd testfwk_xdevice
336   ```
337
3382. 打开控制台,执行如下命令。
339
340   ```bash
341   python -m pip list
342   ```
343
3443. 查看是否已经成功安装**xdevice**以及**xdevice-ohos**两个库。
345
346   ```text
347   xdevice                 0.0.0
348   xdevice-ohos            0.0.0
349   ```
350
351查看xDevice工具是否能够正常运行。
352
3531. 进入xDevice根目录。
354
355   ```bash
356   cd testfwk_xdevice
357   ```
358
3592. 打开控制台,执行如下命令。
360
361   ```bash
362   python -m xdevice
363   ```
364
3653. 查看控制台是否正常输出如下信息。
366
367   ```text
368   [2022-10-13 15:43:31,284] [30076] [Main] [INFO] [*************** xDevice Test Framework 2.11.0.1091 Starting ***************]
369   [2022-10-13 15:43:31,286] [30076] [ManagerLite] [WARNING] [wifiiot local com cannot be empty, please check]
370   [2022-10-13 15:43:31,286] [30076] [ManagerLite] [WARNING] [ipcamera local com cannot be empty, please check]
371   [2022-10-13 15:43:31,287] [30076] [ManagerLite] [WARNING] [device com or ip cannot be empty, please check]
372   >>>
373   ```
374
375
376## 轻量系统设备XTS测试指导(wifiiot)
377
3781. 识别串口用途,修改根目录中的user_config.xml文件。
379
380   type为cmd的com口对应板子上的AT命令串口,用于对设备发送指令,示例中配置为ChA(COM20)串口号。
381
382   type为deploy的com口对应板子上的日志输出串口,用于镜像烧录和日志打印,示例中配置为ChB(COM18)串口号。
383
384   若AT命令串口和日志输出串口共用,可以配置为相同,即user_config中的type为cmd的com口与type为deploy的com口可配置为一样的端口,如COM18。
385
386   ![轻量系统设备-1](figures/L0-1.PNG)
387
388   user_config.xml的修改示例如下。
389
390   ```xml
391   <user_config>
392       <environment>
393           <device type="com" label="wifiiot">
394               <serial>
395                   <com>com20</com>
396                   <type>cmd</type>
397                   <baud_rate>115200</baud_rate>
398                   <data_bits>8</data_bits>
399                   <stop_bits>1</stop_bits>
400                   <timeout>20</timeout>
401               </serial>
402               <serial>
403                   <com>com18</com>
404                   <type>deploy</type>
405                   <baud_rate>115200</baud_rate>
406               </serial>
407           </device>
408       </environment>
409       <testcases>
410           <dir></dir>
411           <server label="NfsServer">
412               <ip></ip>
413               <port></port>
414               <dir></dir>
415               <username></username>
416               <password></password>
417               <remote></remote>
418           </server>
419       </testcases>
420       <resource>
421           <dir></dir>
422       </resource>
423       <loglevel>DEBUG</loglevel>
424   </user_config>
425   ```
426
4272. 在xDevice根目录下新建testcase文件夹用于存放测试套文件,具体XTS测试套从系统构建的每日构建中获取。
428
429   每日构建:http://ci.openharmony.cn/dailys/dailybuilds
430
431   测试套测试配置文件json,示例如下。
432
433   ```json
434   {
435   	"description": "Config for ActsAllTest test cases",
436   	"environment": [
437   		{
438   			"type": "device",
439   			"label": "wifiiot"
440   		}
441   	],
442   	"kits": [
443   		{
444   			"type": "DeployKit",
445   			"timeout": "20000",
446   			"burn_file": "acts/Hi3861_wifiiot_app_allinone.bin"
447   		}
448   	],
449   	"driver": {
450   		"type": "CTestLite"
451   	}
452   }
453   ```
454
4553. 执行用例
456
457   进入xDevice根目录;打开控制台进入xDevice控制台,执行如下命令。
458
459   ```bash
460   python -m xdevice
461   ```
462
463   执行测试套命令。
464
465   ```text
466   run -l ActsAllTest
467   ```
468
469   执行结果如下。
470
471   ![result-1](figures/result-1.PNG)
472
473## 小型系统设备XTS测试指导(ipcamera)
474
4751. 识别串口用途。
476
477   type为cmd的com口对应板子上的AT命令串口,用于对设备发送指令,示例中配置为ChA(COM20)串口号。
478
479   ![小型系统设备-1](figures/L0-1.PNG)
480
481   ipcamera设备有两种连接方式,一种是本地串口连接,一种是通过局域网ip连接。
482
4832. 配置NFS服务器
484
485   NFS挂载方式有两种,一种是远程PC挂载方式,一种是本地局域网挂载方式。
486
487   本地局域网NFS服务的配置方法如下。
488
489   1. 下载安装NFS服务器。下载地址:https://www.hanewin.net/nfs-e.htm
490
491   2. 配置输出->编辑输出表文件。
492
493      ![](figures/NFS-1.PNG)
494
495   3. 添加路径NFS共享路径(如:D:\HS\NFS_Share_File -public –alldirs),这里要注意ftp的IP地址192.168.1.10为开发板的IP。
496
497      ![](figures/NFS-2.PNG)
498
499   4. 停止NFS服务器->重启运行NFS服务器使刚才添加的共享路径生效。
500
501   5. 找到ipcamera设备在PC上面映射的网口:控制面板->网络和Internet->网络共享中心->以太网状态->以太网属性->手动设置IP地址为:192.168.1.11。
502
503      ![](figures/NFS-3.PNG)
504
5053. 修改根目录中的user_config.xml文件,示例如下。
506
507   ```xml
508   <user_config>
509       <environment>
510           <device type="com" label="ipcamera">     <!--两种方式二选一:本地连接方式-->
511               <serial>
512                   <com>com20</com>
513                   <type>cmd</type>
514                   <baud_rate>115200</baud_rate>
515                   <data_bits>8</data_bits>
516                   <stop_bits>1</stop_bits>
517                   <timeout>1</timeout>
518               </serial>
519           </device>
520           <device type="com" label="ipcamera">     <!--两种方式二选一:局域网连接方式-->
521               <ip>10.176.49.47</ip>
522               <port>10003</port>
523           </device>
524       </environment>
525       <testcases>
526           <dir></dir>
527           <server label="NfsServer">               <!--两种方式二选一:远程挂载方式-->
528               <ip>10.176.48.202</ip>
529               <port>1022</port>
530               <dir>/data/data/local/</dir>
531               <username>root</username>
532               <password>xxx</password>
533               <remote>true</remote>
534           </server>
535           <server label="NfsServer">               <!--两种方式二选一:局域网挂载方式-->
536               <ip>192.168.1.11</ip>
537               <port>2049</port>
538               <dir>D:\test</dir>
539               <remote>false</remote>
540           </server>
541       </testcases>
542       <resource>
543           <dir></dir>
544       </resource>
545       <loglevel>DEBUG</loglevel>
546   </user_config>
547   ```
548
5494. 在xDevice根目录下新建testcase文件夹用于存放测试套文件,具体XTS测试套从系统构建的每日构建。
550
551   每日构建:http://ci.openharmony.cn/dailys/dailybuilds
552
553   测试套测试配置文件json,示例如下。
554
555   ```json
556   {
557   	"description": "Config for kernel test cases",
558   	"environment": [
559   		{
560   			"type": "device",
561   			"label": "ipcamera"
562   		}
563   	],
564   	"kits": [
565   		{
566   			"type": "MountKit",
567               "server": "NfsServer",
568               "mount": [
569                   {
570                       "source": "testcases/kernel",
571                       "target": "/test_root/kernel"
572                   }
573               ]
574   		}
575   	],
576   	"driver": {
577   		"type": "CppTestLite",
578           "excute": "/test_root/kernel/ActsKernelIPCTest.bin"
579   	}
580   }
581   ```
582
5835. 执行用例。
584
585   进入xDevice根目录,打开控制台进入xDevice控制台,执行如下命令。
586
587   ```bash
588   python -m xdevice
589   ```
590
591   执行测试套命令。
592
593   ```text
594   run -l kernel
595   ```
596
597   执行结果如下。
598
599   ![result-1](figures/result-1.PNG)
600
601## 标准系统设备XTS测试指导(RK3568)
602
6031. 配置hdc工具,从每日构建上下载ohos_sdk最新版本即可。
604
605   每日构建地址:http://ci.openharmony.cn/dailys/dailybuilds
606
607   下载工具后,把hdc配置到环境变量中,配置方法:右键单击我的电脑->属性->高级系统设置->环境变量->Path。
608
6092. 执行如下命令查看设备是否正常连接。
610
611   ```bash
612   hdc_std list targets
613   ```
614
6153. 修改user_config.xml文件,示例如下。
616
617   ```xml
618   <user_config>
619       <environment>
620           <device type="usb-hdc">
621               <ip></ip>
622               <port></port>
623               <sn>xxx;xxx</sn>                          <!--连接多个设备的SN号用分号分割-->
624           </device>
625       </environment>
626       <testcases>
627           <dir></dir>
628       </testcases>
629       <resource>
630           <dir></dir>
631       </resource>
632       <loglevel>DEBUG</loglevel>
633   </user_config>
634   ```
635
6364. 在xDevice根目录下新建testcase文件夹用于存放测试套文件,具体XTS测试套从系统构建的每日构建中获取。
637
638   每日构建:http://ci.openharmony.cn/dailys/dailybuilds
639
640   测试套测试配置文件json,示例如下。
641
642   ```json
643   {
644       "description": "Configuration for hjunit demo Tests",
645       "driver": {
646           "type": "OHJSUnitTest",
647           "test-timeout": "180000",
648           "bundle-name": "ohos.acts.bundle.stage.test",
649           "module-name": "phone",
650           "shell-timeout": "600000",
651           "testcase-timeout": 70000
652       },
653       "kits": [
654           {
655               "test-file-name": [
656                   "ActBmsStageEtsTest.hap"
657               ],
658               "type": "AppInstallKit",
659               "cleanup-apps": true
660           },
661           {
662               "type": "ShellKit",
663               "teardown-command":[
664                   "bm uninstall -n ohos.acts.bundle.stage.test"
665               ]
666           }
667       ]
668   }
669   ```
670
6715. 执行用例。
672
673   进入xDevice根目录,打开控制台进入xDevice控制台,执行如下命令。
674
675   ```bash
676   python -m xdevice
677   ```
678
679   执行测试套命令。
680
681   ```text
682   run -l ActBmsStageEtsTest
683   ```
684
685   执行结果如下。
686
687   ![result-1](figures/result-1.PNG)
688
689## 常见问题
690
691### hdc list targets能查找到设备,但xDevice识别不到设备。
692
693**问题描述**
694
695出现如下错误。
696
697![FAQ-1](figures/FAQ-1.PNG)
698
699**可能原因**
700
701环境变量中曾设置过HDC_SERVER_PORT变量修改过hdc的端口,由于xDevice默认需要使用8710端口,若曾修改过该端口会导致xDevice框架无法识别设备。
702
703**解决方法**
704
705检查是否有设置HDC_SERVER_PROT变量,若有设置,请把该端口的值修改为8710,然后重启xDevice即可。
706
707