HamronyOS 自动化测试框架使用指南

概述

为支撑 HarmonyOS 操作系统的自动化测试活动开展,我们提供了支持 JS/TS 语言的单元及 UI 测试框架,支持开发者针对应用接口进行单元测试,并且可基于 UI 操作进行 UI 自动化脚本的编写。

本指南重点介绍自动化测试框架的主要功能,同时介绍编写单元/UI 自动化测试脚本的方法以及执行过程。

简介

HarmonyOS 自动化测试框架 arkxtest,作为 HarmonyOS 工具集的重要组成部分,提供了 HarmonyOS 自动化脚本编写和运行的基础能力。编写方面提供了一系列支持测试脚本编写的 API,包括了基础流程 API、断言 API 以及 UI 操作相关的 API,运行方面提供了识别测试脚本、调度执行测试脚本以及汇总测试脚本执行结果的能力。

实现原理

框架重要分为两大部分:单元测试框架和 UI 测试框架。

● 单元测试框架

单元测试框架是测试框架的基础底座,提供了最基本的用例识别、调度、执行及结果汇总的能力。主要功能如下图所示:

单元测试脚本的基础运行流程如下图所示,依赖 aa test 命令作为执行入口,该命令可具体参考。

● UI 测试框架

UI 测试框架主要对外提供了UiTest API供开发人员在对应测试场景调用,而其脚本的运行基础还是上面提到的单元测试框架。

UI 测试框架的主要功能如下图所示:

约束与限制

● UI 测试框架的能力在 HarmonyOS 3.0 release 版本之后方可使用,历史版本不支持使用。

● 单元测试框架的部分能力与其版本有关,具体能力与版本匹配信息可见代码仓中的文档介绍。

环境准备

环境要求

自动化脚本的编写主要基于 DevEco Studio,并建议使用 3.1.0.400 之后的版本进行脚本编写。

脚本执行需要 PC 连接 HarmonyOS 设备,如 JAD 等。

搭建环境

DevEco Studio 可参考其官网介绍进行下载,并进行相关的配置动作。

新建测试脚本

1.  在 DevEco Studio 中新建应用开发工程,其中 ohos 目录即为测试脚本所在的目录。

2.  在工程目录下打开待测试模块下的 ets 文件,将光标置于代码中任意位置,单击右键 > Show Context Actions > Create Ohos Test 或快捷键 Alt+enter > Create Ohos Test 创建测试类,更多指导请参考 DevEco Studio 中指导。

编写单元测试脚本

import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'
import abilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry'

const delegator = abilityDelegatorRegistry.getAbilityDelegator()
export default function abilityTest() {
  describe('ActsAbilityTest', function () {
    it('testUiExample',0, async function (done) {
      console.info("uitest: TestUiExample begin");
      //start tested ability
      await delegator.executeShellCommand('aa start -b com.ohos.uitest -a MainAbility').then(result =>{
        console.info('Uitest, start ability finished:' + result)
      }).catch(err => {
        console.info('Uitest, start ability failed: ' + err)
      })
      await sleep(1000);
      //check top display ability
      await delegator.getCurrentTopAbility().then((Ability)=>{
        console.info("get top ability");
        expect(Ability.context.abilityInfo.name).assertEqual('MainAbility');
      })
      done();
    })

    function sleep(time) {
      return new Promise((resolve) => setTimeout(resolve, time));
    }
  })
}

单元测试脚本需要包含如下基本元素:

1、依赖导包,以便使用依赖的测试接口。

2、测试代码编写,主要编写测试代码的相关逻辑,如接口调用等。

3、断言接口调用,设置测试代码中的检查点,如无检查点,则不可认为一个完整的测试脚本。

编写 UI 测试脚本

UI 测试脚本是在单元测试框架的基础上编写,主要就是增加了 UI 测试框架提供的接口调用,实现对应的测试逻辑。

下面的示例代码是在上面的测试脚本基础上增量编写,首先需要增加依赖导包,如下示例代码所示:

import {Driver,ON,Component,MatchPattern} from '@ohos.UiTest'

然后是具体测试代码编写,场景较为简单,就是在启动的应用页面上进行点击操作,然后增加检查点检查用例。

export default function abilityTest() {
  describe('ActsAbilityTest', function () {
    it('testUiExample',0, async function (done) {
      console.info("uitest: TestUiExample begin");
      //start tested ability
      await delegator.executeShellCommand('aa start -b com.ohos.uitest -a MainAbility').then(result =>{
        console.info('Uitest, start ability finished:' + result)
      }).catch(err => {
        console.info('Uitest, start ability failed: ' + err)
      })
      await sleep(1000);
      //check top display ability
      await delegator.getCurrentTopAbility().then((Ability)=>{
        console.info("get top ability");
        expect(Ability.context.abilityInfo.name).assertEqual('MainAbility');
      })
      //ui test code
      //init driver
      var driver = await Driver.create();
      await driver.delayMs(1000);
      //find button by text 'Next'
      var 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();
    })

    function sleep(time) {
      return new Promise((resolve) => setTimeout(resolve, time));
    }
  })
}

说明

只支持应用内使用。暂不支持应用外的场景实现自动化,例如与权限弹窗和 SystemUi 上的控件进行交互。

执行测试脚本

执行测试脚本可以直接在 DevEco Studio 中通过点击按钮执行,当前支持以下执行方式:

1、测试包级别执行即执行测试包内的全部用例。

2、测试套级别执行即执行 describe 方法中定义的全部测试用例。

3、测试方法级别执行即执行指定 it 方法也就是单条测试用例。

查看测试结果

测试执行完毕后可直接在 DevEco Studio 中查看测试结果,如下图示例所示:

常见问题

单元测试用例常见问题

1、用例中增加的打印日志在用例结果之后才打印

问题描述

用例中增加的日志打印信息,没有在用例执行过程中出现,而是在用例执行结束之后才出现。

可能原因

此类情况只会存在于用例中有调用异步接口的情况,原则上用例中所有的日志信息均在用例执行结束之前打印。

解决方法

当被调用的异步接口多于一个时,建议将接口调用封装成 Promise 方式调用。

2、执行用例时报 error:fail to start ability

问题描述

执行测试用例时候,用例执行失败,控制台返回错误:fail to start ability。

可能原因

测试包打包过程中出现问题,未将测试框架依赖文件打包在测试包中。

解决方法

检查测试包中是否包含 TestRunner.abc 文件,如没有则重新编译打包后再次执行测试。

3、执行用例时报用例超时错误

问题描述

用例执行结束,控制台提示 execute time XXms 错误,即用例执行超时

可能原因

1.用例执行异步接口,但执行过程中没有执行到 done 函数,导致用例执行一直没有结束,直到超时结束。

2.用例调用函数耗时过长,超过用例执行设置的超时时间。

解决方法

1.检查用例代码逻辑,确保即使断言失败场景认可走到 done 函数,保证用例执行结束。

2.可在 IDE 中 Run/Debug Configurations 中修改用例执行超时配置参数,避免用例执行超时。

UI 测试用例常见问题

1、失败日志有“Get windows failed/GetRootByWindow failed”错误信息

问题描述

UI 测试用例执行失败,查看 hilog 日志发现日志中有“Get windows failed/GetRootByWindow failed”错误信息。

可能原因

系统 ArkUI 开关未开启,导致被测试界面控件树信息未生成。

解决方法

执行如下命令,并重启设备再次执行用例。

hdc shell param set persist.ace.testmode.enabled 1

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

问题描述

UI 测试用例执行失败,查看 hilog 日志发现日志中有“uitest-api dose not allow calling concurrently”错误信息。

可能原因

1.用例中 UI 测试框架提供异步接口没有增加 await 语法糖调用。

2.多进程执行 UI 测试用例,导致拉起多个 UITest 进程,框架不支持多进程调用。

解决方法

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

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

3、失败日志有“dose not exist on current UI! Check if the UI has changed after you got the widget object”错误信息

问题描述

UI 测试用例执行失败,查看 hilog 日志发现日志中有“dose not exist on current UI! Check if the UI has changed after you got the widget object”错误信息。

可能原因

在用例中代码查找到目标控件后,设备界面发生了变化,导致查找到的控件丢失,无法进行下一步的模拟操作。

解决方法

重新执行 UI 测试用例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/259304.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跟着我学Python进阶篇:01.试用Python完成一些简单问题

往期文章 跟着我学Python基础篇:01.初露端倪 跟着我学Python基础篇:02.数字与字符串编程 跟着我学Python基础篇:03.选择结构 跟着我学Python基础篇:04.循环 跟着我学Python基础篇:05.函数 跟着我学Python基础篇&#…

c语言力扣题目:消失的数字(有关时间复杂度O(N²)O(N))以及对异或操作符的更深入的理解(如何用人脑的十进制去考量二进制)

目录 Way One :暴力求解,时间复杂度为 O(N) 代码1 Way Two : 时间复杂度限制到 O(N) 代码及其详解 如题 Way One :暴力求解,时间复杂度为 O(N) 大体思路:比如这里我们需要处理的整型数组是"3,0,1",我们可以用冒泡排序或者 qsort函数将他从大到小进行排序成"…

纳米流体传热CFD模拟仿真

纳米流体传热CFD模拟仿真 一、引言 纳米流体传热是当前研究热点之一,由于其独特的传热特性和应用前景,受到了广泛关注。计算流体动力学(CFD)模拟作为一种有效的研究手段,在纳米流体传热领域发挥着重要作用。本文将介绍纳米流体传热CFD模拟的基本原理、方法、应用及未来发…

100GPTS计划-AI编码CodeWizard

地址 https://chat.openai.com/g/g-vX7yfHNcC-code-wizard https://poe.com/CodeWizardGPT 测试 sql 优化 select a.id,a.name,count(b.id),count(c.id) from product a LEFT JOIN secretkey b on a.id b.productId group by a.id LEFT JOIN secretkey c on a.id c.pr…

SLAM算法与工程实践——RTKLIB编译

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址: SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

node.js mongoose middleware

目录 官方文档 简介 定义模型 注册中间件 创建doc实例,并进行增删改查 方法名和注册的中间件名相匹配 执行结果 分析 错误处理中间件 手动抛出错误 注意点 官方文档 Mongoose v8.0.3: Middleware 简介 在mongoose中,中间件是一种允许在执…

Linux静态ip

Linux静态ip Ⅰ、修改静态ip Ⅰ、修改静态ip 修改静态ip必须是root用户 su root //切换root用户 ip a //查看修改前的动态ipvi /etc/sysconfig/network-scripts/ifcfg-ens33 //打开网卡配置文件,修改一处,新增四处 BOOTPROTO&quo…

NumPy教程(一)—— ndarray:多维数组对象

前言 该numpy学习笔记参考了菜鸟教程网、b站up主 孙兴华zz 的《孙兴华中文讲python数据分析三部曲》以及《北理-python数据分析与展示》,课本推荐使用《利用python进行数据分析》 Numpy简介: NumPy(Numerical Python) 是 Python 语言的一个扩展程序库&a…

RHCE8 资料整理(十一)

RHCE8 资料整理 第 32 章 控制语句32.1 判断语句 when32.1.1 when 判断中>、<、!和的使用32.1.2 when 判断中 in的用法32.1.3 when 判断中 is的用法 32.2 判断语句 block-rescue32.3 循环语句 第 32 章 控制语句 一个play中可以包含多个task&#xff0c;如果不想所有的t…

电子学会C/C++编程等级考试2022年06月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:小白鼠再排队2 N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用 “red”,“blue”等字符串来表示。不同的小白…

董宇辉“回归”成为东方甄选高级合伙人,尘埃落地后是谁赢了?

董宇辉“回归”成为东方甄选高级合伙人&#xff0c;尘埃落地后是谁赢了&#xff1f; 董宇辉的“小作文事件”“CEO摔手机事件”迎来大结局了&#xff01; 就在12月18日&#xff0c;董宇辉被任命为新东方教育科技集团董事长文化助理&#xff0c;兼任新东方文旅集团副总裁。有朋…

Excel如何将行的值转换为列值?

问题:Excel如何将行的值转换为列值?(如图左表变成右表) 1.用 SUMIFS(求和区域, 条件区域1, 条件1, [条件区域2, 条件2], ...)函数 比如:=SUMIFS($C$2:$C$8,$A$2:$A$8,H3,$B$2:$B$8,"快车") 2.直接用简单的透视表 (1)随机点击目标目标表格任何位置,点击插入…

Gin之GORM事务(转账操作)

禁用默认事务的操作 为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。 // 全局禁用 db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{SkipDef…

Just Laws -- 中华人民共和国法律文库,简单便捷的打开方式

链接&#xff1a;JustLaws | Home 一个简洁便捷的中华人民共和国法律文库&#xff0c;而且收录比较完善&#xff0c;都是平常网民可能用到比较多的法律知识&#xff0c;目前包括宪法及宪法相关法、民商法、行政法、经济法、社会法、刑法和程序法等等 页面以文档的风格展示每一…

Java设计模式:工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

正向代理和反向代理的区别与联系

一、代理 代理就相当于中间商,本来A和B是可以直接连接的,但是此时添加了一个C在中间,A跟B不直接连接,而是通过C作为中介进行连接。最常见的例子就是二手东,其实很多我们租房子时签约的人不是房子的真正房东,而是房东委托的中介,房东不想管事或者房子太多,只靠自己无法进行管理,…

LVS负载均衡器(DR模式)+nginx七层代理+tomcat多实例+php+mysql 实现负载均衡以及动静分离、数据库的调用!!!

目录 前言 一、nfs共享存储&#xff0c;为两个节点服务器提供静态网页共享 二、nginx作为lvs的后端节点服务器&#xff0c;完成lo:0网卡配置&#xff0c;以及内核参数设置&#xff0c;还有设置路由表 步骤一&#xff1a;先完成nfs共享存储挂载 步骤二&#xff1a;完成lo:0网…

七:爬虫-数据解析之正则表达式

七&#xff1a;正则表达式概述 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xf…

Java解决不同路径问题2

Java解决不同路径问题2 01题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中…

移动云捐赠三款开源项目,加速新一代基础软件生态繁荣

随着云计算、大数据、人工智能等新领域新信息技术的发展&#xff0c;我国基础软件的自主可控极大程度地影响着产业链上下游的多样性和技术创新的发展空间。移动云作为中国移动涉云业务的主入口&#xff0c;一直坚持共享开源价值&#xff0c;积极推动中国开源软件生态的繁荣发展…