概述
為支撐HarmonyOS操作系統(tǒng)的自動(dòng)化測(cè)試活動(dòng)開(kāi)展,我們提供了支持JS/TS語(yǔ)言的單元及UI測(cè)試框架,支持開(kāi)發(fā)者針對(duì)應(yīng)用接口進(jìn)行單元測(cè)試,并且可基于UI操作進(jìn)行UI自動(dòng)化腳本的編寫(xiě)。
本指南重點(diǎn)介紹自動(dòng)化測(cè)試框架的主要功能,同時(shí)介紹編寫(xiě)單元/UI自動(dòng)化測(cè)試腳本的方法以及執(zhí)行過(guò)程。
簡(jiǎn)介
HarmonyOS自動(dòng)化測(cè)試框架arkxtest,作為HarmonyOS工具集的重要組成部分,提供了HarmonyOS自動(dòng)化腳本編寫(xiě)和運(yùn)行的基礎(chǔ)能力。編寫(xiě)方面提供了一系列支持測(cè)試腳本編寫(xiě)的API,包括了基礎(chǔ)流程API、斷言API以及UI操作相關(guān)的API,運(yùn)行方面提供了識(shí)別測(cè)試腳本、調(diào)度執(zhí)行測(cè)試腳本以及匯總測(cè)試腳本執(zhí)行結(jié)果的能力。
實(shí)現(xiàn)原理
框架重要分為兩大部分:?jiǎn)卧獪y(cè)試框架和UI測(cè)試框架。
- 單元測(cè)試框架
單元測(cè)試框架是測(cè)試框架的基礎(chǔ)底座,提供了最基本的用例識(shí)別、調(diào)度、執(zhí)行及結(jié)果匯總的能力。主要功能如下圖所示:
單元測(cè)試腳本的基礎(chǔ)運(yùn)行流程如下圖所示,依賴aa test命令作為執(zhí)行入口,該命令可具體參考。 - UI測(cè)試框架
UI測(cè)試框架主要對(duì)外提供了[UiTest API]供開(kāi)發(fā)人員在對(duì)應(yīng)測(cè)試場(chǎng)景調(diào)用,而其腳本的運(yùn)行基礎(chǔ)還是上面提到的單元測(cè)試框架。
UI測(cè)試框架的主要功能如下圖所示:
約束與限制
- UI測(cè)試框架的能力在HarmonyOS 3.0 release版本之后方可使用,歷史版本不支持使用。
- 單元測(cè)試框架的部分能力與其版本有關(guān)。
更多鴻蒙開(kāi)發(fā)應(yīng)用知識(shí)已更新[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md
]參考前往。
環(huán)境準(zhǔn)備
[docs.qq.com/doc/DUmN4VVhBd3NxdExK
]
環(huán)境要求
或者添加mau123789是v喔記住添加
自動(dòng)化腳本的編寫(xiě)主要基于DevEco Studio,并建議使用3.1.0.400之后的版本進(jìn)行腳本編寫(xiě)。
腳本執(zhí)行需要PC連接HarmonyOS設(shè)備,如JAD等。
搭建環(huán)境
DevEco Studio可參考其官網(wǎng)介紹進(jìn)行下載,并進(jìn)行相關(guān)的配置動(dòng)作。
新建測(cè)試腳本
- 在DevEco Studio中新建應(yīng)用開(kāi)發(fā)工程,其中ohos目錄即為測(cè)試腳本所在的目錄。
- 在工程目錄下打開(kāi)待測(cè)試模塊下的ets文件,將光標(biāo)置于代碼中任意位置,單擊 右鍵 > Show Context Actions> Create Ohos Test或快捷鍵 Alt+enter> Create Ohos Test創(chuàng)建測(cè)試類(lèi)。
編寫(xiě)單元測(cè)試腳本
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));
}
})
}復(fù)制
單元測(cè)試腳本需要包含如下基本元素:
1、依賴導(dǎo)包,以便使用依賴的測(cè)試接口。
2、測(cè)試代碼編寫(xiě),主要編寫(xiě)測(cè)試代碼的相關(guān)邏輯,如接口調(diào)用等。
3、斷言接口調(diào)用,設(shè)置測(cè)試代碼中的檢查點(diǎn),如無(wú)檢查點(diǎn),則不可認(rèn)為一個(gè)完整的測(cè)試腳本。
編寫(xiě)UI測(cè)試腳本
UI測(cè)試腳本是在單元測(cè)試框架的基礎(chǔ)上編寫(xiě),主要就是增加了UI測(cè)試框架提供的接口調(diào)用,實(shí)現(xiàn)對(duì)應(yīng)的測(cè)試邏輯。
下面的示例代碼是在上面的測(cè)試腳本基礎(chǔ)上增量編寫(xiě),首先需要增加依賴導(dǎo)包,如下示例代碼所示:
import {Driver,ON,Component,MatchPattern} from '@ohos.UiTest
然后是具體測(cè)試代碼編寫(xiě),場(chǎng)景較為簡(jiǎn)單,就是在啟動(dòng)的應(yīng)用頁(yè)面上進(jìn)行點(diǎn)擊操作,然后增加檢查點(diǎn)檢查用例。
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));
}
})
}
說(shuō)明
只支持應(yīng)用內(nèi)使用。暫不支持應(yīng)用外的場(chǎng)景實(shí)現(xiàn)自動(dòng)化,例如與權(quán)限彈窗和SystemUi上的控件進(jìn)行交互。
執(zhí)行測(cè)試腳本
執(zhí)行測(cè)試腳本可以直接在DevEco Studio中通過(guò)點(diǎn)擊按鈕執(zhí)行,當(dāng)前支持以下執(zhí)行方式:
1、測(cè)試包級(jí)別執(zhí)行即執(zhí)行測(cè)試包內(nèi)的全部用例。
2、測(cè)試套級(jí)別執(zhí)行即執(zhí)行describe方法中定義的全部測(cè)試用例。
3、測(cè)試方法級(jí)別執(zhí)行即執(zhí)行指定it方法也就是單條測(cè)試用例。
查看測(cè)試結(jié)果
測(cè)試執(zhí)行完畢后可直接在DevEco Studio中查看測(cè)試結(jié)果,如下圖示例所示:
常見(jiàn)問(wèn)題
單元測(cè)試用例常見(jiàn)問(wèn)題
1、用例中增加的打印日志在用例結(jié)果之后才打印
問(wèn)題描述
用例中增加的日志打印信息,沒(méi)有在用例執(zhí)行過(guò)程中出現(xiàn),而是在用例執(zhí)行結(jié)束之后才出現(xiàn)。
可能原因
此類(lèi)情況只會(huì)存在于用例中有調(diào)用異步接口的情況,原則上用例中所有的日志信息均在用例執(zhí)行結(jié)束之前打印。
解決方法
當(dāng)被調(diào)用的異步接口多于一個(gè)時(shí),建議將接口調(diào)用封裝成Promise方式調(diào)用。
2、執(zhí)行用例時(shí)報(bào)error:fail to start ability
問(wèn)題描述
執(zhí)行測(cè)試用例時(shí)候,用例執(zhí)行失敗,控制臺(tái)返回錯(cuò)誤:fail to start ability。
可能原因
測(cè)試包打包過(guò)程中出現(xiàn)問(wèn)題,未將測(cè)試框架依賴文件打包在測(cè)試包中。
解決方法
檢查測(cè)試包中是否包含TestRunner.abc文件,如沒(méi)有則重新編譯打包后再次執(zhí)行測(cè)試。
3、執(zhí)行用例時(shí)報(bào)用例超時(shí)錯(cuò)誤
問(wèn)題描述
用例執(zhí)行結(jié)束,控制臺(tái)提示execute time XXms錯(cuò)誤,即用例執(zhí)行超時(shí)
可能原因
1.用例執(zhí)行異步接口,但執(zhí)行過(guò)程中沒(méi)有執(zhí)行到done函數(shù),導(dǎo)致用例執(zhí)行一直沒(méi)有結(jié)束,直到超時(shí)結(jié)束。
2.用例調(diào)用函數(shù)耗時(shí)過(guò)長(zhǎng),超過(guò)用例執(zhí)行設(shè)置的超時(shí)時(shí)間。
解決方法
1.檢查用例代碼邏輯,確保即使斷言失敗場(chǎng)景認(rèn)可走到done函數(shù),保證用例執(zhí)行結(jié)束。
2.可在IDE中Run/Debug Configurations中修改用例執(zhí)行超時(shí)配置參數(shù),避免用例執(zhí)行超時(shí)。
UI測(cè)試用例常見(jiàn)問(wèn)題
1、失敗日志有“Get windows failed/GetRootByWindow failed”錯(cuò)誤信息
問(wèn)題描述
UI測(cè)試用例執(zhí)行失敗,查看hilog日志發(fā)現(xiàn)日志中有“Get windows failed/GetRootByWindow failed”錯(cuò)誤信息。
可能原因
系統(tǒng)ArkUI開(kāi)關(guān)未開(kāi)啟,導(dǎo)致被測(cè)試界面控件樹(shù)信息未生成。
解決方法
執(zhí)行如下命令,并重啟設(shè)備再次執(zhí)行用例。
hdc shell param set persist.ace.testmode.enabled
2、失敗日志有“uitest-api dose not allow calling concurrently”錯(cuò)誤信息
問(wèn)題描述
UI測(cè)試用例執(zhí)行失敗,查看hilog日志發(fā)現(xiàn)日志中有“uitest-api dose not allow calling concurrently”錯(cuò)誤信息。
可能原因
1.用例中UI測(cè)試框架提供異步接口沒(méi)有增加await語(yǔ)法糖調(diào)用。
2.多進(jìn)程執(zhí)行UI測(cè)試用例,導(dǎo)致拉起多個(gè)UITest進(jìn)程,框架不支持多進(jìn)程調(diào)用。
解決方法
1.檢查用例實(shí)現(xiàn),異步接口增加await語(yǔ)法糖調(diào)用。
2.避免多進(jìn)程執(zhí)行UI測(cè)試用例。
3、失敗日志有“dose not exist on current UI! Check if the UI has changed after you got the widget object”錯(cuò)誤信息
問(wèn)題描述
UI測(cè)試用例執(zhí)行失敗,查看hilog日志發(fā)現(xiàn)日志中有“dose not exist on current UI! Check if the UI has changed after you got the widget object”錯(cuò)誤信息。
可能原因
在用例中代碼查找到目標(biāo)控件后,設(shè)備界面發(fā)生了變化,導(dǎo)致查找到的控件丟失,無(wú)法進(jìn)行下一步的模擬操作。
解決方法
重新執(zhí)行UI測(cè)試用例。
審核編輯 黃宇
-
自動(dòng)化測(cè)試
+關(guān)注
關(guān)注
0文章
231瀏覽量
27269 -
框架
+關(guān)注
關(guān)注
0文章
404瀏覽量
17823 -
HarmonyOS
+關(guān)注
關(guān)注
80文章
2085瀏覽量
32357 -
鴻蒙OS
+關(guān)注
關(guān)注
0文章
191瀏覽量
4918
發(fā)布評(píng)論請(qǐng)先 登錄
OPhone自動(dòng)化測(cè)試技術(shù)概述
自動(dòng)化測(cè)試框架思想和構(gòu)建
HarmonyOS自動(dòng)化測(cè)試框架—Hypium
HamronyOS自動(dòng)化測(cè)試框架使用指南
常用軟件測(cè)試自動(dòng)化框架
全面提升自動(dòng)化測(cè)試,NI TestStand 2012新模塊化框架
基于Web的自動(dòng)化測(cè)試框架的研究

Python自動(dòng)化測(cè)試框架有哪些?
Python接口測(cè)試框架實(shí)戰(zhàn)與自動(dòng)化進(jìn)階視頻教程免費(fèi)下載

什么是自動(dòng)化測(cè)試框架?
HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-音視頻體驗(yàn)精準(zhǔn)化自動(dòng)化測(cè)試技術(shù)

自動(dòng)化測(cè)試框架unittes詳解
什么是自動(dòng)化測(cè)試框架
OpenHarmony自動(dòng)化測(cè)試框架開(kāi)發(fā)指南

評(píng)論