鸿蒙开发之如何实现自动化测试用例

概述

自动化测试框架arkxtest支持JS/TS语言的单元测试框架(JsUnit)及UI测试框架(UiTest)。JsUnit提供单元测试用例执行能力,UiTest提供查找和操作界面控件的能力。

实现原理

测试框架分为单元测试框架和UI测试框架。单元测试框架提供用例识别、调度、执行及结果汇总的能力。UI测试框架基于单元测试框架,提供UiTest API供开发人员调用。

环境准备
  • 使用DevEco Studio 3.0之后的版本进行脚本编写。
  • 脚本执行需要连接硬件设备,如HarmonyOS NEXT设备。
新建和编写测试脚本
  1. 新建测试脚本

    • 在DevEco Studio中新建应用开发工程,测试脚本存放在ohosTest和test目录下。
    • API10及以上版本支持创建Instrument Test和Local Test。
  2. 编写单元测试脚本

    • 依赖导包
    • 测试代码编写
    • 断言接口调用

    示例代码:

    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();
            });
        });
    }
    
  3. 编写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”错误信息

参考链接

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸿蒙开发助手

赏钱一扔,代码超神,事业飞腾

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值