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