OpenHarmony实战开发-自动化测试框架使用指导

654 篇文章 4 订阅
648 篇文章 6 订阅

概述

自动化测试框架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.……

在这里插入图片描述

  • 17
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值