OpenHarmony实战开发-自动化测试框架使用指导
自动化测试框架arkxtest,作为工具集的重要组成部分,支持JS/TS语言的单元测试框架(JsUnit)及UI测试框架(UiTest)。JsUnit提供单元测试用例执行能力,提供用例编写基础接口,生成对应报告,用于测试系统或应用接口。UiTest通过简洁易用的API提供查找和操作界面控件能力,支持用户开发基于界面操作的自动化测试脚本。本指南介绍了测试框架的主要功能、实现原理、环境准备,以及测试脚
概述
自动化测试框架arkxtest,作为工具集的重要组成部分,支持JS/TS语言的单元测试框架(JsUnit)及UI测试框架(UiTest)。
JsUnit提供单元测试用例执行能力,提供用例编写基础接口,生成对应报告,用于测试系统或应用接口。
UiTest通过简洁易用的API提供查找和操作界面控件能力,支持用户开发基于界面操作的自动化测试脚本。本指南介绍了测试框架的主要功能、实现原理、环境准备,以及测试脚本编写和执行等内容。
实现原理
测试框架分为单元测试框架和UI测试框架。
单元测试框架是测试框架的基础底座,提供了最基本的用例识别、调度、执行及结果汇总的能力。
UI测试框架主要对外提供了UiTest API供开发人员在对应测试场景调用,而其脚本的运行基础仍是单元测试框架。
单元测试框架
图1.单元测试框架主要功能
图2.脚本基础流程运行图
UI测试框架
图3.UI测试框架主要功能
约束与限制
- UI测试框架的能力在OpenHarmony 3.1 release版本之后方可使用,历史版本不支持使用。
环境准备
环境要求
自动化脚本的编写主要基于DevEco Studio,并建议使用3.0之后的版本进行脚本编写。
脚本执行需要PC连接硬件设备,如开发板等。
搭建环境
DevEco Studio可参考其官网介绍进行下载,并进行相关的配置动作。
新建和编写测试脚本
新建测试脚本
1.在DevEco Studio中新建应用开发工程,其中ohos目录即为测试脚本所在的目录。
2.在工程目录下打开待测试模块下的ets文件,将光标置于代码中任意位置,单击右键 > Show Context Actions > Create Ohos Test或快捷键Alt+enter > Create Ohos Test创建测试类。
编写单元测试脚本
本章节主要描述单元测试框架支持能力,以及能力的使用方法, 具体请参考单元测试框架功能特性。
在单元测试框架,测试脚本需要包含如下基本元素:
1、依赖导包,以便使用依赖的测试接口。
2、测试代码编写,主要编写测试代码的相关逻辑,如接口调用等。
3、断言接口调用,设置测试代码中的检查点,如无检查点,则不可认为一个完整的测试脚本。
如下示例代码实现的场景是:启动测试页面,检查设备当前显示的页面是否为预期页面。
import { describe, it, expect } from '@ohos/hypium';
import abilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry';
import UIAbility from '@ohos.app.ability.UIAbility';
import Want from '@ohos.app.ability.Want';
const delegator = abilityDelegatorRegistry.getAbilityDelegator()
const bundleName = abilityDelegatorRegistry.getArguments().bundleName;
function sleep(time: number) {
return new Promise<void>((resolve: Function) => setTimeout(resolve, time));
}
export default function abilityTest() {
describe('ActsAbilityTest', () =>{
it('testUiExample',0, async (done: Function) => {
console.info("uitest: TestUiExample begin");
//start tested ability
const want: Want = {
bundleName: bundleName,
abilityName: 'EntryAbility'
}
await delegator.startAbility(want);
await sleep(1000);
//check top display ability
await delegator.getCurrentTopAbility().then((Ability: UIAbility)=>{
console.info("get top ability");
expect(Ability.context.abilityInfo.name).assertEqual('EntryAbility');
})
done();
})
})
}
编写UI测试脚本
本章节主要介绍UI测试框架支持能力,以及对应能力API的使用方法。
UI测试基于单元测试,UI测试脚本在单元测试脚本上增加了对UiTest接口,具体请参考API文档。
如下的示例代码是在上面的单元测试脚本基础上增量编写,实现的是在启动的应用页面上进行点击操作,然后检测当前页面变化是否为预期变化。
1.增加依赖导包。
import { Driver, ON } from '@ohos.UiTest'
2.编写index.ets页面代码。
@Entry
@Component
struct Index {
@State message: string = 'Hello World'
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
Text("Next")
.fontSize(50)
.margin({top:20})
.fontWeight(FontWeight.Bold)
Text("after click")
.fontSize(50)
.margin({top:20})
.fontWeight(FontWeight.Bold)
}
.width('100%')
}
.height('100%')
}
}
3.编写具体测试代码。
import { describe, it, expect } from '@ohos/hypium';
import abilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry';
import { Driver, ON } from '@ohos.UiTest'
import Want from '@ohos.app.ability.Want';
import UIAbility from '@ohos.app.ability.UIAbility';
const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator()
const bundleName = abilityDelegatorRegistry.getArguments().bundleName;
function sleep(time: number) {
return new Promise<void>((resolve: Function) => setTimeout(resolve, time));
}
export default function abilityTest() {
describe('ActsAbilityTest', () => {
it('testUiExample',0, async (done: Function) => {
console.info("uitest: TestUiExample begin");
//start tested ability
const want: Want = {
bundleName: bundleName,
abilityName: 'EntryAbility'
}
await delegator.startAbility(want);
await sleep(1000);
//check top display ability
await delegator.getCurrentTopAbility().then((Ability: UIAbility)=>{
console.info("get top ability");
expect(Ability.context.abilityInfo.name).assertEqual('EntryAbility');
})
//ui test code
//init driver
let driver = Driver.create();
await driver.delayMs(1000);
//find button on text 'Next'
let button = await driver.findComponent(ON.text('Next'));
//click button
await button.click();
await driver.delayMs(1000);
//check text
await driver.assertComponentExist(ON.text('after click'));
await driver.pressBack();
done();
})
})
}
执行测试脚本
DevEco Studio执行
通过点击按钮执行,当前支持以下执行方式:
1、测试包级别执行,即执行测试包内的全部用例。
2、测试套级别执行,即执行describe方法中定义的全部测试用例。
3、测试方法级别执行,即执行指定it方法也就是单条测试用例。
查看测试结果
测试执行完毕后可直接在DevEco Studio中查看测试结果,如下图示例所示:
查看测试用例覆盖率
执行完测试用例后可以查看测试用例覆盖率。
CMD执行
将应用测试包安装到测试设备上,在cmd窗口中执行aa命令,完成对用例测试。
说明:
使用cmd的方式,需要配置好hdc相关的环境变量。
aa test命令执行配置参数
框架当前支持多种用例执行方式,通过上表中的-s参数后的配置键值对参数传入触发,如下表所示。
cmd窗口执行test命令
- 打开cmd窗口
- 执行 aa test 命令
示例代码1:执行所有测试用例。
hdc shell aa test -b xxx -p xxx -s unittest OpenHarmonyTestRunner
示例代码2:执行指定的describe测试套用例,指定多个需用逗号隔开。
hdc shell aa test -b xxx -p xxx -s unittest OpenHarmonyTestRunner -s class s1,s2
示例代码3:执行指定测试套中指定的用例,指定多个需用逗号隔开。
hdc shell aa test -b xxx -p xxx -s unittest OpenHarmonyTestRunner -s class testStop#stop_1,testStop1#stop_0
示例代码4:执行指定除配置以外的所有的用例,设置不执行多个测试套需用逗号隔开。
hdc shell aa test -b xxx -p xxx -s unittest OpenHarmonyTestRunner -s notClass testStop
示例代码5:执行指定it名称的所有用例,指定多个需用逗号隔开。
hdc shell aa test -b xxx -p xxx -s unittest OpenHarmonyTestRunner -s itName stop_0
示例代码6:用例执行超时时长配置。
hdc shell aa test -b xxx -p xxx -s unittest OpenHarmonyTestRunner -s timeout 15000
示例代码7:用例以breakOnError模式执行用例。
hdc shell aa test -b xxx -p xxx -s unittest OpenHarmonyTestRunner -s breakOnError true
示例代码8:执行测试类型匹配的测试用例。
hdc shell aa test -b xxx -p xxx -s unittest OpenHarmonyTestRunner -s testType function
示例代码9:执行测试级别匹配的测试用例。
hdc shell aa test -b xxx -p xxx -s unittest OpenHarmonyTestRunner -s level 0
示例代码10:执行测试规模匹配的测试用例。
hdc shell aa test -b xxx -p xxx -s unittest OpenHarmonyTestRunner -s size small
示例代码11:执行测试用例指定次数。
hdc shell aa test -b xxx -p xxx -s unittest OpenHarmonyTestRunner -s stress 1000
查看测试结果
- cmd模式执行过程,会打印如下相关日志信息。
OHOS_REPORT_STATUS: class=testStop
OHOS_REPORT_STATUS: current=1
OHOS_REPORT_STATUS: id=JS
OHOS_REPORT_STATUS: numtests=447
OHOS_REPORT_STATUS: stream=
OHOS_REPORT_STATUS: test=stop_0
OHOS_REPORT_STATUS_CODE: 1
OHOS_REPORT_STATUS: class=testStop
OHOS_REPORT_STATUS: current=1
OHOS_REPORT_STATUS: id=JS
OHOS_REPORT_STATUS: numtests=447
OHOS_REPORT_STATUS: stream=
OHOS_REPORT_STATUS: test=stop_0
OHOS_REPORT_STATUS_CODE: 0
OHOS_REPORT_STATUS: consuming=4
- cmd执行完成后,会打印如下相关日志信息。
OHOS_REPORT_RESULT: stream=Tests run: 447, Failure: 0, Error: 1, Pass: 201, Ignore: 245
OHOS_REPORT_CODE: 0
OHOS_REPORT_RESULT: breakOnError model, Stopping whole test suite if one specific test case failed or error
OHOS_REPORT_STATUS: taskconsuming=16029
当处于breakOnError模式,用例发生错误时,注意查看Ignore以及中断说明。
录制用户操作
使用录制功能
将当前界面操作记录到/data/local/tmp/layout/record.csv,结束录制操作使用Ctrl+C结束录制
hdc shell uitest uiRecord record
查看录制数据
支持两种方式查看数据。
命令读取并打印录制数据
hdc shell uitest uiRecord read
命令导出 record.csv文件查看录制数据
hdc file recv /data/local/tmp/layout/record.csv D:\tool # D:\tool 为本地存储路径,用户可自定义
- record 数据字段含义请参考如下示例数据。
{
"ABILITY": "com.ohos.launcher.MainAbility", // 前台应用界面
"BUNDLE": "com.ohos.launcher", // 操作应用
"CENTER_X": "", // 模拟捏合中心X, pinch事件
"CENTER_Y": "", // 模拟捏合中心Y, pinch事件
"EVENT_TYPE": "pointer", //
"LENGTH": "0", // 总体步长
"OP_TYPE": "click", //事件类型,当前支持点击、双击、长按、拖拽、捏合、滑动、抛滑动作录制
"VELO": "0.000000", // 离手速度
"direction.X": "0.000000",// 总体移动X方向
"direction.Y": "0.000000", // 总体移动Y方向
"duration": 33885000.0, // 手势操作持续时间
"fingerList": [{
"LENGTH": "0", // 总体步长
"MAX_VEL": "40000", // 最大速度
"VELO": "0.000000", // 离手速度
"W1_BOUNDS": "{"bottom":361,"left":37,"right":118,"top":280}", // 起点控件bounds
"W1_HIER": "ROOT,3,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0", // 起点控件hierarchy
"W1_ID": "", // 起点控件id
"W1_Text": "", // 起点控件text
"W1_Type": "Image", // 起点控件类型
"W2_BOUNDS": "{"bottom":361,"left":37,"right":118,"top":280}", // 终点控件bounds
"W2_HIER": "ROOT,3,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0", // 终点控件hierarchy
"W2_ID": "", // 终点控件id
"W2_Text": "", // 终点控件text
"W2_Type": "Image", // 终点控件类型
"X2_POSI": "47", // 终点X
"X_POSI": "47", // 起点X
"Y2_POSI": "301", // 终点Y
"Y_POSI": "301", // 起点Y
"direction.X": "0.000000", // x方向移动量
"direction.Y": "0.000000" // Y方向移动量
}],
"fingerNumber": "1" //手指数量
}
shell命令方式注入UI模拟操作
支持操作类型:点击 双击 长按 慢滑 快滑 拖拽 输入文字 KeyEvent。
示例代码1:执行点击事件。
hdc shell uitest uiInput click 100 100
示例代码2:执行双击事件。
hdc shell uitest uiInput doubleClick 100 100
示例代码3:执行长按事件。
hdc shell uitest uiInput longClick 100 100
示例代码4:执行快滑操作。
hdc shell uitest uiInput fling 10 10 200 200 500
示例代码5:执行慢滑操作。
hdc shell uitest uiInput swipe 10 10 200 200 500
示例代码6:执行拖拽操作。
hdc shell uitest uiInput drag 10 10 100 100 500
示例代码7:执行向左滑动操作。
hdc shell uitest uiInput dircFling 0 500
示例代码8:执行向右滑动操作。
hdc shell uitest uiInput dircFling 1 600
示例代码9:执行向上滑动操作。
hdc shell uitest uiInput dircFling 2
示例代码10:执行向下滑动操作。
hdc shell uitest uiInput dircFling 3
示例代码11:执行输入框输入操作。
hdc shell uitest uiInput inputText 100 100 hello
示例代码12:执行返回主页操作。
hdc shell uitest uiInput keyEvent Home
示例代码13:执行返回上一步操作。
hdc shell uitest uiInput keyEvent Back
示例代码14:执行组合键粘贴操作。
hdc shell uitest uiInput keyEvent 2072 2038
如果大家还没有掌握鸿蒙,现在想要在最短的时间里吃透它,我这边特意整理了《鸿蒙语法ArkTS、TypeScript、ArkUI、教学视频》以及《鸿蒙生态应用开发白皮书V2.0PDF》《鸿蒙开发学习手册》(共计890页)鸿蒙开发资料等…希望对大家有所帮助:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
鸿蒙语法ArkTS、TypeScript、ArkUI等…视频教程:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
OpenHarmony APP开发教程步骤:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
鸿蒙生态应用开发白皮书V2.0PDF:https://docs.qq.com/doc/DZVVkRGRUd3pHSnFG
南北双向高工技能基础:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
应用开发中高级就业技术:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
全网首发-工业级 南向设备开发就业技术:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
《鸿蒙开发学习手册》:
如何快速入门:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
1.基本概念
2.构建第一个ArkTS应用
3.……
开发基础知识:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……
基于ArkTS 开发:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3
1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)