OpenHarmony UiTest测试用例开发实践|全球观焦点
2023-06-10 05:21:52 清一色财经

本文只是对UiTest接口做一个简单的实践,旨在让开发者了解UiTest测试用例的开发流程以及部分接口介绍。


(相关资料图)

想了解更多关于开源的内容,请访问:

清一色开源基础软件社区

https://ost.51cto.com

前言

这篇文章主要对UiTest测试用例的开发做一个简单的开发实践。

概述

UiTest提供模拟UI操作的能力,供开发者在测试场景使用,主要支持如点击、双击、长按、滑动等UI操作能力。

UiTest主要包含以下几个关键、常用的类:

On:提供控件特征描述能力,用于控件筛选匹配查找。Component:代表UI界面上的指定控件,提供控件属性获取,控件点击,滑动查找,文本注入等能力。Driver:入口类,提供控件匹配/查找,按键注入,坐标点击/滑动,截图等能力。UiWindow:入口类,提供窗口属性获取,窗口拖动、调整窗口大小等能力。

开发步骤

打开应用

了解OpenHarmony应用工程结构的同学应该知道,每个模块最终都会编译成一个hap,例如我们最熟悉的entry模块,而ohosTest模块最终也会编译成一个hap,并安装在桌面上。

读过上篇文章或者了解OpenHarmony应用开发的同学也知道,这个hap默认打开的是TestAbility中指定的页面,而开发者如果想测试的是其他hap(例如笔者这里测试的是entry模块编译的hap),首先需要使用startAbility的方式进行拉起。

it(BUNDLE + "StartAbility_001", 0, async function (done) {  console.info(TAG, BUNDLE + "StartAbility_001 begin")  try {    await abilityDelegator.startAbility({      bundleName: "com.example.myapplication",      abilityName: "EntryAbility"    })    done()  } catch (exception) {    console.info(TAG, `StartAbility_001 exception = ${JSON.stringify(exception)}`)    expect().assertFail()  }  console.info(TAG, BUNDLE + "StartAbility_001 end")})

创建Driver对象

Driver类作为UiTest测试框架的总入口,在使用控件匹配/查找,按键注入,坐标点击/滑动,截图等能力之前,需要使用Driver.create()方法创建一个Driver对象。

let driver = Driver.create()

控件匹配、操作

On类提供了丰富的控件特征描述,可以指定某个控件的id、类型、文本内容等条件进行匹配,例如笔者这里分别给TextInput和Button组件设置了id,然后就可以使用ON.id()进行条件匹配。

也可以同时指定目标控制的id和type,例如:

ON.id("button").type("Button")

在查找目标控件之前,可以使用断言API断言当前界面是否存在满足给出的目标属性的控件,如不满足则会报错退出。

await driver.assertComponentExist(ON.id("textInput"))

在使用On类指定条件后,可以使用driver.findComponent()方法进行控件匹配,匹配成功后返回符合条件的Component对象,然后就可以使用Component类提供的方法进行点击、滑动、注入文本等操作。

let textInput = await driver.findComponent(ON.id("textInput"))await textInput.inputText("OpenHarmony");

运行效果

完整代码

import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from "@ohos/hypium"import AbilityDelegatorRegistry from "@ohos.app.ability.abilityDelegatorRegistry"import { Driver, ON } from "@ohos.UiTest"const TAG = "[Sample_MyApplication]"const BUNDLE = "myApplication_"const DELAY_TIME = 1000;export default function abilityTest() {  let driver = Driver.create()  let abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator()  describe("ActsAbilityTest", function () {    /**     * 打开应用     */    it(BUNDLE + "StartAbility_001", 0, async function (done) {      console.info(TAG, BUNDLE + "StartAbility_001 begin")      try {        await abilityDelegator.startAbility({          bundleName: "com.example.myapplication",          abilityName: "EntryAbility"        })        done()      } catch (exception) {        console.info(TAG, `StartAbility_001 exception = ${JSON.stringify(exception)}`)        expect().assertFail()      }      console.info(TAG, BUNDLE + "StartAbility_001 end")    })    it(BUNDLE + "function_001", 0, async function () {      console.info(TAG, BUNDLE + "function_001 begin")      await driver.delayMs(DELAY_TIME)      // 向文本框控件中输入文本      await driver.assertComponentExist(ON.id("textInput"))      let textInput = await driver.findComponent(ON.id("textInput"))      await textInput.inputText("OpenHarmony");      await driver.delayMs(DELAY_TIME)      // 点击按钮      await driver.assertComponentExist(ON.id("button"))      let btn = await driver.findComponent(ON.id("button"))      await btn.click();      await driver.delayMs(DELAY_TIME)      // 清空文本框控件的文本信息      await textInput.clearText();      console.info(TAG, BUNDLE + "function_001 end")    })  })}

常见问题

1、失败日志有“execute timeout 15000ms”错误信息

问题分析

默认测试执行时长为15000ms,当测试用例执行超时就会自动退出并报该错误。

解决方法

在如下位置修改执行超时时长。

2、失败日志有“uitest-api dose not allow calling concurrently”错误信息

问题分析

可能为报错位置前面调用的异步接口没有使用await调用,或者并行执行多个测试用例,导致前面的API没有执行完,就调用了新的API。

解决方法

1.检查用例实现,异步接口增加await调用。

2.避免多进程执行UI的测试用例。

结语

本文只是对UiTest接口做一个简单的实践,旨在让开发者了解UiTest测试用例的开发流程以及部分接口介绍。UiTest除此之外还提供更加强大、更加复杂的能力,大家可以自行探索。

想了解更多关于开源的内容,请访问:

清一色开源基础软件社区

https://ost.51cto.com

相关新闻: