• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 开发自测试执行框架使用指南
2
3
4## 概述
5
6OpenHarmony为开发者提供了一套全面的开发自测试框架developer_test,作为OpenHarmony测试工具集的一部分,提供给开发者自测试使用。开发者可根据测试需求开发相关测试用例,开发阶段提前发现缺陷,大幅提高代码质量。
7
8本文从基础环境构建,用例开发,编译以及执行等方面介绍OpenHarmony开发自测试执行框架如何运行和使用。
9
10
11### 简介
12
13OpenHarmony系统开发人员在新增或修改代码之后,希望可以快速的验证修改代码的功能的正确性,而系统中已经存在了大量的已有功能的自动化测试用例,比如TDD用例或XTS用例等。开发者自测试执行框架目的就是为了提升开发者的自测试执行效率,方便开发人员可以快速便捷的执行指定的自动化测试用例,将测试活动左移到开发阶段。
14
15
16### 约束与限制
17
18- 框架使用时必须提前连接OpenHarmony设备方可执行测试用例。
19
20
21## 环境准备
22
23开发自测试框架依赖于python运行环境,python版本为3.7.5及以上版本,在使用测试框架之前可参阅以下方式进行配置。
24
25源码获取可[参考](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/sourcecode-acquire.md)26
27### 自测试框架基础环境依赖
28
29| 环境依赖          | 版本型号                                                     | 详细说明                                                     |
30| ----------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
31| 操作系统          | Ubuntu18.04及以上                                            | 代码编译环境                                                 |
32| Linux系统扩展组件 | libreadline-dev                                              | 命令行读取插件                                               |
33| python            | 3.7.5版本及以上                                              | 测试框架语言                                                 |
34| python插件        | pyserial 3.3及以上、paramiko2.7.1及以上、setuptools40.8.0及以上、rsa4.0及以上 | pserial:支持python的串口通信;paramiko:支持python使用SSH协议;setuptools:支持python方便创建和分发python包;rsa:支持python rsa加密 |
35| NFS Server        | haneWIN NFS Server 1.2.50及以上或者 NFS v4及以上             | 支持设备通过串口连接,使用轻量、小型设备                     |
36| HDC               | 1.1.0                                                        | 支持设备通过HDC连接                                          |
37
38
39
401. 安装Linux扩展组件readline,安装命令如下:
41
42    ```bash
43    sudo apt-get install libreadline-dev
44    ```
45    安装成功提示如下:
46    ```
47    Reading package lists... Done
48    Building dependency tree
49    Reading state information... Done
50    libreadline-dev is already the newest version (7.0-3).
51    0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded.
52    ```
53
542. 安装setuptools插件,安装命令如下:
55    ```bash
56    pip3 install setuptools
57    ```
58    安装成功提示如下:
59    ```
60    Requirement already satisfied: setuptools in d:\programs\python37\lib\site-packages (41.2.0)
61    ```
62
633. 安装paramiko插件,安装命令如下:
64    ```bash
65    pip3 install paramiko
66    ```
67    安装成功提示如下:
68    ```
69    Installing collected packages: pycparser, cffi, pynacl, bcrypt, cryptography, paramiko
70    Successfully installed bcrypt-3.2.0 cffi-1.14.4 cryptography-3.3.1 paramiko-2.7.2 pycparser-2.20 pynacl-1.4.0
71    ```
72
734. 安装python的rsa插件,安装命令如下:
74    ```bash
75    pip3 install rsa
76    ```
77    安装成功提示如下:
78    ```
79    Installing collected packages: pyasn1, rsa
80    Successfully installed pyasn1-0.4.8 rsa-4.7
81    ```
82
835. 安装串口插件pyserial,安装命令如下:
84    ```bash
85    pip3 install pyserial
86    ```
87    安装成功提示如下:
88    ```
89    Requirement already satisfied: pyserial in d:\programs\python37\lib\site-packages\pyserial-3.4-py3.7.egg (3.4)
90    ```
91
926. 如果设备仅支持串口输出测试结果,则需要安装NFS Server
93
94    > 针对小型或轻量设备
95
96    - Windows环境下安装,安装haneWIN NFS Server1.2.50软件包。
97    - Linux环境下安装,安装命令如下:
98    ```bash
99    sudo apt install nfs-kernel-server
100    ```
101    安装成功提示如下:
102    ```
103    Reading package lists... Done
104    Building dependency tree
105    Reading state information... Done
106    nfs-kernel-server is already the newest version (1:1.3.4-2.1ubuntu5.3).
107    0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded.
108    ```
109
1107. 如果设备支持HDC连接,则需要安装HDC工具,安装流程请参考[HDC-OpenHarmony设备连接器](https://gitee.com/openharmony/developtools_hdc/blob/master/README_zh.md)111
112
113### 环境依赖检查
114
115| 检查项                                             | 操作                                                | 满足环境                  |
116| -------------------------------------------------- | --------------------------------------------------- | ------------------------- |
117| 检查python安装成功                                 | 命令行窗口执行命令:python --version                | 版本不小于3.7.5即可       |
118| 检查python扩展插件安装成功                         | 打开test/developertest目录,执行start.batstart.sh | 可进入提示符“>>>”界面即可 |
119| 检查NFS Server启动状态(被测设备仅支持串口时检测) | 通过串口登录开发板,执行mount命令挂载NFS            | 可正常挂载文件目录即可    |
120| 检查HDC安装成功                                    | 命令行窗口执行命令:hdc_std -v                      | 版本不小于1.1.0即可       |
121
122
123## 编写测试用例
124
125本测试框架支持多种类型测试,针对不同测试类型提供了不同的用例编写模板以供参考。_
126
127**TDD测试(C++)**
128
129用例源文件命名规范
130
131测试用例源文件名称和测试套内容保持一致,文件命名采用全小写+下划线方式命名,以test结尾,具体格式为:[功能]_[子功能]_test,子功能支持向下细分。
132示例:
133```
134calculator_sub_test.cpp
135```
136
137用例示例
138```c++
139/*
140 * Copyright (c) 2021 XXXX Device Co., Ltd.
141 * Licensed under the Apache License, Version 2.0 (the "License");
142 * you may not use this file except in compliance with the License.
143 * You may obtain a copy of the License at
144 *
145 *     http://www.apache.org/licenses/LICENSE-2.0
146 *
147 * Unless required by applicable law or agreed to in writing, software
148 * distributed under the License is distributed on an "AS IS" BASIS,
149 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150 * See the License for the specific language governing permissions and
151 * limitations under the License.
152 */
153
154#include "calculator.h"
155#include <gtest/gtest.h>
156
157using namespace testing::ext;
158
159class CalculatorSubTest : public testing::Test {
160public:
161    static void SetUpTestCase(void);
162    static void TearDownTestCase(void);
163    void SetUp();
164    void TearDown();
165};
166
167void CalculatorSubTest::SetUpTestCase(void)
168{
169    // input testsuit setup step,setup invoked before all testcases
170}
171
172void CalculatorSubTest::TearDownTestCase(void)
173{
174    // input testsuit teardown step,teardown invoked after all testcases
175}
176
177void CalculatorSubTest::SetUp(void)
178{
179    // input testcase setup step,setup invoked before each testcases
180}
181
182void CalculatorSubTest::TearDown(void)
183{
184    // input testcase teardown step,teardown invoked after each testcases
185}
186
187/**
188 * @tc.name: integer_sub_001
189 * @tc.desc: Verify the sub function.
190 * @tc.type: FUNC
191 * @tc.require: issueNumber
192 */
193HWTEST_F(CalculatorSubTest, integer_sub_001, TestSize.Level1)
194{
195    // step 1:调用函数获取结果
196    int actual = Sub(4,0);
197
198    // Step 2:使用断言比较预期与实际结果
199    EXPECT_EQ(4, actual);
200}
201```
202详细内容介绍:
203
2041.添加测试用例文件头注释信息
205
206```
207/*
208 * Copyright (c) 2021 XXXX Device Co., Ltd.
209 * Licensed under the Apache License, Version 2.0 (the "License");
210 * you may not use this file except in compliance with the License.
211 * You may obtain a copy of the License at
212 *
213 *     http://www.apache.org/licenses/LICENSE-2.0
214 *
215 * Unless required by applicable law or agreed to in writing, software
216 * distributed under the License is distributed on an "AS IS" BASIS,
217 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
218 * See the License for the specific language governing permissions and
219 * limitations under the License.
220 */
221```
222
2232.引用测试框架头文件和命名空间
224
225```c++
226#include <gtest/gtest.h>
227
228using namespace testing::ext;
229```
230
2313.添加被测试类的头文件
232
233```c++
234#include "calculator.h"
235```
236
2374.定义测试套(测试类)
238
239```c++
240class CalculatorSubTest : public testing::Test {
241public:
242    static void SetUpTestCase(void);
243    static void TearDownTestCase(void);
244    void SetUp();
245    void TearDown();
246};
247
248void CalculatorSubTest::SetUpTestCase(void)
249{
250    // input testsuit setup step,setup invoked before all testcases
251}
252
253void CalculatorSubTest::TearDownTestCase(void)
254{
255    // input testsuit teardown step,teardown invoked after all testcases
256}
257
258void CalculatorSubTest::SetUp(void)
259{
260    // input testcase setup step,setup invoked before each testcases
261}
262
263void CalculatorSubTest::TearDown(void)
264{
265    // input testcase teardown step,teardown invoked after each testcases
266}==
267```
268> **注意:** 在定义测试套时,测试套名称应与编译目标保持一致,采用大驼峰风格。
269
2705.测试用例实现,包含用例注释和逻辑实现
271
272```c++
273/**
274 * @tc.name: integer_sub_001
275 * @tc.desc: Verify the sub function.
276 * @tc.type: FUNC
277 * @tc.require: issueNumber
278 */
279HWTEST_F(CalculatorSubTest, integer_sub_001, TestSize.Level1)
280{
281    //step 1:调用函数获取结果
282    int actual = Sub(4,0);
283
284    //Step 2:使用断言比较预期与实际结果
285    EXPECT_EQ(4, actual);
286}
287```
288> **注意:** @tc.require: 格式必须以AR/SR或issue开头: 如:issueI56WJ7
289
290在编写用例时,我们提供了三种用例模板供您选择。
291
292| 类型            | 描述                                             |
293| --------------- | ------------------------------------------------ |
294| HWTEST(A,B,C)   | 用例执行不依赖Setup&Teardown时,可选取           |
295| HWTEST_F(A,B,C) | 用例执行(不含参数)依赖于Setup&Teardown时,可选取 |
296| HWTEST_P(A,B,C) | 用例执行(含参数)依赖于Set&Teardown时,可选取     |
297
298其中,参数A,B,C的含义如下:
299
300- 参数A为测试套名。
301
302- 参数B为测试用例名,其命名必须遵循[功能点]_[编号]的格式,编号为3位数字,从001开始。
303
304- 参数C为测试用例等级,具体分为门禁level0 以及非门禁level1-level4共五个等级,其中非门禁level1-level4等级的具体选取规则为:测试用例功能越重要,level等级越低。
305
306
307**注意:**
308
309- 测试用例的预期结果必须有对应的断言。
310
311- 测试用例必须填写用例等级。
312
313- 测试体建议按照模板分步实现。
314
315- 用例描述信息按照标准格式@tc.xxx value书写,注释信息必须包含用例名称,用例描述,用例类型,需求编号四项。其中用例测试类型@tc.type参数的选取,可参考下表。
316
317
318| 测试类型名称 | 类型编码 |
319| ------------ | -------- |
320| 功能测试     | FUNC     |
321| 性能测试     | PERF     |
322| 可靠性测试   | RELI     |
323| 安全测试     | SECU     |
324| 模糊测试     | FUZZ     |
325
326**TDD测试(JS)**
327
328- 用例源文件命名规范
329
330
331测试用例原文件名称采用大驼峰风格,以TEST结尾,具体格式为:[功能][子功能]TEST,子功能支持向下细分。
332示例:
333```
334AppInfoTest.js
335```
336
337- 用例示例
338
339```js
340/*
341 * Copyright (C) 2021 XXXX Device Co., Ltd.
342 * Licensed under the Apache License, Version 2.0 (the "License");
343 * you may not use this file except in compliance with the License.
344 * You may obtain a copy of the License at
345 *
346 *     http://www.apache.org/licenses/LICENSE-2.0
347 *
348 * Unless required by applicable law or agreed to in writing, software
349 * distributed under the License is distributed on an "AS IS" BASIS,
350 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
351 * See the License for the specific language governing permissions and
352 * limitations under the License.
353 */
354import app from '@system.app'
355
356import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'
357
358describe("AppInfoTest", function () {
359    beforeAll(function() {
360        // input testsuit setup step,setup invoked before all testcases
361         console.info('beforeAll caled')
362    })
363
364    afterAll(function() {
365         // input testsuit teardown step,teardown invoked after all testcases
366         console.info('afterAll caled')
367    })
368
369    beforeEach(function() {
370        // input testcase setup step,setup invoked before each testcases
371         console.info('beforeEach caled')
372    })
373
374    afterEach(function() {
375        // input testcase teardown step,teardown invoked after each testcases
376         console.info('afterEach caled')
377    })
378
379    /*
380     * @tc.name:appInfoTest001
381     * @tc.desc:verify app info is not null
382     * @tc.type: FUNC
383     * @tc.require: issueNumber
384     */
385    it("appInfoTest001", 0, function () {
386        //step 1:调用函数获取结果
387        var info = app.getInfo()
388
389        //Step 2:使用断言比较预期与实际结果
390        expect(info != null).assertEqual(true)
391    })
392})
393```
394详细内容介绍:
3951. 添加测试用例文件头注释信息
396    ```
397	/*
398	 * Copyright (C) 2021 XXXX Device Co., Ltd.
399	 * Licensed under the Apache License, Version 2.0 (the "License");
400	 * you may not use this file except in compliance with the License.
401	 * You may obtain a copy of the License at
402	 *
403	 *     http://www.apache.org/licenses/LICENSE-2.0
404	 *
405	 * Unless required by applicable law or agreed to in writing, software
406	 * distributed under the License is distributed on an "AS IS" BASIS,
407	 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
408	 * See the License for the specific language governing permissions and
409	 * limitations under the License.
410	 */
411	```
4122. 导入被测api和jsunit测试库
413    ```js
414	import app from '@system.app'
415
416	import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'
417	```
4183. 定义测试套(测试类)
419    ```js
420	describe("AppInfoTest", function () {
421	    beforeAll(function() {
422	        // input testsuit setup step,setup invoked before all testcases
423	         console.info('beforeAll caled')
424	    })
425
426	    afterAll(function() {
427	         // input testsuit teardown step,teardown invoked after all testcases
428	         console.info('afterAll caled')
429	    })
430
431	    beforeEach(function() {
432	        // input testcase setup step,setup invoked before each testcases
433	         console.info('beforeEach caled')
434	    })
435
436	    afterEach(function() {
437	        // input testcase teardown step,teardown invoked after each testcases
438	         console.info('afterEach caled')
439	    })
440	```
4414. 测试用例实现
442    ```JS
443	/*
444	 * @tc.name:appInfoTest001
445	 * @tc.desc:verify app info is not null
446	 * @tc.type: FUNC
447	 * @tc.require: issueNumber
448	 */
449	 it("appInfoTest001", 0, function () {
450	    //step 1:调用函数获取结果
451        var info = app.getInfo()
452
453        //Step 2:使用断言比较预期与实际结果
454        expect(info != null).assertEqual(true)
455	 })
456	```
457	> **注意:** @tc.require: 格式必须以issue开头: 如:issueI56WJ7
458
459**Fuzz测试**
460
461[Fuzz用例编写规范](https://gitee.com/openharmony/testfwk_developer_test/blob/master/libs/fuzzlib/README_zh.md)
462
463
464**Benchmark测试**
465
466[Benchmark用例编写规范](https://gitee.com/openharmony/testfwk_developer_test/blob/master/libs/benchmark/README_zh.md)
467
468## 编译测试用例
469
470根据测试用例目录规划,当执行某一用例时,测试框架会根据编译文件逐层查找,最终找到所需用例进行编译。下面通过不同示例来讲解gn文件如何编写。
471
472**TDD测试**
473
474针对不同语言,下面提供不同的编译模板以供参考。
475
476- **C++用例编译配置示例**
477
478```
479# Copyright (c) 2021 XXXX Device Co., Ltd.
480
481import("//build/test.gni")
482
483module_output_path = "developertest/calculator"
484
485config("module_private_config") {
486  visibility = [ ":*" ]
487
488  include_dirs = [ "../../../include" ]
489}
490
491ohos_unittest("CalculatorSubTest") {
492  module_out_path = module_output_path
493
494  sources = [
495    "../../../include/calculator.h",
496    "../../../src/calculator.cpp",
497  ]
498
499  sources += [ "calculator_sub_test.cpp" ]
500
501  configs = [ ":module_private_config" ]
502
503  deps = [ "//third_party/googletest:gtest_main" ]
504}
505
506group("unittest") {
507  testonly = true
508  deps = [":CalculatorSubTest"]
509}
510```
511详细内容如下:
512
5131. 添加文件头注释信息
514    ```
515	# Copyright (c) 2021 XXXX Device Co., Ltd.
516	```
5172. 导入编译模板文件
518    ```
519	import("//build/test.gni")
520	```
5213. 指定文件输出路径
522	```
523	module_output_path = "developertest/calculator"
524	```
525	> **说明:** 此处输出路径为部件/模块名。
526
5274. 配置依赖包含目录
528
529	```
530	config("module_private_config") {
531	  visibility = [ ":*" ]
532
533	  include_dirs = [ "../../../include" ]
534	}
535	```
536	> **说明:** 一般在此处对相关配置进行设置,在测试用例编译脚本中可直接引用。
537
5385. 指定测试用例编译目标输出的文件名称
539
540	```
541	ohos_unittest("CalculatorSubTest") {
542	}
543	```
5446. 编写具体的测试用例编译脚本(添加需要参与编译的源文件、配置和依赖)
545	```
546	ohos_unittest("CalculatorSubTest") {
547	  module_out_path = module_output_path
548	  sources = [
549	    "../../../include/calculator.h",
550	    "../../../src/calculator.cpp",
551	    "../../../test/calculator_sub_test.cpp"
552	  ]
553	  sources += [ "calculator_sub_test.cpp" ]
554	  configs = [ ":module_private_config" ]
555	  deps = [ "//third_party/googletest:gtest_main" ]
556	}
557	```
558
559    > **说明:根据测试类型的不同,在具体编写过程中可选择不同的测试类型:**
560	 > - ohos_unittest:单元测试
561	 > - ohos_moduletest:模块测试
562	 > - ohos_systemtest:系统测试
563	 > - ohos_performancetest:性能测试
564	 > - ohos_securitytest:安全测试
565	 > - ohos_reliabilitytest:可靠性测试
566	 > - ohos_distributedtest:分布式测试
567
5687. 对目标测试用例文件进行条件分组
569
570	```
571	group("unittest") {
572	  testonly = true
573	  deps = [":CalculatorSubTest"]
574	}
575	```
576	> **说明:** 进行条件分组的目的在于执行用例时可以选择性的执行某一种特定类型的用例。
577
578- **JavaScript用例编译配置示例**
579
580```
581# Copyright (C) 2021 XXXX Device Co., Ltd.
582
583import("//build/test.gni")
584
585module_output_path = "developertest/app_info"
586
587ohos_js_unittest("GetAppInfoJsTest") {
588  module_out_path = module_output_path
589
590  hap_profile = "./config.json"
591  certificate_profile = "//test/developertest/signature/openharmony_sx.p7b"
592}
593
594group("unittest") {
595  testonly = true
596  deps = [ ":GetAppInfoJsTest" ]
597}
598```
599
600详细内容如下:
601
6021.添加文件头注释信息
603
604```
605# Copyright (C) 2021 XXXX Device Co., Ltd.
606```
607
6082.导入编译模板文件
609
610```
611import("//build/test.gni")
612```
613
6143.指定文件输出路径
615
616```
617module_output_path = "developertest/app_info"
618```
619> **说明:** 此处输出路径为部件/模块名。
620
6214.指定测试用例编译目标输出的文件名称
622
623```
624ohos_js_unittest("GetAppInfoJsTest") {
625}
626```
627> **说明:**
628> - 使用模板ohos_js_unittest定义js测试套,注意与C++用例区分。
629> - js测试套编译输出文件为hap类型,hap名为此处定义的测试套名,测试套名称必须以JsTest结尾。
630
6315.指定hap包配置文件config.json和签名文件,两个配置为必选项
632
633```
634ohos_js_unittest("GetAppInfoJsTest") {
635  module_out_path = module_output_path
636
637  hap_profile = "./config.json"
638  certificate_profile = "//test/developertest/signature/openharmony_sx.p7b"
639}
640```
641 config.json为hap编译所需配置文件,需要开发者根据被测sdk版本配置“target”项,其余项可默认,具体如下所示:
642
643```json
644{
645  "app": {
646    "bundleName": "com.example.myapplication",
647    "vendor": "example",
648    "version": {
649      "code": 1,
650      "name": "1.0"
651    },
652    "apiVersion": {
653           "compatible": 4,
654         "target": 5     // 根据被测sdk版本进行修改,此例为sdk5
655    }
656  },
657  "deviceConfig": {},
658  "module": {
659    "package": "com.example.myapplication",
660    "name": ".MyApplication",
661    "deviceType": [
662      "phone"
663    ],
664    "distro": {
665      "deliveryWithInstall": true,
666      "moduleName": "entry",
667      "moduleType": "entry"
668    },
669    "abilities": [
670      {
671      "skills": [
672          {
673            "entities": [
674              "entity.system.home"
675            ],
676            "actions": [
677              "action.system.home"
678            ]
679          }
680        ],
681        "name": "com.example.myapplication.MainAbility",
682        "icon": "$media:icon",
683        "description": "$string:mainability_description",
684        "label": "MyApplication",
685        "type": "page",
686        "launchType": "multiton"
687      }
688    ],
689    "js": [
690      {
691        "pages": [
692          "pages/index/index"
693        ],
694        "name": "default",
695          "window": {
696             "designWidth": 720,
697             "autoDesignWidth": false
698          }
699        }
700      ]
701    }
702  }
703```
704
7056.对目标测试用例文件进行条件分组
706
707```
708group("unittest") {
709  testonly = true
710  deps = [ ":GetAppInfoJsTest" ]
711}
712```
713> **说明:** 进行条件分组的目的在于执行用例时可以选择性的执行某一种特定类型的用例。
714
715**Fuzz测试**
716
717[Fuzz编译文件编写规范](https://gitee.com/openharmony/test_developertest/blob/master/libs/fuzzlib/README_zh.md)
718
719**Benchmark测试**
720
721[Benchmark编译文件编写规范](https://gitee.com/openharmony/test_developertest/blob/master/libs/benchmark/README_zh.md)
722
723
724**编译入口配置文件ohos.build**
725
726当完成用例编译配置文件编写后,需要进一步编写部件编译配置文件,以关联到具体的测试用例。
727```
728"partA": {
729    "module_list": [
730
731    ],
732    "inner_list": [
733
734    ],
735    "system_kits": [
736
737    ],
738    "test_list": [ //配置模块calculator下的test
739      "//system/subsystem/partA/calculator/test:unittest",
740      "//system/subsystem/partA/calculator/test:fuzztest",
741      "//system/subsystem/partA/calculator/test:benchmarktest"
742 }
743```
744> **说明:** test_list中配置的是对应模块的测试用例。
745
746## 测试资源配置
747
748试依赖资源主要包括测试用例在执行过程中需要的图片文件,视频文件、第三方库等对外的文件资源。
749
750依赖资源文件配置步骤如下:
751
7521.在部件的test目录下创建resource目录,在resource目录下创建对应的模块,在模块目录中存放该模块所需要的资源文件
753
7542.在resource目录下对应的模块目录中创建一个ohos_test.xml文件,文件内容格式如下:
755
756```xml
757<?xml version="1.0" encoding="UTF-8"?>
758<configuration ver="2.0">
759    <target name="CalculatorSubTest">
760        <preparer>
761            <option name="push" value="test.jpg -> /data/test/resource" src="res"/>
762            <option name="push" value="libc++.z.so -> /data/test/resource" src="out"/>
763        </preparer>
764    </target>
765</configuration>
766```
767
7683.在测试用例的编译配置文件中定义resource_config_file进行指引,用来指定对应的资源文件ohos_test.xml
769
770```
771ohos_unittest("CalculatorSubTest") {
772  resource_config_file = "//system/subsystem/partA/test/resource/calculator/ohos_test.xml"
773}
774```
775>**说明:**
776>- target_name: 测试套的名称,定义在测试目录的BUILD.gn中。preparer: 表示该测试套执行前执行的动作。
777>- src="res": 表示测试资源位于test目录下的resource目录下,src="out":表示位于out/release/$(部件)目录下。
778
779## 执行测试用例
780
781### 配置文件
782
783在执行测试用例之前,针对用例使用设备的不同,需要对相应配置进行修改,修改完成即可执行测试用例。
784
785#### user_config.xml配置
786```xml
787<user_config>
788  <build>
789    <!-- 是否编译demo用例, 默认为false,如果需要编译demo可修改为true -->
790    <example>false</example>
791    <!-- 是否编译版本, 默认为false -->
792    <version>false</version>
793    <!-- 是否编译测试用例, 默认为true,若已完成编译,再执行用例之前可修改为false,防止重新编译 -->
794    <testcase>true</testcase>
795	<!-- 在编译测试用例的情况下,选择编译target_cpu是64位的还是32位的,默认为空(32bit)可以选择: arm64 -->
796    <parameter>
797       <target_cpu></target_cpu>
798    </parameter>
799  </build>
800  <environment>
801    <!-- 配置远程映射机器的IP及端口,以支持HDC连接的设备 -->
802    <device type="usb-hdc">
803      <ip></ip>
804      <port></port>
805      <sn></sn>
806    </device>
807    <!-- 配置设备的串口信息,以支持串口连接的设备 -->
808    <device type="com" label="ipcamera">
809      <serial>
810        <com></com>
811        <type>cmd</type>
812        <baud_rate>115200</baud_rate>
813        <data_bits>8</data_bits>
814        <stop_bits>1</stop_bits>
815        <timeout>1</timeout>
816      </serial>
817    </device>
818  </environment>
819  <!-- 配置测试用例路径,若测试用例未编译,即<testcase>标签属性为true时,此处默认不填写;若编译已完成,需在此处指定测试用例的实际路径 -->
820  <test_cases>
821    <dir></dir>
822  </test_cases>
823  <!-- 配置覆盖率编译路径 -->
824  <coverage>
825    <outpath></outpath>
826  </coverage>
827  <!-- NFS挂载信息配置,被测设备仅支持串口连接时配置,指定NFS的映射路径,host_dir为PC侧的NFS目录,board_dir为板侧创建的目录 -->
828  <NFS>
829    <host_dir></host_dir>
830    <mnt_cmd></mnt_cmd>
831    <board_dir></board_dir>
832  </NFS>
833</user_config>
834```
835>**说明:** 在执行测试用例之前,若使用HDC连接设备,用例仅需配置设备IP和端口号即可,其余信息均默认不修改。
836
837### 执行命令说明
838
8391. 启动测试框架
840	```
841	start.bat
842	```
8432. 选择产品形态
844
845    进入测试框架,系统会自动提示您选择产品形态,请根据实际的开发板进行选择。
846
847	如需手动添加,请在config/framework_config.xml的\<productform\>标签内增加产品项。
848
8493. 执行测试用例
850
851    当选择完产品形态,可参考如下指令执行测试用例。
852	```
853	run -t UT -ts CalculatorSubTest -tc interger_sub_00l
854	```
855	执行命令参数说明:
856	```
857	-t [TESTTYPE]: 指定测试用例类型,有UT,MST,ST,PERF,FUZZ,BENCHMARK等。(必选参数)
858	-tp [TESTPART]: 指定部件,可独立使用。
859	-tm [TESTMODULE]: 指定模块,不可独立使用,需结合-tp指定上级部件使用。
860	-ts [TESTSUITE]: 指定测试套,可独立使用。
861	-tc [TESTCASE]: 指定测试用例,不可独立使用,需结合-ts指定上级测试套使用。
862	-h : 帮助命令。
863
864#### Windows环境执行
865
866由于Windows环境下无法实现用例编译,因此执行用例前需要在Linux环境下进行用例编译,用例编译命令:
867```
868./build.sh --product-name {product_name} --build-target make_test
869```
870
871>说明:
872>- product-name:指定编译产品名称。
873>- build-target:指定所需编译用例,make_test表示指定全部用例,实际开发中可指定特定用例。
874
875编译完成后,测试用例将自动保存在out/ohos-arm-release/packages/phone/tests目录下。
876
877##### 搭建执行环境
8781. 在Windows环境创建测试框架目录Test,并在此目录下创建testcase目录
879
8802. 从Linux环境拷贝测试框架developertest和xdevice到创建的Test目录下,拷贝编译好的测试用例到testcase目录下
881
882	>**说明:** 将测试框架及测试用例从Linux环境移植到Windows环境,以便后续执行。
883
8843. 修改user_config.xml
885	```xml
886	<build>
887	  <!-- 由于测试用例已编译完成,此标签属性需改为false -->
888	  <testcase>false</testcase>
889	</build>
890	<test_cases>
891	  <!-- 由于已将测试用例拷贝到Windows环境下,测试用例输出路径发生改变,需要修改为拷贝后所存放的路径 -->
892	  <dir>D:\Test\testcase\tests</dir>
893	</test_cases>
894	```
895	>**说明:** `<testcase>`标签表示是否需要编译用例;`<dir>`标签表示测试用例查找路径。
896
897#### Linux环境执行
898
899如是直接连接Linux机器,则可直接使用上面的执行命令执行命令
900
901##### 远程端口映射
902为支持Linux远程服务器以及Linux虚拟机两种环境下执行测试用例,需要对端口进行远程映射,以实现与设备的数据通路连接。具体操作如下:
9031. HDC Server指令:
904	```
905	hdc_std kill
906	hdc_std -m -s 0.0.0.0:8710
907	```
908	>**说明:** IP和端口号为默认值。
909
9102. HDC Client指令:
911	```
912	hdc_std -s xx.xx.xx.xx:8710 list targets
913	```
914	>**说明:** 此处IP填写设备侧IP地址。
915
916## 查看测试结果
917
918### 测试报告日志
919
920当执行完测试指令,控制台会自动生成测试结果,若需要详细测试报告您可在相应的数据文档中进行查找。
921
922### 测试结果
923测试结果输出根路径如下:
924```
925test/developertest/reports/xxxx_xx_xx_xx_xx_xx
926```
927>**说明:** 测试报告文件目录将自动生成。
928
929该目录中包含以下几类结果:
930| 类型                                 | 描述               |
931| ------------------------------------ | ------------------ |
932| result/                              | 测试用例格式化结果 |
933| log/plan_log_xxxx_xx_xx_xx_xx_xx.log | 测试用例日志       |
934| summary_report.html                  | 测试报告汇总       |
935| details_report.html                  | 测试报告详情       |
936
937### 测试框架日志
938```
939reports/platform_log_xxxx_xx_xx_xx_xx_xx.log
940```
941
942### 最新测试报告
943```
944reports/latest
945```
946