• 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| 操作系统          | Ubuntu20.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.2.0a                                                        | 支持设备通过HDC连接                                          |
37
38
39
401. 安装Ubuntu的步骤如下:
41
42	参考此文[OpenHarmony-标准设备系统代码操作梳理](https://blog.csdn.net/nanzhanfei/article/details/121951919),按照第二章“WSL2安装”步骤操作,即可完成Ubuntu的安装。由于Ubuntu20已自带python3.8.5,无需再次安装python。
43
442. 安装Linux扩展组件readline,安装命令如下:
45
46    ```bash
47    sudo apt-get install libreadline-dev
48    ```
49    安装成功提示如下:
50    ```
51    Reading package lists... Done
52    Building dependency tree
53    Reading state information... Done
54    libreadline-dev is already the newest version (7.0-3).
55    0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded.
56    ```
57
582. 安装setuptools插件,安装命令如下:
59    ```bash
60    pip3 install setuptools
61    ```
62    安装成功提示如下:
63    ```
64    Requirement already satisfied: setuptools in d:\programs\python37\lib\site-packages (41.2.0)
65    ```
66
673. 安装paramiko插件,安装命令如下:
68    ```bash
69    pip3 install paramiko
70    ```
71    安装成功提示如下:
72    ```
73    Installing collected packages: pycparser, cffi, pynacl, bcrypt, cryptography, paramiko
74    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
75    ```
76
774. 安装python的rsa插件,安装命令如下:
78    ```bash
79    pip3 install rsa
80    ```
81    安装成功提示如下:
82    ```
83    Installing collected packages: pyasn1, rsa
84    Successfully installed pyasn1-0.4.8 rsa-4.7
85    ```
86
875. 安装串口插件pyserial,安装命令如下:
88    ```bash
89    pip3 install pyserial
90    ```
91    安装成功提示如下:
92    ```
93    Requirement already satisfied: pyserial in d:\programs\python37\lib\site-packages\pyserial-3.4-py3.7.egg (3.4)
94    ```
95
966. 如果设备仅支持串口输出测试结果,则需要安装NFS Server
97
98	> **说明:**
99	>
100	> 此操作针对小型或轻量设备,不针对标准设备。
101
102    - Windows环境下安装,安装haneWIN NFS Server1.2.50软件包。
103    - Linux环境下安装,安装命令如下:
104    ```bash
105    sudo apt install nfs-kernel-server
106    ```
107    安装成功提示如下:
108    ```
109    Reading package lists... Done
110    Building dependency tree
111    Reading state information... Done
112    nfs-kernel-server is already the newest version (1:1.3.4-2.1ubuntu5.3).
113    0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded.
114    ```
115
1167. 如果设备支持HDC连接,则需要安装HDC工具,安装流程请参考[HDC-OpenHarmony设备连接器](https://gitee.com/openharmony/developtools_hdc/blob/master/README_zh.md)117
118
119### 环境依赖检查
120
121| 检查项                                             | 操作                                                | 满足环境                  |
122| -------------------------------------------------- | --------------------------------------------------- | ------------------------- |
123| 检查python安装成功                                 | 命令行窗口执行命令:python --version                | 版本不小于3.7.5即可       |
124| 检查python扩展插件安装成功                         | 打开test/developertest目录,执行start.batstart.sh | 可进入提示符“>>>”界面即可 |
125| 检查NFS Server启动状态(被测设备仅支持串口时检测) | 通过串口登录开发板,执行mount命令挂载NFS            | 可正常挂载文件目录即可    |
126| 检查HDC安装成功                                    | 命令行窗口执行命令:hdc -v                      | 版本不小于1.2.0a即可       |
127
128
129## 编写测试用例
130
131本测试框架支持多种类型测试,针对不同测试类型提供了不同的用例编写模板以供参考。
132
133**TDD测试(C++)**
134
135- 用例源文件命名规范
136
137    测试用例源文件名称和测试套内容保持一致,文件命名采用全小写+下划线格式,以test结尾,具体格式为:[功能]_[子功能]_test,子功能支持向下细分。
138
139
140- 单线程用例示例及编写步骤,以calculator_sub_test.cpp为例进行说明:
141    ```
142    /*
143     * Copyright (c) 2023 XXXX Device Co., Ltd.
144     * Licensed under the Apache License, Version 2.0 (the "License");
145     * you may not use this file except in compliance with the License.
146     * You may obtain a copy of the License at
147     *
148     *     http://www.apache.org/licenses/LICENSE-2.0
149     *
150     * Unless required by applicable law or agreed to in writing, software
151     * distributed under the License is distributed on an "AS IS" BASIS,
152     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153     * See the License for the specific language governing permissions and
154     * limitations under the License.
155     */
156
157    #include "calculator.h"
158    #include <gtest/gtest.h>
159
160    using namespace testing::ext;
161
162    class CalculatorSubTest : public testing::Test {
163    public:
164        static void SetUpTestCase(void);
165        static void TearDownTestCase(void);
166        void SetUp();
167        void TearDown();
168    };
169
170    void CalculatorSubTest::SetUpTestCase(void)
171    {
172        // input testsuit setup step,setup invoked before all testcases
173    }
174
175    void CalculatorSubTest::TearDownTestCase(void)
176    {
177        // input testsuit teardown step,teardown invoked after all testcases
178    }
179
180    void CalculatorSubTest::SetUp(void)
181    {
182        // input testcase setup step,setup invoked before each testcases
183    }
184
185    void CalculatorSubTest::TearDown(void)
186    {
187        // input testcase teardown step,teardown invoked after each testcases
188    }
189
190    /**
191     * @tc.name: integer_sub_001
192     * @tc.desc: Verify the sub function.
193     * @tc.type: FUNC
194     * @tc.require: issueNumber
195     */
196    HWTEST_F(CalculatorSubTest, integer_sub_001, TestSize.Level1)
197    {
198        // step 1:调用函数获取结果
199        int actual = Sub(4,0);
200
201        // Step 2:使用断言比较预期与实际结果
202        EXPECT_EQ(4, actual);
203    }
204    ```
205    详细内容介绍:
206    1. 添加测试用例文件头注释信息
207	    ```
208    	/*
209    	 * Copyright (c) 2023 XXXX Device Co., Ltd.
210    	 * Licensed under the Apache License, Version 2.0 (the "License");
211    	 * you may not use this file except in compliance with the License.
212    	 * You may obtain a copy of the License at
213    	 *
214    	 *     http://www.apache.org/licenses/LICENSE-2.0
215    	 *
216    	 * Unless required by applicable law or agreed to in writing, software
217    	 * distributed under the License is distributed on an "AS IS" BASIS,
218    	 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
219    	 * See the License for the specific language governing permissions and
220    	 * limitations under the License.
221    	 */
222    	```
223    2. 引用测试框架头文件和命名空间
224	    ```
225    	#include <gtest/gtest.h>
226
227    	using namespace testing::ext;
228    	```
229    3. 添加被测试类的头文件
230	    ```
231    	#include "calculator.h"
232    	```
233    4. 定义测试套(测试类)
234		> **注意:** 在定义测试套时,测试套名称应与编译目标保持一致,采用大驼峰风格。
235	    ```
236    	class CalculatorSubTest : public testing::Test {
237    	public:
238    	    static void SetUpTestCase(void);
239    	    static void TearDownTestCase(void);
240    	    void SetUp();
241    	    void TearDown();
242    	};
243
244    	void CalculatorSubTest::SetUpTestCase(void)
245    	{
246    	    // input testsuit setup step,setup invoked before all testcases
247    	}
248
249    	void CalculatorSubTest::TearDownTestCase(void)
250    	{
251    	    // input testsuit teardown step,teardown invoked after all testcases
252    	}
253
254    	void CalculatorSubTest::SetUp(void)
255    	{
256    	    // input testcase setup step,setup invoked before each testcases
257    	}
258
259    	void CalculatorSubTest::TearDown(void)
260    	{
261    	    // input testcase teardown step,teardown invoked after each testcases
262    	}
263    	```
264
265    5. 测试用例实现,包含用例注释和逻辑实现
266	    ```
267    	/**
268    	 * @tc.name: integer_sub_001
269    	 * @tc.desc: Verify the sub function.
270    	 * @tc.type: FUNC
271    	 * @tc.require: issueNumber
272    	 */
273    	HWTEST_F(CalculatorSubTest, integer_sub_001, TestSize.Level1)
274    	{
275    	    //step 1:调用函数获取结果
276    	    int actual = Sub(4,0);
277
278    	    //Step 2:使用断言比较预期与实际结果
279    	    EXPECT_EQ(4, actual);
280    	}
281    	```
282		> **注意:** @tc.require的取值必须以AR/SR或issue开头,如:issueI56WJ7。
283
284- 多线程用例示例及编写步骤,以base_object_test.cpp为例进行说明:
285    ```
286    // 测试用例文件头注释信息及用例注释同单线程用例示例。
287
288    #include "base_object.h"
289    #include <gtest/gtest.h>
290	#include <gtest/hwext/gtest-multithread.h>
291	#include <unistd.h>
292
293    using namespace testing::ext;
294    using namespace testing::mt;
295
296	namespace OHOS {
297	namespace AAFwk {
298    class AAFwkBaseObjectTest : public testing::Test {......}
299
300	// Step 1:待测函数,返回阶乘结果
301	int factorial(int n)
302	{
303		int result = 1;
304		for (int i = 1; i <= n; i++) {
305			result *= i;
306		}
307		printf("Factorial Function Result : %d! = %d\n", n, result);
308		return result;
309	}
310
311	// Step 2:使用断言比较预期与实际结果
312	void factorial_test()
313	{
314		int ret = factorial(3); // 调用函数获取结果
315		std::thread::id this_id = std::this_thread::get_id();
316		std::ostringstream oss;
317		oss << this_id;
318		std::string this_id_str = oss.str();
319		long int thread_id = atol(this_id_str.c_str());
320		printf("running thread...: %ld\n", thread_id); // 输出当前线程的id
321		EXPECT_EQ(ret, 6);
322	}
323
324	HWTEST_F(AAFwkBaseObjectTest, Factorial_test_001, TestSize.Level1)
325	{
326		SET_THREAD_NUM(4);
327		printf("Factorial_test_001 BEGIN\n");
328		GTEST_RUN_TASK(factorial_test);
329		printf("Factorial_test_001 END\n");
330	}
331
332	HWMTEST_F(AAFwkBaseObjectTest, Factorial_test_002, TestSize.Level1, 6)
333	{
334		printf("Factorial_test_002 BEGIN\n");
335		factorial_test();
336		printf("Factorial_test_002 END\n");
337	}
338
339	}  // namespace AAFwk
340	}  // namespace OHOS
341
342    ```
343    详细内容介绍:
344    1. 添加测试用例文件头注释信息
345
346		> **注意:** 与单线程用例标准一致。
347
348    2. 引用测试框架头文件和命名空间
349	    ```
350    	#include <gtest/gtest.h>
351    	#include <gtest/hwext/gtest-multithread.h>
352		#include <unistd.h>
353    	using namespace testing::ext;
354   		using namespace testing::mt;
355    	```
356    3. 添加被测试类的头文件
357	    ```
358    	#include "base_object.h"
359    	```
360    4. 定义测试套(测试类)
361	    ```
362    	class AAFwkBaseObjectTest : public testing::Test {......}
363
364    	```
365	    > **注意:** 与单线程用例标准一致。
366
367    5. 测试用例实现,包含用例注释和逻辑实现
368
369	    ```
370		// Step 1:待测函数,返回阶乘结果
371		int factorial(int n)
372		{
373			int result = 1;
374			for (int i = 1; i <= n; i++) {
375				result *= i;
376			}
377			printf("Factorial Function Result : %d! = %d\n", n, result);
378			return result;
379		}
380
381		// Step 2:使用断言比较预期与实际结果
382		void factorial_test()
383		{
384			int ret = factorial(3); // 调用函数获取结果
385			std::thread::id this_id = std::this_thread::get_id();
386			std::ostringstream oss;
387			oss << this_id;
388			std::string this_id_str = oss.str();
389			long int thread_id = atol(this_id_str.c_str());
390			printf("running thread...: %ld\n", thread_id); // 输出当前线程的id
391			EXPECT_EQ(ret, 6);
392		}
393
394		// GTEST_RUN_TASK(TestFunction)多线程启动函数,参数为自定义函数。
395		// 未调用SET_THREAD_NUM()时,默认线程数10个。
396    	HWTEST_F(AAFwkBaseObjectTest, Factorial_test_001, TestSize.Level1)
397    	{
398			SET_THREAD_NUM(4); // 设置线程数量,同一测试套中可动态设置线程数。
399			printf("Factorial_test_001 BEGIN\n");
400			GTEST_RUN_TASK(factorial_test); // 启动factorial_test任务的多线程执行
401			printf("Factorial_test_001 END\n");
402    	}
403
404		// HWMTEST_F(TEST_SUITE, TEST_TC, TEST_LEVEL, THREAD_NUM)
405		// THREAD_NUM可设置用例执行的线程数量。
406		// HWMTEST_F会创建指定数量的线程并执行被测函数。
407    	HWMTEST_F(AAFwkBaseObjectTest, Factorial_test_002, TestSize.Level1, 6)
408    	{
409			printf("Factorial_test_002 BEGIN\n");
410			factorial_test();
411			printf("Factorial_test_002 END\n");
412    	}
413		// 新增多线程接口MTEST_ADD_TASK(THREAD_ID,ThreadTestFunc),注册多线程,但不在该用例中执行,之后统一执行,适合多个用例组合场景下的多线程测试。
414		// THREAD_ID从0开始定义区别不同的线程,也可以使用随机THREAD_ID,即传入RANDOM_THREAD_ID,此场景下THREAD_ID是不会重复的。
415		// 新增多线程接口MTEST_POST_RUN(),统一执行之前注册的多线程用例。
416    	```
417		> **注意:** 多线程用例注释与单线程用例标准一致。
418
419- C++用例模板说明:
420
421	在编写用例时,我们提供了四种用例模板供您选择。
422
423	|      类型 |    描述 |
424	| ------------| ------------|
425	| HWTEST(A,B,C)| 用例执行不依赖Setup&Teardown时,可选取|
426	| HWTEST_F(A,B,C)| 用例执行(不含参数)依赖于Setup&Teardown时,可选取|
427	| HWMTEST_F(A,B,C,D)| 多线程用例执行依赖于Setup&Teardown时,可选取|
428	| HWTEST_P(A,B,C)| 用例执行(含参数)依赖于Set&Teardown时,可选取|
429
430
431	其中,参数A,B,C的含义如下:
432
433	- 参数A为测试套名。
434
435	- 参数B为测试用例名,其命名必须遵循[功能点]_[编号]的格式,编号为3位数字,从001开始。
436
437	- 参数C为测试用例等级,具体分为门禁level0 以及非门禁level1-level4共五个等级,其中非门禁level1-level4等级的具体选取规则为:测试用例功能越重要,level等级越低。
438
439	- 参数D为多线程用例执行的线程数量设置。
440
441	**注意:**
442
443	- 测试用例的预期结果必须有对应的断言。
444
445	- 测试用例必须填写用例等级。
446
447	- 测试体建议按照模板分步实现。
448
449	- 用例描述信息按照标准格式@tc.xxx value书写,注释信息必须包含用例名称,用例描述,用例类型,需求编号四项。其中用例测试类型@tc.type参数的选取,可参考下表。
450
451
452		| 测试类型名称 | 类型编码 |
453		| ------------ | -------- |
454		| 功能测试     | FUNC     |
455		| 性能测试     | PERF     |
456		| 可靠性测试   | RELI     |
457		| 安全测试     | SECU     |
458		| 模糊测试     | FUZZ     |
459
460**TDD测试(JavaScript)**
461
462- 用例源文件命名规范
463
464
465	测试用例原文件名称采用大驼峰风格,以Test结尾,具体格式为:[功能][子功能]Test,子功能支持向下细分。
466	示例:
467	```
468	AppInfoTest.js
469	```
470
471- 用例示例
472
473	```js
474	/*
475	* Copyright (C) 2023 XXXX Device Co., Ltd.
476	* Licensed under the Apache License, Version 2.0 (the "License");
477	* you may not use this file except in compliance with the License.
478	* You may obtain a copy of the License at
479	*
480	*     http://www.apache.org/licenses/LICENSE-2.0
481	*
482	* Unless required by applicable law or agreed to in writing, software
483	* distributed under the License is distributed on an "AS IS" BASIS,
484	* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
485	* See the License for the specific language governing permissions and
486	* limitations under the License.
487	*/
488	import app from '@system.app'
489
490	import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'
491
492	describe("AppInfoTest", function () {
493		beforeAll(function() {
494			// input testsuit setup step,setup invoked before all testcases
495			console.info('beforeAll caled')
496		})
497
498		afterAll(function() {
499			// input testsuit teardown step,teardown invoked after all testcases
500			console.info('afterAll caled')
501		})
502
503		beforeEach(function() {
504			// input testcase setup step,setup invoked before each testcases
505			console.info('beforeEach caled')
506		})
507
508		afterEach(function() {
509			// input testcase teardown step,teardown invoked after each testcases
510			console.info('afterEach caled')
511		})
512
513		/*
514		* @tc.name:appInfoTest001
515		* @tc.desc:verify app info is not null
516		* @tc.type: FUNC
517		* @tc.require: issueNumber
518		*/
519		it("appInfoTest001", 0, function () {
520			//step 1:调用函数获取结果
521			var info = app.getInfo()
522
523			//Step 2:使用断言比较预期与实际结果
524			expect(info != null).assertEqual(true)
525		})
526	})
527	```
528	详细内容介绍:
529	1. 添加测试用例文件头注释信息
530		```
531		/*
532		* Copyright (C) 2023 XXXX Device Co., Ltd.
533		* Licensed under the Apache License, Version 2.0 (the "License");
534		* you may not use this file except in compliance with the License.
535		* You may obtain a copy of the License at
536		*
537		*     http://www.apache.org/licenses/LICENSE-2.0
538		*
539		* Unless required by applicable law or agreed to in writing, software
540		* distributed under the License is distributed on an "AS IS" BASIS,
541		* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
542		* See the License for the specific language governing permissions and
543		* limitations under the License.
544		*/
545		```
546	2. 导入被测api和jsunit测试库
547		```js
548		import app from '@system.app'
549
550		import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'
551		```
552	3. 定义测试套(测试类)
553		```js
554		describe("AppInfoTest", function () {
555			beforeAll(function() {
556				// input testsuit setup step,setup invoked before all testcases
557				console.info('beforeAll caled')
558			})
559
560			afterAll(function() {
561				// input testsuit teardown step,teardown invoked after all testcases
562				console.info('afterAll caled')
563			})
564
565			beforeEach(function() {
566				// input testcase setup step,setup invoked before each testcases
567				console.info('beforeEach caled')
568			})
569
570			afterEach(function() {
571				// input testcase teardown step,teardown invoked after each testcases
572				console.info('afterEach caled')
573			})
574		```
575	4. 测试用例实现
576		```JS
577		/*
578		* @tc.name:appInfoTest001
579		* @tc.desc:verify app info is not null
580		* @tc.type: FUNC
581		* @tc.require: issueNumber
582		*/
583		it("appInfoTest001", 0, function () {
584			//step 1:调用函数获取结果
585			var info = app.getInfo()
586
587			//Step 2:使用断言比较预期与实际结果
588			expect(info != null).assertEqual(true)
589		})
590		```
591		> **注意:** @tc.require的取值必须以AR/SR或issue开头,如:issueI56WJ7。
592
593**Fuzzing安全测试**
594
595[Fuzzing安全测试用例编写规范](https://gitee.com/openharmony/testfwk_developer_test/blob/master/libs/fuzzlib/README_zh.md)
596
597
598**Benchmark测试**
599
600[Benchmark用例编写规范](https://gitee.com/openharmony/testfwk_developer_test/blob/master/libs/benchmark/README_zh.md)
601
602## 编译测试用例
603
604根据测试用例目录规划,当执行某一用例时,测试框架会根据编译文件逐层查找,最终找到所需用例进行编译。下面通过不同示例来讲解gn文件如何编写。
605
606**TDD测试**
607
608针对不同语言,下面提供不同的编译模板以供参考。
609
610- **C++用例编译配置示例**
611
612	```
613	# Copyright (c) 2023 XXXX Device Co., Ltd.
614
615	import("//build/test.gni")
616
617	module_output_path = "developertest/calculator"
618
619	config("module_private_config") {
620	visibility = [ ":*" ]
621
622	include_dirs = [ "../../../include" ]
623	}
624
625	ohos_unittest("CalculatorSubTest") {
626	module_out_path = module_output_path
627
628	sources = [
629		"../../../include/calculator.h",
630		"../../../src/calculator.cpp",
631	]
632
633	sources += [ "calculator_sub_test.cpp" ]
634
635	configs = [ ":module_private_config" ]
636
637	deps = [ "//third_party/googletest:gtest_main" ]
638	}
639
640	group("unittest") {
641	testonly = true
642	deps = [":CalculatorSubTest"]
643	}
644	```
645	详细内容如下:
646
647	1. 添加文件头注释信息
648		```
649		# Copyright (c) 2023 XXXX Device Co., Ltd.
650		```
651	2. 导入编译模板文件
652		```
653		import("//build/test.gni")
654		```
655	3. 指定文件输出路径
656		```
657		module_output_path = "developertest/calculator"
658		```
659		> **说明:**
660		>
661		> 此处输出路径为部件/模块名。
662
663	4. 配置依赖包含目录
664
665		```
666		config("module_private_config") {
667		visibility = [ ":*" ]
668
669		include_dirs = [ "../../../include" ]
670		}
671		```
672		> **说明:**
673		>
674		> 一般在此处对相关配置进行设置,在测试用例编译脚本中可直接引用。
675
676	5. 指定测试用例编译目标输出的文件名称
677
678		```
679		ohos_unittest("CalculatorSubTest") {
680		}
681		```
682	6. 编写具体的测试用例编译脚本(添加需要参与编译的源文件、配置和依赖)
683		```
684		ohos_unittest("CalculatorSubTest") {
685		module_out_path = module_output_path
686		sources = [
687			"../../../include/calculator.h",
688			"../../../src/calculator.cpp",
689			"../../../test/calculator_sub_test.cpp"
690		]
691		sources += [ "calculator_sub_test.cpp" ]
692		configs = [ ":module_private_config" ]
693		deps = [ "//third_party/googletest:gtest_main" ]
694		}
695		```
696
697		> **说明:**
698		>
699		> 根据测试类型的不同,在具体编写过程中可选择不同的测试类型。
700		> - ohos_unittest:单元测试
701        > - ohos_js_unittest: FA模型js用例单元测试
702        > - ohos_js_stage_unittest: stage模型ArkTs用例单元测试
703		> - ohos_moduletest:模块测试
704		> - ohos_systemtest:系统测试
705		> - ohos_performancetest:性能测试
706		> - ohos_securitytest:安全测试
707		> - ohos_reliabilitytest:可靠性测试
708		> - ohos_distributedtest:分布式测试
709
710	7. 对目标测试用例文件进行条件分组
711
712		```
713		group("unittest") {
714		testonly = true
715		deps = [":CalculatorSubTest"]
716		}
717		```
718		> **说明:**
719		>
720		> 进行条件分组的目的在于执行用例时可以选择性地执行某一种特定类型的用例。
721
722- **JavaScript用例编译配置示例**
723
724	```
725	# Copyright (C) 2023 XXXX Device Co., Ltd.
726
727	import("//build/test.gni")
728
729	module_output_path = "developertest/app_info"
730
731	ohos_js_unittest("GetAppInfoJsTest") {
732	module_out_path = module_output_path
733
734	hap_profile = "./config.json"
735	certificate_profile = "//test/developertest/signature/openharmony_sx.p7b"
736	}
737
738	group("unittest") {
739	testonly = true
740	deps = [ ":GetAppInfoJsTest" ]
741	}
742	```
743
744	详细内容如下:
745
746	1. 添加文件头注释信息
747
748		```
749		# Copyright (C) 2023 XXXX Device Co., Ltd.
750		```
751
752	2. 导入编译模板文件
753
754		```
755		import("//build/test.gni")
756		```
757
758	3. 指定文件输出路径
759
760		```
761		module_output_path = "developertest/app_info"
762		```
763		> **说明:**
764		>
765		> 此处输出路径为部件/模块名。
766
767	4. 指定测试用例编译目标输出的文件名称
768
769		```
770		ohos_js_unittest("GetAppInfoJsTest") {
771		}
772		```
773		> **说明:**
774		>
775		> - 使用模板ohos_js_unittest定义js测试套,注意与C++用例区分。
776		> - js测试套编译输出文件为hap类型,hap名为此处定义的测试套名,测试套名称必须以JsTest结尾。
777
778	5. 指定hap包配置文件config.json和签名文件,两个配置为必选项。
779
780		```
781		ohos_js_unittest("GetAppInfoJsTest") {
782		module_out_path = module_output_path
783
784		hap_profile = "./config.json"
785		certificate_profile = "//test/developertest/signature/openharmony_sx.p7b"
786		}
787		```
788		config.json为hap编译所需配置文件,需要开发者根据被测sdk版本配置“target”项,其余项可默认,具体如下所示:
789
790		```json
791		{
792		"app": {
793			"bundleName": "com.example.myapplication",
794			"vendor": "example",
795			"version": {
796			"code": 1,
797			"name": "1.0"
798			},
799			"apiVersion": {
800				"compatible": 4,
801				"target": 5     // 根据被测sdk版本进行修改,此例为sdk5
802			}
803		},
804		"deviceConfig": {},
805		"module": {
806			"package": "com.example.myapplication",
807			"name": ".MyApplication",
808			"deviceType": [
809			"phone"
810			],
811			"distro": {
812			"deliveryWithInstall": true,
813			"moduleName": "entry",
814			"moduleType": "entry"
815			},
816			"abilities": [
817			{
818			"skills": [
819				{
820					"entities": [
821					"entity.system.home"
822					],
823					"actions": [
824					"action.system.home"
825					]
826				}
827				],
828				"name": "com.example.myapplication.MainAbility",
829				"icon": "$media:icon",
830				"description": "$string:mainability_description",
831				"label": "MyApplication",
832				"type": "page",
833				"launchType": "standard"
834			}
835			],
836			"js": [
837			{
838				"pages": [
839				"pages/index/index"
840				],
841				"name": "default",
842				"window": {
843					"designWidth": 720,
844					"autoDesignWidth": false
845				}
846				}
847			]
848			}
849		}
850		```
851
852	6. 对目标测试用例文件进行条件分组
853
854		```
855		group("unittest") {
856		testonly = true
857		deps = [ ":GetAppInfoJsTest" ]
858		}
859		```
860		> **说明:**
861		>
862		> 进行条件分组的目的在于执行用例时可以选择性地执行某一种特定类型的用例。
863
864- **stage模型ArkTs用例编译配置示例**
865
866    ```
867    # Copyright (C) 2023 XXXX Device Co., Ltd.
868
869    import("//build/test.gni")
870
871    want_output_path = "developertest/stage_test"
872
873    ohos_js_stage_unittest("ActsBundleMgrStageEtsTest") {
874    hap_profile = "entry/src/main/module.json"
875    deps = [
876        ":actbmsstageetstest_js_assets",
877        ":actbmsstageetstest_resources",
878    ]
879    ets2abc = true
880    certificate_profile = "signature/openharmony_sx.p7b"
881    hap_name = "ActsBundleMgrStageEtsTest"
882    subsystem_name = "developertest"
883    part_name = "stage_test"
884    module_out_path = want_output_path
885    }
886    ohos_app_scope("actbmsstageetstest_app_profile") {
887    app_profile = "AppScope/app.json"
888    sources = [ "AppScope/resources" ]
889    }
890    ohos_js_assets("actbmsstageetstest_js_assets") {
891    source_dir = "entry/src/main/ets"
892    }
893    ohos_resources("actbmsstageetstest_resources") {
894    sources = [ "entry/src/main/resources" ]
895    deps = [ ":actbmsstageetstest_app_profile" ]
896    hap_profile = "entry/src/main/module.json"
897    }
898    group("unittest") {
899    testonly = true
900    deps = []
901    deps += [ ":ActsBundleMgrStageEtsTest" ]
902    }
903    ```
904	详细内容如下:
905
906	1. 添加文件头注释信息
907
908		```
909		# Copyright (C) 2023 XXXX Device Co., Ltd.
910		```
911
912	2. 导入编译模板文件
913
914		```
915		import("//build/test.gni")
916		```
917
918	3. 指定文件输出路径
919
920		```
921		want_output_path = "developertest/stage_test"
922		```
923		> **说明:**
924		>
925		> 此处输出路径为部件/模块名。
926
927	4. 指定测试用例编译目标输出的文件名称
928
929		```
930		ohos_js_stage_unittest("ActsBundleMgrStageEtsTest") {
931		}
932		```
933		> **说明:**
934		>
935		> 使用模板ohos_js_stage_unittest定义stage模型的ArkTs测试套。
936
937	5. 指定配置文件module.json、签名文件、部件名称和编译输出路径,都为必选项。
938
939		```
940		ohos_js_stage_unittest("ActsBundleMgrStageEtsTest") {
941        hap_profile = "entry/src/main/module.json"
942        certificate_profile = "signature/openharmony_sx.p7b"
943        subsystem_name = "developertest"
944        part_name = "stage_test"  // 部件名称
945		}
946		```
947
948	6. 指定配置资源文件(添加需要参与编译的源文件、配置和依赖)
949		```
950		# 声明一个HAP的AppScope模块,该目标的app_profile和sources会在编译时拼接到具体的entry内编译。
951		ohos_app_scope("actbmsstageetstest_app_profile") {
952        app_profile = "AppScope/app.json"
953        sources = [ "AppScope/resources" ]
954		}
955
956		# stage模型用例代码分别放置到ets目录下。
957		ohos_js_assets("actbmsstageetstest_js_assets") {
958        source_dir = "entry/src/main/ets"
959		}
960
961		# 源文件,Stage模型编译后放置在resources目录下。
962		ohos_resources("actbmsstageetstest_resources") {
963        sources = [ "entry/src/main/resources" ]
964        deps = [ ":actbmsstageetstest_app_profile" ]
965        hap_profile = "entry/src/main/module.json"
966		}
967
968		```
969
970   7. 对目标测试用例文件进行条件分组
971
972       ```
973       group("unittest") {
974       testonly = true
975       deps = [ ":GetAppInfoJsTest" ]
976       }
977       ```
978		> **说明:**
979		>
980		> 进行条件分组的目的在于执行用例时可以选择性地执行某一种特定类型的用例。
981
982**编译入口配置文件bundle.json**
983
984当完成用例编译配置文件编写后,需要进一步编写部件编译配置文件,以关联到具体的测试用例。
985```
986"build": {
987    "sub_component": [
988		"//test/testfwk/developer_test/examples/app_info:app_info",
989		"//test/testfwk/developer_test/examples/detector:detector",
990		"//test/testfwk/developer_test/examples/calculator:calculator"
991    ],
992    "inner_list": [
993		{
994			"header": {
995				"header_base": "////test/testfwk/developer_test/examples/detector/include",
996				"header_files": [
997					"detector.h"
998				]
999		},
1000		"name": "//test/testfwk/developer_test/examples/detector:detector"
1001	  }
1002    ],
1003    "test": [ //配置模块calculator下的test
1004      "//test/testfwk/developer_test/examples/app_info/test:unittest",
1005      "//test/testfwk/developer_test/examples/calculator/test:unittest",
1006      "//test/testfwk/developer_test/examples/calculator/test:fuzztest"
1007 }
1008```
1009> **说明:**
1010>
1011> test_list中配置的是对应模块的测试用例。
1012
1013## 配置测试资源
1014
1015测试依赖资源主要包括测试用例在执行过程中需要的图片文件、视频文件、第三方库等对外的文件资源,目前只支持静态资源的配置。
1016
1017依赖资源文件配置步骤如下:
1018
10191. 在部件的test目录下创建resource目录,在resource目录下创建对应的模块,在模块目录中存放该模块所需要的资源文件。
1020
10212. 在resource目录下对应的模块目录中创建一个ohos_test.xml文件,文件内容格式如下:
1022
1023	```xml
1024	<?xml version="1.0" encoding="UTF-8"?>
1025	<configuration ver="2.0">
1026		<target name="CalculatorSubTest">
1027			<preparer>
1028				<option name="push" value="test.jpg -> /data/test/resource" src="res"/>
1029				<option name="push" value="libc++.z.so -> /data/test/resource" src="out"/>
1030			</preparer>
1031		</target>
1032	</configuration>
1033	```
1034
1035 3. 在测试用例的编译配置文件中定义resource_config_file进行指引,用来指定对应的资源文件ohos_test.xml1036
1037	```
1038	ohos_unittest("CalculatorSubTest") {
1039	resource_config_file = "//system/subsystem/partA/test/resource/calculator/ohos_test.xml"
1040	}
1041	```
1042	> **说明:**
1043	>
1044	>- target_name: 测试套的名称,定义在测试目录的BUILD.gn中。preparer: 表示该测试套执行前执行的动作。
1045	>- src="res": 表示测试资源位于test目录下的resource目录下,src="out":表示位于out/release/$(部件)目录下。
1046
1047## 执行测试用例
1048
1049### user_config.xml配置文件介绍
1050
1051在执行测试用例之前,针对用例使用设备的不同,需要对相应配置进行修改,配置文件路径为developer_test\config\user_config.xml,修改完成即可执行测试用例。
1052
1053```xml
1054<user_config>
1055  <build>
1056    <!-- 是否编译demo用例,默认为false,如果需要编译demo可修改为true -->
1057    <example>false</example>
1058    <!-- 是否编译版本,默认为false -->
1059    <version>false</version>
1060    <!-- 是否编译测试用例,默认为true,若已完成编译,再执行用例之前可修改为false,防止重新编译 -->
1061    <testcase>true</testcase>
1062	<!-- 在编译测试用例的情况下,选择编译target_cpu是64位的还是32位的,默认为空(32bit)可以选择: arm64 -->
1063    <parameter>
1064       <target_cpu></target_cpu>
1065    </parameter>
1066  </build>
1067  <environment>
1068    <!-- 配置远程映射机器的IP及端口,以支持HDC连接的设备 -->
1069    <device type="usb-hdc">
1070      <ip></ip>
1071      <port></port>
1072      <sn></sn>
1073    </device>
1074    <!-- 配置设备的串口信息,以支持串口连接的设备 -->
1075    <device type="com" label="ipcamera">
1076      <serial>
1077        <com></com>
1078        <type>cmd</type>
1079        <baud_rate>115200</baud_rate>
1080        <data_bits>8</data_bits>
1081        <stop_bits>1</stop_bits>
1082        <timeout>1</timeout>
1083      </serial>
1084    </device>
1085  </environment>
1086  <!-- 配置测试用例路径,若测试用例未编译,即<testcase>标签属性为true时,此处默认不填写;若编译已完成,需在此处指定测试用例的实际路径 -->
1087  <test_cases>
1088    <dir></dir>
1089  </test_cases>
1090  <!-- 配置覆盖率编译路径 -->
1091  <coverage>
1092    <outpath></outpath>
1093  </coverage>
1094  <!-- NFS挂载信息配置,被测设备仅支持串口连接时配置,指定NFS的映射路径,host_dir为PC侧的NFS目录,board_dir为板侧创建的目录 -->
1095  <NFS>
1096    <host_dir></host_dir>
1097    <mnt_cmd></mnt_cmd>
1098    <board_dir></board_dir>
1099  </NFS>
1100</user_config>
1101```
1102> **说明:**
1103>
1104> 在执行测试用例之前,若使用HDC连接设备,用例仅需配置设备IP和端口号即可,其余信息均默认不修改。
1105
1106### Windows环境执行
1107#### 编译测试用例
1108
1109由于Windows环境下无法实现用例编译,因此执行用例前需要在Linux环境下进行用例编译,用例编译命令:
1110```
1111./build.sh --product-name {product_name} --build-target make_test
1112```
1113
1114> **说明:**
1115>
1116>- product-name:指定编译产品名称。
1117>- build-target:指定所需编译用例,make_test表示指定全部用例,实际开发中可指定特定用例。
1118
1119编译完成后,测试用例将自动保存在out/ohos-arm-release/packages/phone/tests目录下。
1120
1121#### 搭建执行环境
11221. 在Windows环境创建测试框架目录Test,并在此目录下创建testcase目录。
1123
11242. 从Linux环境拷贝测试框架developertest和xdevice到创建的Test目录下,拷贝编译好的测试用例到testcase目录下。
1125
1126	> **说明:**
1127	>
1128	> 将测试框架及测试用例从Linux环境移植到Windows环境,以便后续执行。
1129
11303. 修改user_config.xml
1131	```xml
1132	<build>
1133	  <!-- 由于测试用例已编译完成,此标签属性需改为false -->
1134	  <testcase>false</testcase>
1135	</build>
1136	<test_cases>
1137	  <!-- 由于已将测试用例拷贝到Windows环境下,测试用例输出路径发生改变,需要修改为拷贝后所存放的路径 -->
1138	  <dir>D:\Test\testcase\tests</dir>
1139	</test_cases>
1140	```
1141	> **说明:**
1142	>
1143	> `<testcase>`标签表示是否需要编译用例;`<dir>`标签表示测试用例查找路径。
1144
1145#### 执行用例命令
1146
11471. 启动测试框架
1148	```
1149	start.bat
1150	```
11512. 选择产品形态
1152
1153    进入测试框架,系统会自动提示您选择产品形态,请根据实际的开发板进行选择。
1154
1155	如需手动添加,请在config/framework_config.xml的\<productform\>标签内增加产品项。
1156
11573. 执行测试用例
1158
1159    当选择完产品形态,可参考如下指令执行TDD测试用例。
1160	```
1161	run -t UT
1162	run -t UT -tp PartName
1163	run -t UT -tp PartName -tm TestModuleName
1164	run -t UT -tp ability_base -ts base_object_test
1165	run -t UT -tp PartName -tm TestModuleName -ts CalculatorSubTest
1166	run -t UT -ts base_object_test
1167	run -t UT -ts base_object_test -tc AAFwkBaseObjectTest.BaseObject_test_001
1168	run -t UT -ts CalculatorSubTest -tc CalculatorSubTest.interger_sub_00l
1169	run -t UT -cov coverage
1170	run -t UT -ra random
1171	run -t UT -ts base_object_test --repeat 5
1172	run -hl
1173	run -rh 3
1174	run --retry
1175	```
1176
1177
1178	执行命令参数说明:
1179	```
1180	-t [TESTTYPE]: 指定测试用例类型,有UT,MST,ST,PERF,FUZZ,BENCHMARK,另外还有ACTS,HATS等。(必选参数)
1181	-tp [TESTPART]: 指定部件,可独立使用。
1182	-tm [TESTMODULE]: 指定模块,不可独立使用,需结合-tp指定上级部件使用。
1183	-ts [TESTSUITE]: 指定测试套,可独立使用。
1184	-tc [TESTCASE]: 指定测试用例,同时需要注明测试套内class名称,不可独立使用,需结合-ts指定上级测试套使用。
1185	-cov [COVERAGE]: 覆盖率执行参数。
1186	-h : 帮助命令
1187	-ra [random]: c++用例乱序执行参数。
1188	--repeat : 支持设置用例执行次数。
1189	-hl [HISTORYLIST]: 显示最近10条测试用例,超过10条,只显示最近10条。
1190	-rh [RUNHISTORY]: 执行历史记录的第几条记录运行。
1191	--retry:检查上次运行结果,如果有失败用例则重复测试。
1192	```
1193
1194
1195### Linux环境执行
1196
1197
1198#### 映射远程端口及修改配置文件
1199为支持Linux远程服务器以及Linux虚拟机两种环境下执行测试用例,需要对端口进行远程映射,以实现与设备的数据通路连接。具体操作如下:
12001. HDC Server指令:
1201	```
1202	hdc_std kill
1203	hdc_std -m -s 0.0.0.0:8710
1204	```
1205	> **说明:**
1206	>
1207	> IP和端口号为默认值。
1208
12092. HDC Client指令:
1210	```
1211	hdc_std -s xx.xx.xx.xx:8710 list targets
1212	```
1213	> **说明:**
1214	>
1215	> 此处IP填写设备侧IP地址。
1216
12173. 修改配置文件user_config.xml
1218	```xml
1219	<build>
1220	  <!-- 测试用例需要编译时,此标签属性为true,反之为false -->
1221	  <testcase>true</testcase>
1222	</build>
1223	<environment>
1224    <!-- 需要配置IP为远程映射机器的IP,端口即为8710,sn号为设备的sn号,以支持HDC连接的设备 -->
1225    <device type="usb-hdc">
1226      <ip></ip>
1227      <port></port>
1228      <sn></sn>
1229    </device>
1230	<environment>
1231	```
1232
1233
1234#### 执行用例命令
12351. 启动测试框架
1236	```
1237	./start.sh
1238	```
12392. 选择产品形态
1240
1241    进入测试框架,系统会自动提示您选择产品形态,请根据实际的开发板进行选择。
1242
1243	若需要自测试框架编译测试用例,且没有找到需要的产品形态需手动添加,请在config/framework_config.xml的\<productform\>标签内增加产品项。
1244
1245	```
1246	<framework_config>
1247	 <productform>
1248	  <option name="ipcamera_hispark_aries" />
1249	  <option name="ipcamera_hispark_taurus" />
1250	  <option name="wifiiot_hispark_pegasus" />
1251	  <option name="" />
1252	 </productform>
1253	</framework_config>
1254
1255	```
1256
12573. 执行测试用例
1258
1259    1) TDD命令
1260
1261    测试框架在执行用例时会根据指令找到所需用例,自动实现用例编译,执行过程,完成自动化测试。
1262	```
1263	run -t UT
1264	run -t UT -tp PartName
1265	run -t UT -tp PartName -tm TestModuleName
1266	run -t UT -tp ability_base -ts base_object_test
1267	run -t UT -tp PartName -tm TestModuleName -ts CalculatorSubTest
1268	run -t UT -ts base_object_test
1269	run -t UT -ts base_object_test -tc AAFwkBaseObjectTest.BaseObject_test_001
1270	run -t UT -ts CalculatorSubTest -tc CalculatorSubTest.interger_sub_00l
1271	run -t -cov coverage
1272	run -t UT -ra random
1273	run -t UT -tp PartName -pd partdeps
1274	run -t UT -ts base_object_test --repeat 5
1275	run -hl
1276	run -rh 3
1277	run --retry
1278	```
1279	执行命令参数说明:
1280	```
1281	-t [TESTTYPE]: 指定测试用例类型(必选参数),有UT,MST,ST,PERF,FUZZ,BENCHMARK等。
1282	-tp [TESTPART]: 指定部件,可独立使用。
1283	-tm [TESTMODULE]: 指定模块,不可独立使用,需结合-tp指定上级部件使用。
1284	-ts [TESTSUITE]: 指定测试套,可独立使用。
1285	-tc [TESTCASE]: 指定测试用例,同时需要注明测试套内class名称,不可独立使用,需结合-ts指定上级测试套使用。
1286	-cov [COVERAGE]: 覆盖率执行参数。
1287	-h : 帮助命令
1288	-ra [random]: c++用例乱序执行参数
1289	-pd [partdeps]: 二级依赖部件执行参数
1290	--repeat : 支持设置用例执行次数。
1291	-hl [HISTORYLIST]: 显示最近10条测试用例,超过10条,只显示最近10条。
1292	-rh [RUNHISTORY]: 执行历史记录的第几条记录运行。
1293	--retry:检查上次运行结果,如果有失败用例则重复测试。
1294	```
1295
1296	在Linux下可以使用help命令查看有哪些产品形态、测试类型、支持的子系统、部件。
1297	```
1298	查看帮助命令:help
1299	查看show命令:help show
1300	查看支持的设备形态:   show productlist
1301	查看支持的测试类型:   show typelist
1302	查看支持的测试子系统: show subsystemlist
1303	查看支持的测试部件:   show partlist
1304	```
1305	2) ACTS/HATS命令
1306
1307	当选择完产品形态,可以参考如下执行ACTS或HATS测试用例。
1308	```
1309	run -t ACTS
1310	run -t HATS
1311	run -t ACTS -ss arkui
1312	run -t ACTS -ss arkui, modulemanager
1313	run -t ACTS -ss arkui -ts ActsAceEtsTest
1314	run -t HATS -ss telephony -ts HatsHdfV1RilServiceTest
1315	run -t ACTS -ss arkui -tp ActsPartName
1316	run -t ACTS -ss arkui -ts ActsAceEtsTest,ActsAceEtsResultTest
1317	run -t HATS -ss powermgr -ts HatsPowermgrBatteryTest,HatsPowermgrThermalTest
1318	run -t ACTS -ss arkui -ts ActsAceEtsTest -ta class:alphabetIndexerTest#alphabetIndexerTest001
1319	run -t ACTS -ss arkui -ts ActsAceEtsTest -ta class:alphabetIndexerTest#alphabetIndexerTest001 --repeat 2
1320	run -hl
1321	run -rh 1
1322	run --retry
1323	```
1324	执行命令参数说明,ACTS和HATS命令参数一致,与TDD有所不同:
1325	```
1326	-t [TESTTYPE]: 指定测试用例类型(必选参数),有ACTS,HATS等。
1327	-ss [SUBSYSTEM]: 指定子系统,可单独使用,且可以执行多个子系统,用逗号隔开。
1328	-tp [TESTPART]: 指定部件,可独立使用。
1329	-ts [TESTSUITE]: 指定测试套,可独立使用,且可以执行多个测试套,用逗号隔开。
1330	-ta [TESTARGS]: 指定测试类测试方法,需结合-ts指定上级测试套使用。
1331	--repeat : 支持设置用例执行次数。
1332	-hl [HISTORYLIST]: 显示最近10条测试用例,超过10条,只显示最近10条。
1333	-rh [RUNHISTORY]: 执行历史记录的第几条记录运行。
1334	--retry:检查上次运行结果,如果有失败用例则重复测试。
1335	```
1336
1337## 查看测试结果
1338
1339
1340当执行完测试指令,控制台会自动生成测试结果,若需要详细测试报告,您可在以下路径中进行查找相应的数据文档。
1341
1342测试结果输出根路径如下:
1343```
1344test/developertest/reports/xxxx_xx_xx_xx_xx_xx
1345```
1346> **说明:**
1347>
1348> 测试报告文件目录将自动生成。
1349
1350该目录中包含以下几类结果:
1351| 类型                                 | 描述               |
1352| ------------------------------------ | ------------------ |
1353| result/                              | 测试用例格式化结果 |
1354| log/plan_log_xxxx_xx_xx_xx_xx_xx.log | 测试用例日志       |
1355| summary_report.html                  | 测试报告汇总       |
1356| details_report.html                  | 测试报告详情       |
1357
1358
1359
1360## 执行覆盖率用例
1361各子系统可按照以下方式,执行用例,生成gcda数据后方可生成覆盖率报告。
1362
13631. (可选执行)为了屏蔽非核心代码产生的冗余分支数据,可以在源码编译之前进入/test/testfwk/developer_test/localCoverage/restore_comment目录下执行:
1364
1365       python3 build_before_generate.py
1366
1367   选择编译时要屏蔽的部件,执行命令例如:
1368
1369       run -tp partname
1370       run -tp partname1 partname2
13712. 编译版本之前首先修改编译选项,在涉及到的子系统build.gn文件中添加cflags或cflags_cc及ldflags选项,都需要加--coverage字段:
1372
1373       ldflags = [ "--coverage" ]
1374       C:   cflags = [ "--coverage" ]
1375       C++: cflags_cc = [ "--coverage" ]
1376
1377   **推荐:**     也可以参考窗口子系统的方式(推荐这种方式),参考链接:https://gitee.com/openharmony/window_window_manager/pulls/1274/files
13783. 执行覆盖率用例需要安装以下依赖包:
1379
1380       1)安装lcov, 安装命令:sudo apt install lcov
1381       2)安装dos2unix, 安装命令:apt install dos2unix.
1382       3)安装lxml, 安装命令: pip install lxml
1383       4)安装selectolax, 安装命令: pip install selectolax
1384       5)安装CppHeaderParser, 安装命令 pip install CppHeaderParser
1385
13864. 远程映射设备,修改usr_config.xml中的ip号,设备映射方式查看上面介绍的远程端口映射。
1387
1388       <!-- 配置远程映射机器的IP(设备挂载的pc的ip) -->
1389       <device type="usb-hdc">
1390         <ip></ip>
1391         <port></port>
1392         <sn></sn>
1393       </device>
1394
13955. 执行 ./start.sh,输入运行命令,示例如下:
1396
1397       run -t UT -tp 部件名 -cov coverage
1398       run -t UT -ss 子系统名 -cov coverage
1399       run -t UT -ss 子系统名 -tp 部件名 -cov coverage
1400       run -t UT MST ST -tp 部件名 -cov coverage
1401
1402   **注意:** 执行以上命令必须添加 -cov coverage 参数
1403
14046. 从以下路径获取覆盖率报告:
1405
1406   代码覆盖率报告:/test/testfwk/developer_test/localCoverage/codeCoverage/results/coverage/reports/cxx/html
1407
1408   接口覆盖率报告:/test/testfwk/developer_test/localCoverage/interfaceCoverage/results/coverage/interface_kits/html
1409