概述
自动化测试框架arkxtest支持JS/TS语言的单元测试框架(JsUnit)及UI测试框架(UiTest)。JsUnit提供单元测试用例执行能力,UiTest提供查找和操作界面控件的能力。
实现原理
测试框架分为单元测试框架和UI测试框架。单元测试框架提供用例识别、调度、执行及结果汇总的能力。UI测试框架基于单元测试框架,提供UiTest API供开发人员调用。
环境准备
- 使用DevEco Studio 3.0之后的版本进行脚本编写。
- 脚本执行需要连接硬件设备,如HarmonyOS NEXT设备。
新建和编写测试脚本
-
新建测试脚本
- 在DevEco Studio中新建应用开发工程,测试脚本存放在ohosTest和test目录下。
- API10及以上版本支持创建Instrument Test和Local Test。
-
编写单元测试脚本
- 依赖导包
- 测试代码编写
- 断言接口调用
示例代码:
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"); const want: Want = { bundleName: bundleName, abilityName: 'EntryAbility' }; await delegator.startAbility(want); await sleep(1000); await delegator.getCurrentTopAbility().then((Ability: UIAbility) => { console.info("get top ability"); expect(Ability.context.abilityInfo.name).assertEqual('EntryAbility'); }); done(); }); }); }
-
编写UI测试脚本
- 依赖导包
- 编写index.ets页面代码
- 在ohosTest > ets > test文件夹下编写具体测试代码
示例代码:
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"); const want: Want = { bundleName: bundleName, abilityName: 'EntryAbility' }; await delegator.startAbility(want); await sleep(1000); await delegator.getCurrentTopAbility().then((Ability: UIAbility) => { console.info("get top ability"); expect(Ability.context.abilityInfo.name).assertEqual('EntryAbility'); }); let driver = Driver.create(); await driver.delayMs(1000); let button = await driver.findComponent(ON.text('Next')); await button.click(); await driver.delayMs(1000); await driver.assertComponentExist(ON.text('after click')); await driver.pressBack(); done(); }); }); }
执行测试脚本
-
DevEco Studio执行
- 测试包级别执行
- 测试套级别执行
- 测试方法级别执行
-
CMD执行
- 安装应用测试包到测试设备上
- 在cmd窗口中执行aa命令
示例代码:
hdc shell aa test -b xxx -p xxx -s unittest OpenHarmonyTestRunner
录制用户操作
-
使用录制功能记录当前界面操作到/data/local/tmp/layout/record.csv
-
结束录制操作使用Ctrl+C结束录制
示例代码:
hdc shell uitest uiRecord record
shell命令方式注入UI模拟操作
-
支持操作类型:点击、双击、长按、慢滑、快滑、拖拽、输入文字、KeyEvent
示例代码:
hdc shell uitest uiInput click 100 100
常见问题
-
单元测试用例常见问题
- 用例中增加的打印日志在用例结果之后才打印
- 执行用例时报error:fail to start ability
- 执行用例时报用例超时错误
-
UI测试用例常见问题
- 失败日志有“Get windows failed/GetRootByWindow failed”错误信息
- 失败日志有“uitest-api dose not allow calling concurrently”错误信息
- 失败日志有“does not exist on current UI! Check if the UI has changed after you got the widget object”错误信息