# 测试 - [概述](#section12403172115920) - [基本概念](#section53632272090) - [运作机制](#section2394431106) - [约束与限制](#section2029921310472) - [搭建环境](#section175012297491) - [环境要求](#section935055691014) - [安装环境](#section6511193210111) - [检验环境是否搭建成功](#section1899144517117) - [开发指导](#section16741101301210) - [场景介绍](#section93782214124) - [接口说明](#section54131732101218) - [开发步骤](#section53541946111218) - [开发实例](#section7477121918136) - [测试平台使用](#section76401945124810) - [包结构说明](#section1875515364133) ## 概述 ### 基本概念 测试子系统提供基于python开发的一键式的开发者自测试平台,支持跨平台使用以及三方测试框架拓展,主要包括测试用例编译、测试用例管理、测试用例调度分发、测试用例执行、测试结果收集、测试报告生成、测试用例模板、测试环境管理等模块。 在测试子系统开发前,开发者应先了解以下概念: - 测试用例编译 支持将测试用例源代码编译成可在被测设备侧执行的二进制文件。 - 测试用例调度分发 支持将测试用例通过网口通道或者串口通道分发到不同的被测设备上,并且为每一个测试用例分配特定的测试用例执行器。 - 测试用例执行器 负责测试用例的预处理,用例执行,结果记录等执行逻辑。 - 测试用例模板 定义了测试用例以及用例编译配置GN文件的统一格式。 - 测试平台kit 测试平台运行过程中公共方法,如提供测试用例目录向被测设备挂载文件系统,测试用例推送到被测设备,或者从被测设备获取测试结果等操作。 - 测试报告生成 定义开发者自测试报告模板,生成web测试报告。 - 测试环境管理 支持通过USB、串口等方式管理被测设备,功能包括设备发现,设备状态查询等。 ### 运作机制 - 测试平台架构图如下: **图 1** 测试平台架构 ![](figure/测试平台架构.png "测试平台架构") - 测试平台运行时序图如下: **图 2** 测试平台运行时序 ![](figure/测试平台运行时序.png "测试平台运行时序") - 测试平台运行原理 测试平台通过shell脚本启动,以命令行方式支持一系列的测试指令执行,通过命令行输出测试结果。 ## 约束与限制 - 功能使用范围:开发自测试平台仅支持代码级的测试用例开发和验证,如单元测试,模块测试。 - 规格限制:当前测试框架的适用范围仅支持白盒测试。 - 操作限制:一台测试设备上仅支持启动单个测试平台。 ## 搭建环境 ### 环境要求 **表 1** **环境要求**

项目

测试设备

被测设备

硬件

  • 内存:8G及以上
  • 硬盘:100G及以上
  • 硬件架构:X86或ARM64
  • Hi3516 DV300开发板
  • Hi3518 EV300开发板

软件

  • 操作系统:Windows 10 64位 或 Ubuntu 18.04

    系统组件(Linux): libreadline-dev

  • Python:3.7.5及以上
  • Python插件:pyserial3.3及以上、paramiko2.7.1及以上、setuptools40.8.0及以上,rsa4.0及以上
  • NFS Server:haneWIN NFS Server1.2.50及以上或者 NFSv4及以上
  • 系统软件:版本不低于OpenHarmony 1.0
  • 内核类型:LiteOS-A或者Linux
### 安装环境 1. 如测试环境为Linux,需要安装系统组件readline,命令如下: ``` sudo apt-get install libreadline-dev ``` 安装成功提示如下: ``` Reading package lists... Done Building dependency tree Reading state information... Done libreadline-dev is already the newest version (7.0-3). 0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. ``` 2. 安装Python扩展组件setuptools、(rsa、paramiko、以及pyserial,设备仅支持串口时安装),命令如下: 1、安装setuptools,安装命令如下: ``` pip install setuptools ``` 安装成功提示如下: ``` Requirement already satisfied: setuptools in d:\programs\python37\lib\site-packages (41.2.0) ``` 2、安装rsa,安装命令如下: ``` pip install rsa ``` 安装成功提示如下: ``` Installing collected packages: pyasn1, rsa Successfully installed pyasn1-0.4.8 rsa-4.7 ``` 3、安装Paramiko,安装命令如下: ``` pip install paramiko ``` 安装成功提示如下: ``` Installing collected packages: pycparser, cffi, pynacl, bcrypt, cryptography, paramiko 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 ``` 4、安装pyserial(被测设备仅支持串口时安装),安装命令如下: ``` pip install pyserial ``` 安装成功提示如下: ``` Requirement already satisfied: pyserial in d:\programs\python37\lib\site-packages\pyserial-3.4-py3.7.egg (3.4) ``` 3. 安装NFS server(被测设备仅支持串口时安装)。 **Windows环境安装** 下载并安装haneWIN NFS Server1.2.50,地址:https://www.hanewin.net/nfs-e.htm **Linux环境下安装** ``` sudo apt install nfs-kernel-server ``` 所有环境配置安装完成,即可在IDE中进行测试平台代码开发调试,推荐的IDE为 DevEco Studio。 ### 检验环境是否搭建成功 **表 2** **检验环境**

检查项

操作

满足条件

检查python安装与否,版本是否满足要求。

命令行窗口执行命令:python --version。

版本不小于3.7.5即可。

检查python扩展插件安装与否。

打开test/xdevice目录,执行run.bat或run.sh。

可进入提示符“>>>”界面即可。

检查NFS Server启动状态(被测设备仅支持串口时检测)。

通过串口登录开发板,执行mount命令挂载NFS。

可正常挂载文件目录即可。

## 开发指导 ### 场景介绍 针对对开发的业务代码进行白盒测试验证。 ### 接口说明 测试框架集成了开源的单元测试框架,并对测试用例的宏定义做了扩展,具体框架说明详见开源官方文档。 **表 3** 测试框架扩展宏定义说明

宏定义

描述

HWTEST

测试用例执行不依赖Setup&Teardown。HWTEST对TEST增加了“用例级别”参数“TestSize.Level1”,例如HWTEST(CalculatorAddTest, TestPoint_001, TestSize.Level1)。

HWTEST_F

测试用例(不带参数)执行依赖Setup&Teardown。HWTEST_F对TEST_F增加了“用例级别”参数“ TestSize.Level1”,例如HWTEST_F(CalculatorAddTest, TestPoint_001, TestSize.Level1)。

HWTEST_P

测试用例(带参数)执行依赖Setup&Teardown。HWTEST_P对TEST_P增加了“用例级别”参数“ TestSize.Level1”,例如HWTEST_P(CalculatorAddTest, TestPoint_001, TestSize.Level1)。

### 开发步骤 1. 按照开发者测试用例目录规划定义测试套文件,需要继承testing::Test类,命名以被测特性+Test命名,示例代码路径:test/developertest/examples/lite/cxx\_demo/test/unittest/common/calc\_subtraction\_test.cpp ``` /* * Copyright (c) 2020 OpenHarmony. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include using namespace std; using namespace testing::ext; class CalcSubtractionTest : public testing::Test { public: static void SetUpTestCase(void); static void TearDownTestCase(void); void SetUp(); void TearDown(); }; ``` >![](../public_sys-resources/icon-note.gif) **说明:** >测试用例规范 >- 命名规范 > 测试用例源文件名称和测试套内容保持一致,测试套与用例之间关系1:N,测试套与测试源文件之间关系1:1,每个源文件全局唯一,格式:\[特性\]\_\[功能\]\_\[子功能1\]\_\[子功能1.1\],子功能支持向下细分。 > 文件命名采用全小写+下划线方式命名,以test结尾,如demo用例:developertest/examples/lite/cxx\_demo >- 测试用例编码规范 > 开发者测试用例原则上与特性代码编码规范保持一致,另外需要添加必要的用例描述信息,详见[•自测试用例模板](#li2069415903917)。 >- 测试用例编译配置规范 > 测试用例采用GN方式编译,配置遵循本开源项目的[编译指导](subsys-build-mini-lite.md)。 >- 测试用例模板 > 详见测试demo用例:developertest/examples/lite/cxx\_demo/test/unittest/common/calc\_subtraction\_test.cpp 2. 实现测试套执行过程需要的预处理操作和后处理操作,即实现SetUp和TearDown方法。 ``` void CalcSubtractionTest::SetUpTestCase(void) { // step 1: input testsuite setup step } void CalcSubtractionTest::TearDownTestCase(void) { // step 2: input testsuite teardown step } void CalcSubtractionTest::SetUp(void) { // step 3: input testcase setup step } void CalcSubtractionTest::TearDown(void) { // step 4: input testcase teardown step } ``` 3. 针对被测对象的特性编写测试用例,以使用HWTEST\_F为例说明。 ``` /** * @tc.name: integer_sub_001 * @tc.desc: Test Calculator * @tc.type: FUNC * @tc.require: AR00000000 SR00000000 */ HWTEST_F(CalcSubtractionTest, integer_sub_001, TestSize.Level1) { EXPECT_EQ(0, Subtraction(1, 0)); } ``` >![](../public_sys-resources/icon-note.gif) **说明:** >- @tc.name:用例名称,对测试目的简要描述。 >- @tc.desc:描述用例详细描述,包括测试目的、测试步骤、期望结果等。 >- @tc.type:测试属性分类(FUNC、PERF、SECU、RELI)。 >- @tc.require:需求编号或者issue编号,用来将修改与用例关联。

序号

测试类型名称

缩写

测试类型描述

1

功能测试(functionality)

FUNC

验证软件各个功能满足功能设计与规格。

2

性能测试(performance)

PERF

验证软件是否满足性能设计指标。包含负载测试容量测试,压力测试等。

3

安全性测试(security)

SECU

验证软件在生命周期内符合安全需求定义和相关法规。

4

可靠性测试(reliability)

RELI

在规定的条件下,在规定的时间内,软件不引起系统失效的概率,这里也包含稳定性。

4. 编写用例编译GN文件,其中包括定义用例编译目标,添加编译配置依赖,源文件等,举例说明: 示例文件路径:test/developertest/examples/lite/cxx\_demo/test/unittest/common/BUILD.gn)。 ``` import("//build/lite/config/test.gni") unittest("CalcSubTest") { output_extension = "bin" sources = [ "calc_subtraction_test.cpp" ] include_dirs = [] deps = [] } ``` 5. 将用例编译目标添加到子系统编译配置中,保证用例随版本一起编译,举例说明: 1. 支持hdc连接的设备,编译配置示例路径:test/developertest/examples/ohos.build。 ``` { "subsystem": "subsystem_examples", "parts": { "subsystem_examples": { "module_list": [ "//test/developertest/examples/detector:detector", ... ... ], "test_list": [ "//test/developertest/examples/detector/test:unittest", ... ... ] }, ... ... } ``` 2. 仅支持串口的设备,编译配置示例路径:test/developertest/examples/lite/BUILD.gn。 ``` import("//build/lite/config/test.gni") subsystem_test("test") { test_components = [] if(ohos_kernel_type == "liteos_riscv") { features += [ ] }else if(ohos_kernel_type == "liteos_a") { test_components += [ "//test/developertest/examples/lite/cxx_demo/test/unittest/common:CalcSubTest" ] } } ``` 6. 编写测试用例资源配置,当测试用例需要使用静态测试资源文件时使用该配置。 1. 在部件或者模块的test目录下创建resource目录。 2. 在resource目录下创建形态目录,如phone。 3. 在设备形态目录下创建一个以模块名命名的文件夹,如testmodule。 4. 在模块目录下创建一个ohos\_test.xml文件,文件内容格式如下: ``` ``` 5. 在测试用例的编译配置文件中定义resource\_config\_file,用来指定对应的资源文件ohos\_test.xml。 >![](../public_sys-resources/icon-note.gif) **说明:** >如上资源文件功能:将resource目录下的test.txt文件通过hdc push命令推送到被测设备的/data/test/resource目录下。 7. 以上步骤完成即完成测试用例编写,即可执行测试用例。 >![](../public_sys-resources/icon-note.gif) **说明:** >- 支持hdc连接的设备,测试用例支持单独编译。 >- 仅支持串口连接的设备,在代码根路径下执行编译debug版本的命令,即可编译测试用例。 > 测试用例用例的执行详见[测试平台使用](#section76401945124810)。 ## 开发实例 测试子系统代码仓提供了完整demo用例,demo用例路径:test/developertest/examples/。以一个减法运算方法编写测试用例举例说明: - 被测代码如下: ``` static int Subtraction(int a, int b) { return a - b; } ``` - 测试用例代码如下: ``` /** * @tc.name: integer_sub_002 * @tc.desc: Verify the Subtraction function. * @tc.type: FUNC * @tc.require: AR00000000 SR00000000 */ HWTEST_F(CalcSubtractionTest, integer_sub_002, TestSize.Level1) { EXPECT_EQ(1, Subtraction(2, 1)); } ``` ## 测试平台使用 1. (可选)安装xdevice组件。安装xdevice后,xdevice组件可以作为python的扩展包使用。 打开xdevice安装目录:test/xdevice,执行如下命令: ``` python setup.py install ``` 安装成功提示如下: ``` ... ... Installed d:\programs\python37\lib\site-packages\xdevice-0.0.0-py3.7.egg Processing dependencies for xdevice==0.0.0 Searching for pyserial==3.4 Best match: pyserial 3.4 Processing pyserial-3.4-py3.7.egg pyserial 3.4 is already the active version in easy-install.pth Installing miniterm.py script to D:\Programs\Python37\Scripts Using d:\programs\python37\lib\site-packages\pyserial-3.4-py3.7.egg Finished processing dependencies for xdevice==0.0.0 ``` 2. 修改developertest/config/user\_config.xml 文件配置developertest组件。 1. 测试框架通用配置。 \[build\] \# 配置测试用例的编译参数,例如: ``` false false true ... ... ``` >![](../public_sys-resources/icon-note.gif) **说明:** >测试用例的编译参数说明如下: >example:是否编译测试用例示例,默认false。 >version:是否编译测试版本,默认false。 >testcase:是否编译测试用例,默认true。 2. 支持hdc连接的被测设备。 \[device\] \# 配置标签为usb-hdc的环境信息,测试设备的IP地址和hdc映射的端口号,例如: ``` 192.168.1.1 9111 ``` 3. 仅支持串口的被测设备。 \[board\_info\] \# 开发板配置信息,例如: ``` hispark taurus ipcamera hb build ``` >![](../public_sys-resources/icon-note.gif) **说明:** >开发板配置信息如下: >board\_series:开发板系列,默认hispark。 >board\_type:开发板类型,默认taurus。 >board\_product:目标产品,默认ipcamera。 >build\_command:测试版本和用例的编译命令,默认hb build。 \[device\] \# 配置标签为ipcamera的串口信息,COM口和波特率,例如: ``` COM1 cmd 115200 8 1 1 ``` 3. (可选)修改developertest组件配置。如果测试用例已完成编译,可以直接指定测试用例的编译输出路径,测试平台执行用例时即不会重新编译测试用例。 配置文件:config/user\_config.xml 1. \[test\_cases\] \# 指定测试用例的输出路径,编译输出目录,例如: ``` /home/opencode/out/release/tests ``` 2. \[NFS\] \# 被测设备仅支持串口时配置,指定NFS的映射路径,host\_dir为PC侧的NFS目录,board\_dir为板侧创建的目录,例如: ``` D:\nfs user ``` 4. (可选)测试环境准备。当被测设备仅支持串口时,需要检查。 - 系统镜像与文件系统已烧录进开发板,开发板上系统正常运行,在系统模式下,如使用shell登录时,设备提示符是“OHOS\#”。 - 开发主机和开发板串口连接正常,网口连接正常。 - 开发主机IP与开发板IP处在同一小网网段,相互可以ping通。 - 开发主机侧创建空目录用于开发板通过NFS挂载测试用例,并且NFS服务启动正常。 5. (必选)启动测试平台,执行测试用例。 - 启动测试框架,打开test/developertest目录,执行启动脚本。 1. Windows环境启动测试框架,执行如下脚本: ``` start.bat ``` 2. Linux环境启动测试框架。 ``` ./start.sh ``` - 设备形态选择。 根据实际的开发板选择,设备形态配置:developertest/config/framework\_config.xml。 - 执行测试指令。 1. 查询测试用例支持的子系统,模块,产品形态以及测试类型,使用show命令,示例如下: ``` usage: show productlist Querying Supported Product Forms show typelist Querying the Supported Test Type show subsystemlist Querying Supported Subsystems show modulelist Querying Supported Modules ``` 2. 执行测试指令,其中-t为必选,-ss和-tm为可选字段,示例如下: ``` run -t ut -ss subsystem_examples -tm calculator ``` 3. 参数说明:指定参数可以执行特定特性、模块对应的测试套。 ``` usage: run [-h] [-p PRODUCTFORM] [-t [TESTTYPE [TESTTYPE ...]]] [-ss SUBSYSTEM] [-tm TESTMODULE] [-ts TESTSUIT] [-tc TESTCASE] [-tl TESTLEVEL] optional arguments: -h, --help show this help message and exit -p PRODUCTFORM, --productform PRODUCTFORM Specified product form -t [TESTTYPE [TESTTYPE ...]], --testtype [TESTTYPE [TESTTYPE ...]] Specify test type(UT,MST,ST,PERF,ALL) -ss SUBSYSTEM, --subsystem SUBSYSTEM Specify test subsystem -tm TESTMODULE, --testmodule TESTMODULE Specified test module -ts TESTSUIT, --testsuite TESTSUIT Specify test suite -tc TESTCASE, --testcase TESTCASE Specify test case -tl TESTLEVEL, --testlevel TESTLEVEL Specify test level ``` - 测试框架帮助。 帮助指令,用于查询测试平台支持哪些测试指令,如下: ``` help ``` - 退出自测试平台。 退出自测试平台,使用如下命令退出测试平台,如下: ``` quit ``` 6. (必选)查看测试结果与日志,通过在测试平台中执行测试指令,即可在developertest/reports目录下生成测试日志和测试报告。 - 测试用例的结果会直接显示在控制台上,执行一次的测试结果根路径如下: ``` reports/xxxx-xx-xx-xx-xx-xx ``` - 测试用例格式化结果目录如下: ``` result/ ``` - 测试用例日志目录如下: ``` log/plan_log_xxxx-xx-xx-xx-xx-xx.log ``` - 测试报告汇总: ``` summary_report.html ``` - 测试报告详情: ``` details_report.html ``` - 测试平台日志目录如下: ``` reports/platform_log_xxxx-xx-xx-xx-xx-xx.log ``` ## 包结构说明 开发者测试平台xdevice组件包结构说明,代码目录test/xdevice,详见下表所示: **表 4** xdevice组件包结构说明

名称

功能描述

xdevice

测试平台基础组件。

xdevice/src/xdevice

基础测试框架源码。

xdevice/config

基础测试框架配置文件定义。

xdevice/src/xdevice/__main__.py

基础测试框架内部入口。

xdevice/src/xdevice/__init__.py

包依赖定义,插件依赖。

xdevice/src/xdevice/variables.py

全局变量定义。

xdevice/src/xdevice/_core/command

用例输入的命令行处理。

xdevice/src/xdevice/_core/config

基础测试框架的配置管理。

xdevice/src/xdevice/_core/environment

基础测试框架的环境管理,包括设备管理。

xdevice/src/xdevice/_core/executor

基础测试框架用例调度和分发。

xdevice/src/xdevice/_core/driver

基础测试框架测试执行器。

xdevice/src/xdevice/_core/resource

基础测试框架资源文件以及测试报告模板。

xdevice/src/xdevice/_core/testkit

基础测试框架公共操作,包括NFS文件系统挂载等。

xdevice/src/xdevice/_core/logger.py

基础测试框架日志管理。

xdevice/src/xdevice/_core/plugin.py

基础测试框架插件管理。

xdevice/src/xdevice/_core/interface.py

基础测试框架插件接口定义。

xdevice/setup.py

基础测试框架的安装脚本。

xdevice/run.bat

基础测试框架启动脚本(Windows)。

xdevice/run.sh

基础测试框架启动脚本(Linux)。

开发者测试平台developertest组件包结构说明,代码目录test/developertest,详见下表所示: **表 5** developertest组件包结构说明

名称

描述

developertest

开发测试框架。

developertest/src

测试框架源码。

developertest/src/core

测试执行器。

developertest/src/core/build

测试用例编译。

developertest/src/core/command

对用户输入的命令行处理。

developertest/src/core/config

测试框架配置管理。

developertest/src/core/driver

测试框架驱动执行器。

developertest/src/core/resource

测试框架配置文件。

developertest/src/core/testcase

测试用例管理。

developertest/src/core/common.py

测试框架公共操作。

developertest/src/core/constants.py

测试框架全局常量。

developertest/src/core/exception.py

测试框架异常定义。

developertest/src/core/utils.py

测试框架工具方法。

developertest/src/main

测试框架平台。

developertest/src/main/__main__.py

测试框架内部入口。

developertest/examples

测试框架demo用例。

developertest/third_party

测试框架依赖第三方组件适配。

developertest/BUILD.gn

测试子系统编译配置。

developertest/start.bat

开发者测试入口(Windows)。

developertest/start.sh

开发者测试入口(Linux)。