测试用例开发指导
概述
基本概念
测试子系统提供基于python开发的一键式的开发者自测试平台,支持跨平台使用以及三方测试框架拓展,主要包括测试用例编译、测试用例管理、测试用例调度分发、测试用例执行、测试结果收集、测试报告生成、测试用例模板、测试环境管理等模块。
在测试子系统开发前,开发者应先了解以下概念:
-
测试用例编译
支持将测试用例源代码编译成可在被测设备侧执行的二进制文件。
-
测试用例调度分发
支持将测试用例通过网口通道或者串口通道分发到不同的被测设备上,并且为每一个测试用例分配特定的测试用例执行器。
-
测试用例执行器
负责测试用例的预处理,用例执行,结果记录等执行逻辑。
-
测试用例模板
定义了测试用例以及用例编译配置GN文件的统一格式。
-
测试平台kit
测试平台运行过程中公共方法,如提供测试用例目录向被测设备挂载文件系统,测试用例推送到被测设备,或者从被测设备获取测试结果等操作。
-
测试报告生成
定义开发者自测试报告模板,生成web测试报告。
-
测试环境管理
支持通过USB、串口等方式管理被测设备,功能包括设备发现,设备状态查询等。
运作机制
- 测试平台架构图如下:
- 测试平台运行时序图如下:
- 测试平台运行原理
测试平台通过shell脚本启动,以命令行方式支持一系列的测试指令执行,通过命令行输出测试结果。
约束与限制
- 功能使用范围:开发自测试平台仅支持代码级的测试用例开发和验证,如单元测试,模块测试。
- 规格限制:当前测试框架的适用范围仅支持白盒测试。
- 操作限制:一台测试设备上仅支持启动单个测试平台。
搭建环境
环境要求
表 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.
-
安装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)
-
安装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 检验环境
开发指导
场景介绍
针对开发的业务代码进行白盒测试验证。
接口说明
测试框架集成了开源的单元测试框架,并对测试用例的宏定义做了扩展,具体框架说明详见开源官方文档。
表 3 测试框架扩展宏定义说明
开发步骤
-
按照开发者测试用例目录规划定义测试套文件,需要继承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 <gtest/gtest.h> 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(); };
说明: 测试用例规范
- 命名规范 测试用例源文件名称和测试套内容保持一致,测试套与用例之间关系1:N,测试套与测试源文件之间关系1:1,每个源文件全局唯一,格式:[特性]_[功能]_[子功能1]_[子功能1.1],子功能支持向下细分。 文件命名采用全小写+下划线方式命名,以test结尾,如demo用例:developertest/examples/lite/cxx_demo
- 测试用例编码规范 开发者测试用例原则上与特性代码编码规范保持一致,另外需要添加必要的用例描述信息,详见•自测试用例模板。
- 测试用例编译配置规范 测试用例采用GN方式编译,配置遵循本开源项目的编译指导。
- 测试用例模板 详见测试demo用例:developertest/examples/lite/cxx_demo/test/unittest/common/calc_subtraction_test.cpp
-
实现测试套执行过程需要的预处理操作和后处理操作,即实现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 }
-
针对被测对象的特性编写测试用例,以使用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)); }
说明:
- @tc.name:用例名称,对测试目的简要描述。
- @tc.desc:描述用例详细描述,包括测试目的、测试步骤、期望结果等。
- @tc.type:测试属性分类(FUNC、PERF、SECU、RELI)。
- @tc.require:需求编号或者issue编号,用来将修改与用例关联。
-
编写用例编译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 = [] }
-
将用例编译目标添加到子系统编译配置中,保证用例随版本一起编译,举例说明:
-
支持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", ... ... ] }, ... ... }
-
仅支持串口的设备,编译配置示例路径: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" ] } }
-
-
编写测试用例资源配置,当测试用例需要使用静态测试资源文件时使用该配置。
-
在部件或者模块的test目录下创建resource目录。
-
在resource目录下创建形态目录,如phone。
-
在设备形态目录下创建一个以模块名命名的文件夹,如testmodule。
-
在模块目录下创建一个ohos_test.xml文件,文件内容格式如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration ver="2.0"> <target name="DetectorFileTest"> <preparer> <option name="push" value="test.txt -> /data/test/resource" src="res"/> </preparer> </target> </configuration>
-
在测试用例的编译配置文件中定义resource_config_file,用来指定对应的资源文件ohos_test.xml。
说明: 如上资源文件功能:将resource目录下的test.txt文件通过hdc push命令推送到被测设备的/data/test/resource目录下。
-
-
以上步骤完成即完成测试用例编写,即可执行测试用例。
说明:
- 支持hdc连接的设备,测试用例支持单独编译。
- 仅支持串口连接的设备,在代码根路径下执行编译debug版本的命令,即可编译测试用例。 测试用例用例的执行详见测试平台使用。
开发实例
测试子系统代码仓提供了完整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)); }
测试平台使用
-
(可选)安装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
-
修改developertest/config/user_config.xml 文件配置developertest组件。
-
测试框架通用配置。
[build] # 配置测试用例的编译参数,例如:
<build> <example>false</example> <version>false</version> <testcase>true</testcase> ... ... </build>
说明: 测试用例的编译参数说明如下: example:是否编译测试用例示例,默认false。 version:是否编译测试版本,默认false。 testcase:是否编译测试用例,默认true。
-
支持hdc连接的被测设备。
[device] # 配置标签为usb-hdc的环境信息,测试设备的IP地址和hdc映射的端口号,例如:
<device type="usb-hdc"> <ip>192.168.1.1</ip> <port>9111</port> <sn></sn> </device>
-
仅支持串口的被测设备。
[board_info] # 开发板配置信息,例如:
<board_info> <board_series>hispark</board_series> <board_type>taurus</board_type> <board_product>ipcamera</board_product> <build_command>hb build</build_command> </board_info>
说明: 开发板配置信息如下: board_series:开发板系列,默认hispark。 board_type:开发板类型,默认taurus。 board_product:目标产品,默认ipcamera。 build_command:测试版本和用例的编译命令,默认hb build。
[device] # 配置标签为ipcamera的串口信息,COM口和波特率,例如:
<device type="com" label="ipcamera"> <serial> <com>COM1</com> <type>cmd</type> <baud_rate>115200</baud_rate> <data_bits>8</data_bits> <stop_bits>1</stop_bits> <timeout>1</timeout> </serial> </device>
-
-
(可选)修改developertest组件配置。如果测试用例已完成编译,可以直接指定测试用例的编译输出路径,测试平台执行用例时即不会重新编译测试用例。
配置文件:config/user_config.xml
-
[test_cases] # 指定测试用例的输出路径,编译输出目录,例如:
<test_cases> <dir>/home/opencode/out/release/tests</dir> </test_cases>
-
[NFS] # 被测设备仅支持串口时配置,指定NFS的映射路径,host_dir为PC侧的NFS目录,board_dir为板侧创建的目录,例如:
<NFS> <host_dir>D:\nfs</host_dir> <board_dir>user</board_dir> </NFS>
-
-
(可选)测试环境准备。当被测设备仅支持串口时,需要检查。
- 系统镜像与文件系统已烧录进开发板,开发板上系统正常运行,在系统模式下,如使用shell登录时,设备提示符是“OHOS#”。
- 开发主机和开发板串口连接正常,网口连接正常。
- 开发主机IP与开发板IP处在同一小网网段,相互可以ping通。
- 开发主机侧创建空目录用于开发板通过NFS挂载测试用例,并且NFS服务启动正常。
-
(必选)启动测试平台,执行测试用例。
-
启动测试框架,打开test/developertest目录,执行启动脚本。
-
Windows环境启动测试框架,执行如下脚本:
start.bat
-
Linux环境启动测试框架。
./start.sh
-
-
设备形态选择。
根据实际的开发板选择,设备形态配置:developertest/config/framework_config.xml。
-
执行测试指令。
-
查询测试用例支持的子系统,模块,产品形态以及测试类型,使用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
-
执行测试指令,其中-t为必选,-ss和-tm为可选字段,示例如下:
run -t ut -ss subsystem_examples -tm calculator
-
参数说明:指定参数可以执行特定特性、模块对应的测试套。
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
-
-
(必选)查看测试结果与日志,通过在测试平台中执行测试指令,即可在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组件包结构说明
开发者测试平台developertest组件包结构说明,代码目录test/developertest,详见下表所示:
表 5 developertest组件包结构说明