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.bat或start.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