Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
b9128d58
D
Docs
项目概览
OpenHarmony
/
Docs
大约 2 年 前同步成功
通知
161
Star
293
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
b9128d58
编写于
9月 18, 2021
作者:
O
openharmony_ci
提交者:
Gitee
9月 18, 2021
浏览文件
操作
浏览文件
下载
差异文件
!674 Modified the test subsystem
Merge pull request !674 from stivn/master
上级
24009226
e65b2d64
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
825 addition
and
487 deletion
+825
-487
zh-cn/readme/测试子系统.md
zh-cn/readme/测试子系统.md
+825
-487
未找到文件。
zh-cn/readme/测试子系统.md
浏览文件 @
b9128d58
# 测试子系统<a name="ZH-CN_TOPIC_0000001082440445"></a>
# 测试子系统
OpenHarmony为开发者提供了一套全面的自测试框架,开发者可根据测试需求开发相关测试用例,开发阶段提前发现缺陷,大幅提高代码质量。
-
[
简介
](
#section7375710115617
)
本文从基础环境构建,用例开发,编译以及执行等方面介绍OpenHarmony测试框架如何运行和使用。
-
[
目录
](
#section102031353175317
)
## 基础环境构建
-
[
约束
](
#section87444710110
)
测试框架依赖于python运行环境,在使用测试框架之前可参阅以下方式进行配置。
-
[
安装
](
#section1347156474
)
-
[
环境配置
](
../device-dev/subsystems/subsys-testguide-envbuild.md
)
-
[
编写测试用例
](
#section125411936102918
)
-
[
源码获取
](
../device-dev/get-code/sourcecode-acquire.md
)
-
[
使用测试框架
](
#section75882026185016
)
-
[
测试结果与日志
](
#section414715805819
)
-
[
涉及仓
](
#section6299103515474
)
## 简介<a name="section7375710115617"></a>
开发过程采用测试驱动开发模式,开发者基于系统新增特性可以通过开发者自己开发用例保证,对于系统已有特性的修改,也可通过修改项目中原有的测试用例保证,开发者测试旨在帮助开发者在开发阶段就能开发出高质量代码。
## 目录<a name="section102031353175317"></a>
## 测试框架目录简介
以下是测试框架的目录层级架构,在使用测试框架过程中可在相应目录查找对应组件。
```
```
test/
test # 测试子系统
├── developertest # 开发者测试框架
├── developertest # 开发者测试组件
│ ├── aw # 测试框架的静态库
│ ├── aw # 测试框架的静态库
│ ├── config # 测试框架配置
│ ├── config # 测试框架配置
│ ├── examples # 测试用例示例
│ │ │ ...
│ ├── src # 测试框架源码
│ │ └── user_config.xml # 用户使用配置
│ ├── third_party # 测试框架依赖第三方组件适配
│ ├── examples # 测试用例示例
│ ├── start.bat # 开发者测试入口(Windows)
│ ├── src # 测试框架源码
│ ├── start.sh # 开发者测试入口(Linux)
│ ├── third_party # 测试框架依赖第三方组件适配
│ └── BUILD.gn # 测试框架编译入口
│ ├── reports # 测试结果报告
├── xdevice # 测试框架基础组件
│ ├── BUILD.gn # 测试框架编译入口
│ ├── config # 框架配置文件
│ ├── start.bat # 开发者测试入口(Windows)
│ ├── extension # 基础组件扩展仓
│ └── start.sh # 开发者测试入口(Linux)
│ ├── resource # 基础组件测试资源
└── xdevice # 测试框架依赖组件
│ └── src # 基础组件源码
└── xts # XTS认证套件
```
```
## 测试用例编写
### 测试用例目录规划
使用测试框架过程中,可根据以下层级关系规划测试用例目录。
```
subsystem # 子系统
├── partA # 部件A
│ ├── moduleA # 模块A
│ │ ├── include
│ │ ├── src # 业务代码
│ │ └── test # 测试目录
│ │ ├── unittest # 单元测试
│ │ │ ├── common # 公共用例
│ │ │ │ ├── BUILD.gn # 测试用例编译配置
│ │ │ │ ├── testA_test.cpp # 单元测试用例源码
│ │ │ ├── phone # 手机形态用例
│ │ │ ├── ivi # 车机形态用例
│ │ │ └── liteos-a # ipcamera使用liteos内核的用例
│ │ └── resource # 依赖资源
│ │ └── ohos_test.xml
│ ├── moduleB # 模块B
│ ├── test
│ │ └── moduletest # 模块测试
│ │ ├── common
│ │ ├── phone
│ │ ├── ivi
│ │ └── liteos-a
│ │ ...
│ └── ohos_build # 编译入口配置
...
```
> **注意:** 测试用例根据不同设备形态差异分为通用用例和非通用用例,建议将通用用例存放在common目录下,非通用用例存放在相应设备形态目录下。
### 测试用例编写
本测试框架支持多种语言用例编写,针对不同语言提供了不同的模板以供编写参考。
**C++参考示例**
-
用例源文件命名规范
测试用例源文件名称和测试套内容保持一致,文件命名采用全小写+下划线方式命名,以test结尾,具体格式为:[功能]_[子功能]_test,子功能支持向下细分。
示例:
```
calculator_sub_test.cpp
```
-
用例示例
```
/*
* Copyright (c) 2021 XXXX Device Co., Ltd.
* 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 "calculator.h"
#include <gtest/gtest.h>
using namespace testing::ext;
class CalculatorSubTest : public testing::Test {
public:
static void SetUpTestCase(void);
static void TearDownTestCase(void);
void SetUp();
void TearDown();
};
void CalculatorSubTest::SetUpTestCase(void)
{
// input testsuit setup step,setup invoked before all testcases
}
void CalculatorSubTest::TearDownTestCase(void)
{
// input testsuit teardown step,teardown invoked after all testcases
}
void CalculatorSubTest::SetUp(void)
{
// input testcase setup step,setup invoked before each testcases
}
void CalculatorSubTest::TearDown(void)
{
// input testcase teardown step,teardown invoked after each testcases
}
/**
* @tc.name: integer_sub_001
* @tc.desc: Verify the sub function.
* @tc.type: FUNC
* @tc.require: Issue Number
*/
HWTEST_F(CalculatorSubTest, integer_sub_001, TestSize.Level1)
{
// step 1:调用函数获取结果
int actual = Sub(4,0);
// Step 2:使用断言比较预期与实际结果
EXPECT_EQ(4, actual);
}
```
详细内容介绍:
1.
添加测试用例文件头注释信息
```
/*
* Copyright (c) 2021 XXXX Device Co., Ltd.
* 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.
*/
```
2. 引用测试框架头文件和命名空间
```
#include
<gtest
/
gtest.h
>
using namespace testing::ext;
```
3. 添加被测试类的头文件
```
#include "calculator.h"
```
4.
定义测试套(测试类)
```
class CalculatorSubTest : public testing::Test {
public:
static void SetUpTestCase(void);
static void TearDownTestCase(void);
void SetUp();
void TearDown();
};
void CalculatorSubTest::SetUpTestCase(void)
{
// input testsuit setup step,setup invoked before all testcases
}
void CalculatorSubTest::TearDownTestCase(void)
{
// input testsuit teardown step,teardown invoked after all testcases
}
void CalculatorSubTest::SetUp(void)
{
// input testcase setup step,setup invoked before each testcases
}
void CalculatorSubTest::TearDown(void)
{
// input testcase teardown step,teardown invoked after each testcases
}
```
> **注意:** 在定义测试套时,测试套名称应与编译目标保持一致,采用大驼峰风格。
5. 测试用例实现,包含用例注释和逻辑实现
```
/
**
*
@tc.name: integer_sub_001
*
@tc.desc: Verify the sub function.
*
@tc.type: FUNC
*
@tc.require: Issue Number
*
/
HWTEST_F(CalculatorSubTest, integer_sub_001, TestSize.Level1)
{
//step 1:调用函数获取结果
int actual = Sub(4,0);
//Step 2:使用断言比较预期与实际结果
EXPECT_EQ(4, actual);
}
```
在编写用例时,我们提供了三种用例模板供您选择。
| 类型 | 描述 |
| ------------| ------------|
| HWTEST(A,B,C)| 用例执行不依赖Setup&Teardown时,可选取|
| HWTEST_F(A,B,C)| 用例执行(不含参数)依赖于Setup&Teardown时,可选取|
| HWTEST_P(A,B,C)| 用例执行(含参数)依赖于Set&Teardown时,可选取|
其中,参数A,B,C的含义如下:
- 参数A为测试套名。
- 参数B为测试用例名,其命名必须遵循[功能点]_[编号]的格式,编号为3位数字,从001开始。
- 参数C为测试用例等级,具体分为门禁level0 以及非门禁level1-level4共五个等级,其中非门禁level1-level4等级的具体选取规则为:测试用例功能越重要,level等级越低。
**注意:**
- 测试用例的预期结果必须有对应的断言。
- 测试用例必须填写用例等级。
- 测试体建议按照模板分步实现。
- 用例描述信息按照标准格式@tc.xxx value书写,注释信息必须包含用例名称,用例类型,需求编号四项。其中用例测试类型@tc.type参数的选取,可参考下表。
| 测试类型名称|功能测试|性能测试|可靠性测试|安全测试|模糊测试|
| ------------|------------|------------|------------|------------|------------|
| 类型编码|FUNC|PERF|RELI|SECU|FUZZ|
**JavaScript参考示例**
-
用例源文件命名规范
测试用例原文件名称采用大驼峰风格,以TEST结尾,具体格式为:[功能][子功能]TEST,子功能支持向下细分。
示例:
```
AppInfoTest.js
```
-
用例示例
```
/*
* Copyright (C) 2021 XXXX Device Co., Ltd.
* 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.
*/
import app from '@system.app'
import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'
describe("AppInfoTest", function () {
beforeAll(function() {
// input testsuit setup step,setup invoked before all testcases
console.info('beforeAll caled')
})
afterAll(function() {
// input testsuit teardown step,teardown invoked after all testcases
console.info('afterAll caled')
})
beforeEach(function() {
// input testcase setup step,setup invoked before each testcases
console.info('beforeEach caled')
})
afterEach(function() {
// input testcase teardown step,teardown invoked after each testcases
console.info('afterEach caled')
})
/*
* @tc.name:appInfoTest001
* @tc.desc:verify app info is not null
* @tc.type: FUNC
* @tc.require: Issue Number
*/
it("appInfoTest001", 0, function () {
//step 1:调用函数获取结果
var info = app.getInfo()
//Step 2:使用断言比较预期与实际结果
expect(info != null).assertEqual(true)
})
})
```
详细内容介绍:
1.
添加测试用例文件头注释信息
```
/*
* Copyright (C) 2021 XXXX Device Co., Ltd.
* 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.
*/
```
2. 导入被测api和jsunit测试库
```
import app from '@system.app'
import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'
```
3. 定义测试套(测试类)
```
describe("AppInfoTest", function () {
beforeAll(function() {
// input testsuit setup step,setup invoked before all testcases
console.info('beforeAll caled')
})
afterAll(function() {
// input testsuit teardown step,teardown invoked after all testcases
console.info('afterAll caled')
})
beforeEach(function() {
// input testcase setup step,setup invoked before each testcases
console.info('beforeEach caled')
})
afterEach(function() {
// input testcase teardown step,teardown invoked after each testcases
console.info('afterEach caled')
})
```
4.
测试用例实现
```
/*
* @tc.name:appInfoTest001
* @tc.desc:verify app info is not null
* @tc.type: FUNC
* @tc.require: Issue Number
*/
it("appInfoTest001", 0, function () {
//step 1:调用函数获取结果
var info = app.getInfo()
//Step 2:使用断言比较预期与实际结果
expect(info != null).assertEqual(true)
})
```
### 测试用例编译文件编写
根据测试用例目录规划,当执行某一用例时,测试框架会根据编译文件逐层查找,最终找到所需用例进行编译。下面通过不同示例来讲解gn文件如何编写。
#### 测试用例编译配置文件
针对不同语言,下面提供不同的编译模板以供参考。
- **C++用例编译配置示例**
```
# Copyright (c) 2021 XXXX Device Co., Ltd.
import("//build/test.gni")
module_output_path = "subsystem_examples/calculator"
config("module_private_config") {
visibility = [ ":*" ]
include_dirs = [ "../../../include" ]
}
ohos_unittest("CalculatorSubTest") {
module_out_path = module_output_path
sources = [
"../../../include/calculator.h",
"../../../src/calculator.cpp",
]
sources += [ "calculator_sub_test.cpp" ]
configs = [ ":module_private_config" ]
deps = [ "//third_party/googletest:gtest_main" ]
}
group("unittest") {
testonly = true
deps = [":CalculatorSubTest"]
}
```
详细内容如下:
1. 添加文件头注释信息
```
# Copyright (c) 2021 XXXX Device Co., Ltd.
```
2. 导入编译模板文件
```
import("//build/test.gni")
```
3.
指定文件输出路径
```
module_output_path = "subsystem_examples/calculator"
```
> **说明:** 此处输出路径为部件/模块名。
4.
配置依赖包含目录
```
config("module_private_config") {
visibility = [ ":*" ]
include_dirs = [ "../../../include" ]
}
```
> **说明:** 一般在此处对相关配置进行设置,在测试用例编译脚本中可直接引用。
5.
指定测试用例编译目标输出的文件名称
```
ohos_unittest("CalculatorSubTest") {
}
```
6.
编写具体的测试用例编译脚本(添加需要参与编译的源文件、配置和依赖)
```
ohos_unittest("CalculatorSubTest") {
module_out_path = module_output_path
sources = [
"../../../include/calculator.h",
"../../../src/calculator.cpp",
"../../../test/calculator_sub_test.cpp"
]
sources += [ "calculator_sub_test.cpp" ]
configs = [ ":module_private_config" ]
deps = [ "//third_party/googletest:gtest_main" ]
}
```
> **说明:根据测试类型的不同,在具体编写过程中可选择不同的测试类型:**
> - ohos_unittest:单元测试
> - ohos_moduletest:模块测试
> - ohos_systemtest:系统测试
> - ohos_performancetest:性能测试
> - ohos_securitytest:安全测试
> - ohos_reliabilitytest:可靠性测试
> - ohos_distributedtest:分布式测试
7. 对目标测试用例文件进行条件分组
```
group("unittest") {
testonly = true
deps = [":CalculatorSubTest"]
}
```
> **说明:** 进行条件分组的目的在于执行用例时可以选择性的执行某一种特定类型的用例。
-
**JavaScript用例编译配置示例**
```
# Copyright (C) 2021 XXXX Device Co., Ltd.
import("//build/test.gni")
module_output_path = "subsystem_examples/app_info"
ohos_js_unittest("GetAppInfoJsTest") {
module_out_path = module_output_path
hap_profile = "./config.json"
certificate_profile = "//test/developertest/signature/openharmony_sx.p7b"
}
group("unittest") {
testonly = true
deps = [ ":GetAppInfoJsTest" ]
}
```
详细内容如下:
1. 添加文件头注释信息
```
# Copyright (C) 2021 XXXX Device Co., Ltd.
```
2. 导入编译模板文件
```
import("//build/test.gni")
```
3. 指定文件输出路径
```
module_output_path = "subsystem_examples/app_info"
```
> **说明:** 此处输出路径为部件/模块名。
4. 指定测试用例编译目标输出的文件名称
```
ohos_js_unittest("GetAppInfoJsTest") {
}
```
> **说明:**
>- 使用模板ohos_js_unittest定义js测试套,注意与C++用例区分。
>- js测试套编译输出文件为hap类型,hap名为此处定义的测试套名,测试套名称必须以JsTest结尾。
5. 指定hap包配置文件config.json和签名文件,两个配置为必选项
```
ohos_js_unittest("GetAppInfoJsTest") {
module_out_path = module_output_path
hap_profile = "./config.json"
certificate_profile = "//test/developertest/signature/openharmony_sx.p7b"
}
```
config.json为hap编译所需配置文件,需要开发者根据被测sdk版本配置“target”项,其余项可默认,具体如下所示:
```
{
"app": {
"bundleName": "com.example.myapplication",
"vendor": "example",
"version": {
"code": 1,
"name": "1.0"
},
"apiVersion": {
"compatible": 4,
"target": 5 // 根据被测sdk版本进行修改,此例为sdk5
}
},
"deviceConfig": {},
"module": {
"package": "com.example.myapplication",
"name": ".MyApplication",
"deviceType": [
"phone"
],
"distro": {
"deliveryWithInstall": true,
"moduleName": "entry",
"moduleType": "entry"
},
"abilities": [
{
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"action.system.home"
]
}
],
"name": "com.example.myapplication.MainAbility",
"icon": "$media:icon",
"description": "$string:mainability_description",
"label": "MyApplication",
"type": "page",
"launchType": "standard"
}
],
"js": [
{
"pages": [
"pages/index/index"
],
"name": "default",
"window": {
"designWidth": 720,
"autoDesignWidth": false
}
}
]
}
}
```
6. 对目标测试用例文件进行条件分组
```
group("unittest") {
testonly = true
deps = [ ":GetAppInfoJsTest" ]
}
```
> **说明:** 进行条件分组的目的在于执行用例时可以选择性的执行某一种特定类型的用例。
#### 编译入口配置文件ohos.build
当完成用例编译配置文件编写后,需要进一步编写部件编译配置文件,以关联到具体的测试用例。
```
"partA": {
"module_list": [
],
"inner_list": [
],
"system_kits": [
],
"test_list": [
"//system/subsystem/partA/calculator/test:unittest" //配置模块calculator下的test
]
}
```
> **说明:** test_list中配置的是对应模块的测试用例。
### 测试用例资源配置
测试依赖资源主要包括测试用例在执行过程中需要的图片文件,视频文件、第三方库等对外的文件资源。
依赖资源文件配置步骤如下:
1.
在部件或者模块的test目录下创建resource目录,存放需要的资源文件
2.
在resource目录下创建一个ohos_test.xml文件,文件内容格式如下:
```
<?xml version="1.0" encoding="UTF-8"?>
<configuration ver="2.0">
<target name="CalculatorSubTest">
<preparer>
<option name="push" value="test.jpg -> /data/test/resource" src="res"/>
<option name="push" value="libc++.z.so -> /data/test/resource" src="out"/>
</preparer>
</target>
</configuration>
```
3.
在测试用例的编译配置文件中定义resource_config_file进行指引,用来指定对应的资源文件ohos_test.xml
```
ohos_unittest("CalculatorSubTest") {
resource_config_file = "//system/subsystem/partA/calculator/test/resource/ohos_test.xml"
}
```
>**说明:**
>- target_name: 测试套的名称,定义在测试目录的BUILD.gn中。preparer: 表示该测试套执行前执行的动作。
>- src="res": 表示测试资源位于test目录下的resource目录下,src="out" 表示位于out/release/$(部件)目录下。
## 测试用例执行
在执行测试用例之前,针对用例使用设备的不同,需要对相应配置进行修改,修改完成即可执行测试用例。
### user_config.xml配置
```
<user_config>
<build>
<!-- 是否编译demo用例, 默认为false,如果需要编译demo可修改为true -->
<example>false</example>
<!-- 是否编译版本, 默认为false -->
<version>false</version>
<!-- 是否编译测试用例, 默认为true,若已完成编译,再执行用例之前可修改为false,防止重新编译 -->
<testcase>true</testcase>
</build>
<environment>
<!-- 配置远程映射机器的IP及端口,以支持HDC连接的设备 -->
<device type="usb-hdc">
<ip></ip>
<port></port>
<sn></sn>
</device>
<!-- 配置设备的串口信息,以支持串口连接的设备 -->
<device type="com" label="ipcamera">
<serial>
<com></com>
<type>cmd</type>
<baud_rate>115200</baud_rate>
<data_bits>8</data_bits>
<stop_bits>1</stop_bits>
<timeout>1</timeout>
</serial>
</device>
</environment>
<!-- 配置测试用例路径,若测试用例未编译,即<testcase>标签属性为true时,此处默认不填写;若编译已完成,需在此处指定测试用例的实际路径 -->
<test_cases>
<dir></dir>
</test_cases>
<!-- 配置覆盖率编译路径 -->
<coverage>
<outpath></outpath>
</coverage>
<!-- NFS挂载信息配置,被测设备仅支持串口连接时配置,指定NFS的映射路径,host_dir为PC侧的NFS目录,board_dir为板侧创建的目录 -->
<NFS>
<host_dir></host_dir>
<mnt_cmd></mnt_cmd>
<board_dir></board_dir>
</NFS>
</user_config>
```
>**说明:** 在执行测试用例之前,若使用HDC连接设备,用例仅需配置设备IP和端口号即可,其余信息均默认不修改。
## 约束<a name="section87444710110"></a>
### Windows环境执行
#### 测试用例编译
测试工具环境依赖
1.
python版本
\>
=3.7.5
2.
paramiko版本
\>
=2.7.1
3.
setuptools版本
\>
=40.8.0
4.
rsa版本
\>
=4.0
5.
NFS版本
\>
=V4,设备不支持hdc连接,支持串口时使用
6.
pyserial版本
\>
=3.3,设备不支持hdc连接,支持串口时使用
7.
运行操作系统:Windows版本
\>
=Win10,Linux为Ubuntu18.04
## 安装<a name="section1347156474"></a>
依赖python环境:
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.
安装setuptools插件,安装命令如下:
```
pip3 install setuptools
```
安装成功提示如下:
```
Requirement already satisfied: setuptools in d:\programs\python37\lib\site-packages (41.2.0)
```
3.
安装paramiko插件,安装命令如下:
```
pip3 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.
安装python的rsa插件,安装命令如下:
```
pip3 install rsa
```
安装成功截图如下:
```
Installing collected packages: pyasn1, rsa
Successfully installed pyasn1-0.4.8 rsa-4.7
```
5.
需要本地的python安装串口插件pyserial,安装命令如下:
```
pip3 install pyserial
```
安装成功提示如下:
```
Requirement already satisfied: pyserial in d:\programs\python37\lib\site-packages\pyserial-3.4-py3.7.egg (3.4)
```
6.
如果设备仅支持串口输出测试结果,则需要安装NFS Server
windows环境下安装,例如安装haneWIN NFS Server1.2.50,下载地址:https://www.hanewin.net/nfs-e.htm 。
Linux环境下安装,安装命令如下:
```
sudo apt install nfs-kernel-server
```
安装成功提示如下:
```
Reading package lists... Done
Building dependency tree
Reading state information... Done
nfs-kernel-server is already the newest version (1:1.3.4-2.1ubuntu5.3).
0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded.
```
## 编写测试用例<a name="section125411936102918"></a>
-
测试用例规范
-
命名规范
测试用例源文件名称和测试套内容保持一致,测试套与用例之间关系1:N,测试套与测试源文件之间关系1:1,每个源文件全局唯一,格式:\[特性\]\_\[功能\]\_\[子功能1\]\_\[子功能1.1\],子功能支持向下细分。
文件命名采用全小写+下划线方式命名,以test结尾,如demo用例:developertest/examples/calculator。
- 测试用例编码规范
开发者测试用例原则上与特性代码编码规范保持一致,另外需要添加必要的用例描述信息,详见[•自测试用例模板](#li2069415903917)。
- 测试用例编译配置规范
测试用例采用GN方式编译,配置遵循本开源项目的编译指导[使用](编译构建子系统.md)。
-
<a
name=
"li2069415903917"
></a>
测试用例模板
详见测试demo用例:developertest/examples/calculator/test/unittest/common/calculator\_add\_test.cpp。
-
测试用例目录规划
```
subsystem # 子系统,系统组件
├── parts # 部件
│ └── test # 模块测试目录
│ └── unittest # 单元测试
│ ├── common # 公共用例
│ ├── phone # 手机形态用例
│ └── ivi # 车机形态
│ └── liteos-a # ipcamera使用liteos内核时的用例
│ └── moduletest # 模块测试
│ ├── common
│ ├── phone
│ └── ivi
│ └── liteos-a
└── test # 子系统测试目录
└── resource # 测试资源
├── module
├── common
├── phone
├── ivi
├── liteos-a
└── systemtest # 系统测试
├── common
├── phone
├── ivi
├── liteos-a
```
> **说明:**
>其中phone,ivi,liteos-a仅不同设备形态举例,如区分手机,车机,IPCamera等不同形态设备,对于同一特性在不同开发板上,如果用例没有差异,则用例放置common目录下,如果同一特性,用例区分不同设备形态,可能包含内核差异,芯片平台差异,则用例以目录区分。
-
编写测试用例步骤
1.
添加测试用例文件头注释信息。
2.
引用gtest头文件和ext命名空间。
3.
添加被测试类的头文件。
4.
定义测试套(测试类)。
5.
实现该测试套具体的测试用例,包括用例注释和用例逻辑实现。
6.
编写测试用例编译配置。
> **说明:**
>\*样例参考:
>仅支持串口设备形态编译示例:developertest/examples/lite/cxx\_demo/test/unittest/common/calc\_subtraction\_test.cpp。
>支持hdc连接的设备形态编译示例:developertest/examples/calculator/test/unittest/common/calculator\_add\_test.cpp。
>注意点如下:
>a、SetUp & TearDown是针对该测试套下每条用例执行前和执行后的处理逻辑
>b、SetUpTestCase & TearDownTestCase是针对该测试套下所有用例执行前和执行后的处理逻辑
>c、HWTEST的使用:特点:只适合做简单测试(执行不依赖Setup & Teardown)缺点:多个测试场景需要相同数据配置的情况不适用,测试用例之间可能相互影响,不具备独立性
>d、使用printf函数打印日志
-
编写测试用例编译文件
-
定义测试用例编译构建目标。
1.
添加测试用例编译文件头注释信息。
2.
导入测试用例编译模板文件。
3.
指定测试用例文件的输出路径。
4.
配置测试用例编译依赖包含目录。
5.
指定测试用例编译目标输出的文件名称。
6.
编写具体的测试用例编译脚本(添加需要参与编译的源文件、配置和依赖 )。
7.
对目标测试用例文件进行条件分组(分组名称固定为:unittest/moduletest
\)
。
- 如果存在多个测试套,定义公共编译配置。
- 将测试用例添加到构建系统中。
> **说明:**
>\*样例参考:
>1、仅支持串口设备形态编译示例:
>用例编译配置:developertest/examples/lite/cxx\_demo/test/unittest/common/BUILD.gn
>编译入口配置:developertest/examples/lite/BUILD.gn
>2、支持hdc连接的设备形态编译示例:
>用例编译配置:developertest/examples/calculator/test/unittest/common/BUILD.gn
>编译入口配置:developertest/examples/ohos.build
-
编写测试用例资源
1.
在部件或者模块的test目录下创建resource目录。
2.
在resource目录下创建形态目录,如phone。
3.
在设备形态目录下创建一个以模块名命名的文件夹,如testmodule。
4.
在模块目录下创建一个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>
```
5. 在测试用例的编译配置文件中定义resource\_config\_file,用来指定对应的资源文件ohos\_test.xml。
> **说明:**
>如上资源文件功能:将resource目录下的test.txt文件通过hdc push命令推送到被测设备的/data/test/resource目录下。
6. ohos\_test.xml文件标签说明如下:
> **说明:**
>target\_name:测试单元的名字,通常定义在测试目录的BUILD.gn中。
>preparer:表示该测试单元执行前执行的动作。
>cleaner:表示测试单元执行结束后的动作。
>特别的,src=”res” 表示测试资源位于子系统根目录的resource目录, src=“out“ 表示out/release/$\(子系统名\)目录。
-
测试用例级别定义
-
基本(Level1)
-
重要(Level2)
-
一般(Level3)
-
生僻(Level4)
## 使用测试框架<a name="section75882026185016"></a>
-
可选,安装xdevice组件。
1.
以Windows环境为例,打开xdevice安装目录:test/xdevice。
2.
打开控制台窗口,执行如下命令:
```
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
Finished processing dependencies for xdevice==0.0.0
```
-
必选,developertest组件配置。
文件:developertest/config/user\_config.xml。
1. 测试框架通用配置。
\[build\] \# 配置测试用例的编译参数,例如:
```
<build>
<example>false</example>
<version>false</version>
<testcase>true</testcase>
... ...
</build>
```
> **说明:**
>测试用例的编译参数说明如下:
>example:是否编译测试用例示例,默认false。
>version:是否编译测试版本,默认false。
>testcase:是否编译测试用例,默认true。
2. 支持hdc连接的被测设备。
\[device\] \# 配置标签为usb-hdc的环境信息,测试设备的IP地址和hdc映射的端口号,例如:
```
<device type="usb-hdc">
<ip>192.168.1.1</ip>
<port>9111</port>
<sn></sn>
</device>
```
3. 仅支持串口的被测设备。
\[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。
1. \[test\_cases\] \# 指定测试用例的输出路径,编译输出目录,例如:
```
<test_cases>
<dir>/home/source_code/out/release/tests</dir>
</test_cases>
```
2. \[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目录。
1.
Windows环境启动测试框架。
```
start.bat
```
2. Linux环境启动测试框架。
```
./strat.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 test -tm example
```
3. 参数说明:指定参数可以执行特定特性、模块对应的测试套。
```
由于Windows环境下无法实现用例编译,因此执行用例前需要在Linux环境下进行用例编译,用例编译命令:
usage: run [-h] [-p PRODUCTFORM] [-t [TESTTYPE [TESTTYPE ...]]]
```
[-ss SUBSYSTEM] [-tm TESTMODULE] [-ts TESTSUIT]
./build.sh --product-name Hi3516DV300 --build-target make_test
[-tc TESTCASE] [-tl TESTLEVEL]
```
编译完成后,测试用例将自动保存在out/ohos-arm-release/packages/phone/images/tests目录下。
optional arguments:
-h, --help show this help message and exit
>说明: Hi3516DV300为当前版本所支持的平台,make_test表示全部用例。根据不同需求,编译选项可进行不同选择:
-p PRODUCTFORM, --productform PRODUCTFORM Specified product form
> - --product-name # 编译产品名称(必选)
-t [TESTTYPE [TESTTYPE ...]], --testtype [TESTTYPE [TESTTYPE ...]]
> - --build-target # 指定编译目标(可选)
Specify test type(UT,MST,ST,PERF,ALL)
-ss SUBSYSTEM, --subsystem SUBSYSTEM Specify test subsystem
#### 搭建执行环境
-tm TESTMODULE, --testmodule TESTMODULE Specified test module
1.
在Windows环境创建测试框架目录Test,并在此目录下创建testcase目录
-ts TESTSUIT, --testsuite TESTSUIT Specify test suite
-tc TESTCASE, --testcase TESTCASE Specify test case
2.
从Linux环境拷贝测试框架developertest和xdevice到创建的Test目录下,拷贝编译好的测试用例到testcase目录下
-tl TESTLEVEL, --testlevel TESTLEVEL Specify test level
>**说明:** 将测试框架及测试用例从Linux环境移植到Windows环境,以便后续执行。
```
3.
修改user_config.xml
```
<build>
<!-- 由于测试用例已编译完成,此标签属性需改为false -->
<testcase>false</testcase>
</build>
<test_cases>
<!-- 由于已将测试用例拷贝到Windows环境下,测试用例输出路径发生改变,需要修改为拷贝后所存放的路径 -->
<dir>D:\Test\testcase\tests</dir>
</test_cases>
```
>**说明:** `<testcase>`标签表示是否需要编译用例;`<dir>`标签表示测试用例查找路径。
#### 执行用例
1.
启动测试框架
```
start.bat
```
2.
选择产品形态
进入测试框架,系统会自动提示您选择产品形态,请根据实际的开发板进行选择。例如:Hi3516DV300。
3.
执行测试用例
当选择完产品形态,可参考如下指令执行测试用例。
```
run -t UT -ts CalculatorSubTest -tc interger_sub_00l
```
执行命令参数说明:
```
-t [TESTTYPE]: 指定测试用例类型,有UT,MST,ST,PERF等。(必选参数)
-tp [TESTTYPE]: 指定部件,可独立使用。
-tm [TESTTYPE]: 指定模块,不可独立使用,需结合-tp指定上级部件使用。
-ts [TESTTYPE]: 指定测试套,可独立使用。
-tc [TESTTYPE]: 指定测试用例,不可独立使用,需结合-ts指定上级测试套使用。
-h : 帮助命令。
```
### Linux环境执行
#### 远程端口映射
为了在Linux远程服务器以及Linux虚拟机两种环境下执行测试用例,需要对端口进行远程映射,以实现与设备的数据通路连接。具体操作如下:
1.
HDC Server指令:
```
hdc_std kill
hdc_std -m -s 0.0.0.0:8710
```
>**说明:** IP和端口号为默认值。
2.
HDC Client指令:
```
hdc_std -s xx.xx.xx.xx:8710 list targets
```
>**说明:** 此处IP填写设备侧IP地址。
#### 执行用例
1.
启动测试框架
```
./start.sh
```
2.
选择产品形态
进入测试框架,系统会自动提示您选择产品形态,请根据实际的开发板进行选择。例如:Hi3516DV300。
3.
执行测试用例
测试框架在执行用例时会根据指令找到所需用例,自动实现用例编译,执行过程,完成自动化测试。
```
run -t UT -ts CalculatorSubTest -tc interger_sub_00l
```
执行命令参数说明:
```
-t [TESTTYPE]: 指定测试用例类型,有UT,MST,ST,PERF等。(必选参数)
-tp [TESTTYPE]: 指定部件,可独立使用。
-tm [TESTTYPE]: 指定模块,不可独立使用,需结合-tp指定上级部件使用。
-ts [TESTTYPE]: 指定测试套,可独立使用。
-tc [TESTTYPE]: 指定测试用例,不可独立使用,需结合-ts指定上级测试套使用。
-h : 帮助命令。
```
## 测试报告日志
当执行完测试指令,控制台会自动生成测试结果,若需要详细测试报告您可在相应的数据文档中进行查找。
### 测试结果
测试结果输出根路径如下:
```
test/developertest/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
```
-
测试框架帮助。
### 最新测试报告
```
reports/latest
```
帮助指令,用于查询测试平台支持哪些测试指令。
## 涉及仓
```
[
test\_xdevice
](
https://gitee.com/openharmony/test_xdevice/blob/master/README_zh.md
)
help
```
-
退出自测试平台。
退出自测试平台,使用如下命令退出测试平台。
```
quit
```
## 测试结果与日志<a name="section414715805819"></a>
-
通过在测试框架中执行测试指令,即可以生成测试日志和测试报告。
-
测试结果
-
测试用例的结果会直接显示在控制台上,执行一次的测试结果根路径如下:
```
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
```
-
最新测试报告
```
reports/latest
```
## 涉及仓<a name="section6299103515474"></a>
**测试子系统**
test
\_
developertest
test
\_
xdevice
test
\_
xdevice
\_
extension
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录