概述
為支撐HarmonyOS操作系統(tǒng)的自動(dòng)化測(cè)試活動(dòng)開展,我們提供了支持JS/TS語言的單元及UI測(cè)試框架,支持開發(fā)者針對(duì)應(yīng)用接口進(jìn)行單元測(cè)試,并且可基于UI操作進(jìn)行UI自動(dòng)化腳本的編寫。
本指南重點(diǎn)介紹自動(dòng)化測(cè)試框架的主要功能,同時(shí)介紹編寫單元/UI自動(dòng)化測(cè)試腳本的方法以及執(zhí)行過程。
簡介
HarmonyOS自動(dòng)化測(cè)試框架arkxtest,作為HarmonyOS工具集的重要組成部分,提供了HarmonyOS自動(dòng)化腳本編寫和運(yùn)行的基礎(chǔ)能力。編寫方面提供了一系列支持測(cè)試腳本編寫的API,包括了基礎(chǔ)流程API、斷言API以及UI操作相關(guān)的API,運(yùn)行方面提供了識(shí)別測(cè)試腳本、調(diào)度執(zhí)行測(cè)試腳本以及匯總測(cè)試腳本執(zhí)行結(jié)果的能力。
實(shí)現(xiàn)原理
框架重要分為兩大部分:單元測(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]供開發(fā)人員在對(duì)應(yīng)測(cè)試場(chǎng)景調(diào)用,而其腳本的運(yùn)行基礎(chǔ)還是上面提到的單元測(cè)試框架。
UI測(cè)試框架的主要功能如下圖所示:
約束與限制
- UI測(cè)試框架的能力在HarmonyOS 3.0 release版本之后方可使用,歷史版本不支持使用。
- 單元測(cè)試框架的部分能力與其版本有關(guān)。
更多鴻蒙開發(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)化腳本的編寫主要基于DevEco Studio,并建議使用3.1.0.400之后的版本進(jìn)行腳本編寫。
腳本執(zhí)行需要PC連接HarmonyOS設(shè)備,如JAD等。
搭建環(huán)境
DevEco Studio可參考其官網(wǎng)介紹進(jìn)行下載,并進(jìn)行相關(guān)的配置動(dòng)作。
新建測(cè)試腳本
- 在DevEco Studio中新建應(yīng)用開發(fā)工程,其中ohos目錄即為測(cè)試腳本所在的目錄。
- 在工程目錄下打開待測(cè)試模塊下的ets文件,將光標(biāo)置于代碼中任意位置,單擊 右鍵 > Show Context Actions> Create Ohos Test或快捷鍵 Alt+enter> Create Ohos Test創(chuàng)建測(cè)試類。
編寫單元測(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è)試代碼編寫,主要編寫測(cè)試代碼的相關(guān)邏輯,如接口調(diào)用等。
3、斷言接口調(diào)用,設(shè)置測(cè)試代碼中的檢查點(diǎn),如無檢查點(diǎn),則不可認(rèn)為一個(gè)完整的測(cè)試腳本。
編寫UI測(cè)試腳本
UI測(cè)試腳本是在單元測(cè)試框架的基礎(chǔ)上編寫,主要就是增加了UI測(cè)試框架提供的接口調(diào)用,實(shí)現(xiàn)對(duì)應(yīng)的測(cè)試邏輯。
下面的示例代碼是在上面的測(cè)試腳本基礎(chǔ)上增量編寫,首先需要增加依賴導(dǎo)包,如下示例代碼所示:
import {Driver,ON,Component,MatchPattern} from '@ohos.UiTest
然后是具體測(cè)試代碼編寫,場(chǎng)景較為簡單,就是在啟動(dòng)的應(yīng)用頁面上進(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));
}
})
}
說明
只支持應(yīng)用內(nèi)使用。暫不支持應(yīng)用外的場(chǎng)景實(shí)現(xiàn)自動(dòng)化,例如與權(quán)限彈窗和SystemUi上的控件進(jìn)行交互。
執(zhí)行測(cè)試腳本
執(zhí)行測(cè)試腳本可以直接在DevEco Studio中通過點(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é)果,如下圖示例所示:
常見問題
單元測(cè)試用例常見問題
1、用例中增加的打印日志在用例結(jié)果之后才打印
問題描述
用例中增加的日志打印信息,沒有在用例執(zhí)行過程中出現(xiàn),而是在用例執(zhí)行結(jié)束之后才出現(xiàn)。
可能原因
此類情況只會(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
問題描述
執(zhí)行測(cè)試用例時(shí)候,用例執(zhí)行失敗,控制臺(tái)返回錯(cuò)誤:fail to start ability。
可能原因
測(cè)試包打包過程中出現(xiàn)問題,未將測(cè)試框架依賴文件打包在測(cè)試包中。
解決方法
檢查測(cè)試包中是否包含TestRunner.abc文件,如沒有則重新編譯打包后再次執(zhí)行測(cè)試。
3、執(zhí)行用例時(shí)報(bào)用例超時(shí)錯(cuò)誤
問題描述
用例執(zhí)行結(jié)束,控制臺(tái)提示execute time XXms錯(cuò)誤,即用例執(zhí)行超時(shí)
可能原因
1.用例執(zhí)行異步接口,但執(zhí)行過程中沒有執(zhí)行到done函數(shù),導(dǎo)致用例執(zhí)行一直沒有結(jié)束,直到超時(shí)結(jié)束。
2.用例調(diào)用函數(shù)耗時(shí)過長,超過用例執(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è)試用例常見問題
1、失敗日志有“Get windows failed/GetRootByWindow failed”錯(cuò)誤信息
問題描述
UI測(cè)試用例執(zhí)行失敗,查看hilog日志發(fā)現(xiàn)日志中有“Get windows failed/GetRootByWindow failed”錯(cuò)誤信息。
可能原因
系統(tǒng)ArkUI開關(guān)未開啟,導(dǎo)致被測(cè)試界面控件樹信息未生成。
解決方法
執(zhí)行如下命令,并重啟設(shè)備再次執(zhí)行用例。
hdc shell param set persist.ace.testmode.enabled
2、失敗日志有“uitest-api dose not allow calling concurrently”錯(cuò)誤信息
問題描述
UI測(cè)試用例執(zhí)行失敗,查看hilog日志發(fā)現(xiàn)日志中有“uitest-api dose not allow calling concurrently”錯(cuò)誤信息。
可能原因
1.用例中UI測(cè)試框架提供異步接口沒有增加await語法糖調(diào)用。
2.多進(jìn)程執(zhí)行UI測(cè)試用例,導(dǎo)致拉起多個(gè)UITest進(jìn)程,框架不支持多進(jìn)程調(diào)用。
解決方法
1.檢查用例實(shí)現(xiàn),異步接口增加await語法糖調(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ò)誤信息
問題描述
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)致查找到的控件丟失,無法進(jìn)行下一步的模擬操作。
解決方法
重新執(zhí)行UI測(cè)試用例。
審核編輯 黃宇
-
自動(dòng)化測(cè)試
+關(guān)注
關(guān)注
0文章
210瀏覽量
26908 -
框架
+關(guān)注
關(guān)注
0文章
403瀏覽量
17483 -
HarmonyOS
+關(guān)注
關(guān)注
79文章
1975瀏覽量
30182 -
鴻蒙OS
+關(guān)注
關(guān)注
0文章
188瀏覽量
4390
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論