作者:leidan、houjing ,華為軟件測(cè)試工程師
測(cè)試是APP開(kāi)發(fā)中一個(gè)重要的環(huán)節(jié),在開(kāi)發(fā)迭代中借助高效易用的測(cè)試工具來(lái)編寫(xiě)和執(zhí)行自動(dòng)化測(cè)試用例,并及時(shí)分析處理用例失敗項(xiàng);同時(shí)測(cè)試也是保障應(yīng)用質(zhì)量和提升開(kāi)發(fā)效率的重要途徑。
然而,由于HarmonyOS應(yīng)用具備一些獨(dú)特性(例如能夠?qū)崿F(xiàn)應(yīng)用的一次開(kāi)發(fā)、多端部署,例如支持使用Java和JS兩種語(yǔ)言進(jìn)行開(kāi)發(fā)和混合開(kāi)發(fā)),因此,除了業(yè)界普遍的APP測(cè)試場(chǎng)景外,HarmonyOS應(yīng)用的測(cè)試還需要解決下述幾個(gè)問(wèn)題:
1.“一次開(kāi)發(fā),多端部署”應(yīng)用的測(cè)試
HarmonyOS APP支持”一次開(kāi)發(fā),多端部署”,即同一套代碼可以針對(duì)不同的目標(biāo)設(shè)備形態(tài)編譯打包出對(duì)應(yīng)的hap。那么,針對(duì)不同設(shè)備形態(tài)的hap,應(yīng)該怎么進(jìn)行測(cè)試呢?
2. 混合語(yǔ)言應(yīng)用的測(cè)試
HarmonyOS APP支持使用多語(yǔ)言(Java、JS等)混合開(kāi)發(fā)且語(yǔ)言互通。那么,開(kāi)發(fā)者應(yīng)該如何測(cè)試多語(yǔ)言開(kāi)發(fā)的APP呢?
想要知道上述兩個(gè)問(wèn)題的答案,那就不要錯(cuò)過(guò)今天的內(nèi)容啦~
今天我們?yōu)榇蠹規(guī)?lái)的是HarmonyOS單元測(cè)試測(cè)試框架的編譯打包/運(yùn)行機(jī)制和關(guān)鍵功能特性,通過(guò)這個(gè)內(nèi)容,你可以快速了解和上手HarmonyOS單元測(cè)試測(cè)試框架哦~
讓我們先來(lái)進(jìn)入HarmonyOS測(cè)試框架機(jī)制介紹,方便大家了解我們的編譯打包和運(yùn)行機(jī)制。
測(cè)試框架機(jī)制介紹
編譯打包/運(yùn)行機(jī)制
根據(jù)HarmonyOS應(yīng)用框架定義,一個(gè)HarmonyOS APP由一個(gè)entry-hap模塊和若干feature-hap模塊構(gòu)成。根據(jù)HarmonyOS應(yīng)用程序框架的多hap機(jī)制,開(kāi)發(fā)者可借助編譯打包工具將“單元測(cè)試測(cè)試框架+測(cè)試代碼”打包為一個(gè)feature-hap,在打包過(guò)程中采用provided依賴(lài)模式關(guān)聯(lián)目標(biāo)APP代碼(可為entry-hap或者feature-hap)。運(yùn)行態(tài)下,測(cè)試hap(test.hap)與目標(biāo)hap(app.hap)被應(yīng)用程序框架共進(jìn)程加載運(yùn)行。
而測(cè)試用例通過(guò)接口調(diào)用來(lái)完成對(duì)目標(biāo)代碼和APP組件的控制、觸發(fā)和查詢(xún),從而實(shí)現(xiàn)測(cè)試邏輯。
測(cè)試代碼的分離打包和共進(jìn)程運(yùn)行機(jī)制
AbilityDelegator為元能力子系統(tǒng)提供的測(cè)試支持能力,用于控制Ability的生命周期,獲取Ability對(duì)象狀態(tài),注入點(diǎn)擊事件等。使用AbilityDelegator可以提升HJUnit測(cè)試用例的開(kāi)發(fā)效率和穩(wěn)定性。
獲取測(cè)試APP進(jìn)程AbilityDelegator實(shí)例的方法:
AbilityDelegatorRegistry.getAbilityDelegator()
“一次開(kāi)發(fā),多端部署”應(yīng)用的測(cè)試
針對(duì)“一次開(kāi)發(fā),多端部署”應(yīng)用的測(cè)試,測(cè)試代碼的編譯打包功能內(nèi)置于HarmonyOS APP編譯打包工具鏈中,自動(dòng)繼承”一次開(kāi)發(fā),多端部署”特性,即同一套測(cè)試代碼可被編譯打包出與目標(biāo)代碼一致的針對(duì)多形態(tài)設(shè)備的hap包(目標(biāo)設(shè)備形態(tài)在APP工程下的config.json中通過(guò)deviceType字段配置)。單元測(cè)試測(cè)試框架在運(yùn)行時(shí)將自動(dòng)識(shí)別當(dāng)前設(shè)備形態(tài)并安裝運(yùn)行相應(yīng)的hap。
一套測(cè)試代碼同時(shí)編譯出多種產(chǎn)品形態(tài)的測(cè)試hap如圖2所示:

(圖2 一套測(cè)試代碼同時(shí)編譯出多種產(chǎn)品形態(tài)的測(cè)試hap)
混合語(yǔ)言應(yīng)用的測(cè)試
混合語(yǔ)言應(yīng)用測(cè)試的語(yǔ)法介紹
HarmonyOS應(yīng)用可以使用Java或者JS開(kāi)發(fā),相應(yīng)的,單元測(cè)試測(cè)試框架通過(guò)HJUnit和HJSUnit支持進(jìn)行Java和JS的測(cè)試,并且支持兩種語(yǔ)言混合執(zhí)行。
目前在2.2.0.200版本及以上的Deveco Studio上新建Java或JS模板工程,main和ohosTest目錄下均包含java和js目錄,用戶(hù)可以在ohosTest目錄下編寫(xiě)java和js測(cè)試用例,對(duì)應(yīng)工程在執(zhí)行時(shí),兩種語(yǔ)言的測(cè)試用例均會(huì)被執(zhí)行。
HJUnit單元測(cè)試測(cè)試框架的實(shí)現(xiàn)基于JUnit4開(kāi)源框架。JUnit為業(yè)界通用的Java單元測(cè)試框架,它通過(guò)Java注解機(jī)制提供了一套用例編寫(xiě)語(yǔ)法規(guī)范,用戶(hù)使用注解來(lái)標(biāo)注測(cè)試過(guò)程各階段的生命周期函數(shù)。HJUnit語(yǔ)法繼承JUnit4,JUnit4的詳細(xì)介紹可以參考下方鏈接。
· JUnit4詳細(xì)介紹
https://junit.org/junit4/
HJSUnit單元測(cè)試測(cè)試框架參考OSGI插件機(jī)制和業(yè)內(nèi)通用的測(cè)試用例表達(dá)方式,使用describe和it函數(shù)標(biāo)識(shí)測(cè)試套和測(cè)試用例,采用expect(XXX).assertXX的斷言方式檢查結(jié)果。JS用例編寫(xiě)語(yǔ)法支持JS的標(biāo)準(zhǔn) ES6語(yǔ)法。
多語(yǔ)言測(cè)試用例介紹
上文我們已經(jīng)提到,DevEco Studio集成了HarmonyOS單元測(cè)試測(cè)試框架,為用戶(hù)提供了Java和JS的單元測(cè)試能力。開(kāi)發(fā)者可以通過(guò)代碼直接測(cè)試項(xiàng)目中的指定類(lèi)、方法,或是針對(duì)UI交互功能的測(cè)試等及時(shí)發(fā)現(xiàn)問(wèn)題,同時(shí)避免在后期開(kāi)發(fā)引入問(wèn)題,大大提升了開(kāi)發(fā)工作效率和保證開(kāi)發(fā)質(zhì)量。那么測(cè)試用例到底是怎么樣的,讓我們來(lái)一探究竟~
HJUnit測(cè)試用例
具體的Demo如下。在這個(gè)Demo中,checkScreenShape用例使用元能力子系統(tǒng)提供的AbilityDelegator測(cè)試Kit,可獲取HarmonyOS應(yīng)用程序Context,進(jìn)而可以在測(cè)試代碼中對(duì)被測(cè)應(yīng)用進(jìn)行查、控制、事件監(jiān)聽(tīng)等操作,以達(dá)到測(cè)試目的。
public class ExampleOhosTest { @Test public void checkScreenShape() { // 獲取 IAbilityDelegator 實(shí)例 final IAbilityDelegator delegator = AbilityDelegatorRegistry.getAbilityDelegator(); // 從IabilityDelegator實(shí)例中獲取應(yīng)用content內(nèi)容 final Context appContext = delegator.getAppContext(); DeviceCapability devCap = appContext.getResourceManager().getDeviceCapability(); assertNotNull(“Null deviceCapability”, devCap); if (devCap.deviceType == DeviceCapability.DEVICE_TYPE_WEARABLE) { // 斷言 assertTrue(“Unexpected display shape”, devCap.isRound); } else { assertFalse(“Unexpected display shape”, devCap.isRound); } } }
HJSUnit測(cè)試用例
這里我們測(cè)試的對(duì)象是pages的彈出對(duì)話(huà)框接口,該接口可以實(shí)現(xiàn)在當(dāng)前頁(yè)面上層彈出對(duì)話(huà)框,顯示指定的文本,在接口測(cè)試中可以通過(guò)接口執(zhí)行回調(diào)判斷當(dāng)前接口是否調(diào)用成功,assertTrue表示成功。
it(‘testPromptDialog’, 0, function() { console.info(‘testPromptDialog START’) prompt.showDialog({ title: ‘dialog showDialog test’, message: ‘message of dialog’, buttons: [ { text: ‘OK’ } ], success: function(ret) { expect(true).assertTrue(); }, cancel: function() { expect(true).assertFalse(); }, complete: function() { console.log(‘[prompt.showDialog] complete’); } }); });
跨語(yǔ)言測(cè)試
HarmonyOS不僅支持使用Java或JS語(yǔ)言進(jìn)行開(kāi)發(fā),也支持混合語(yǔ)言開(kāi)發(fā)。JS UI框架提供了JS FA(Feature Ability)調(diào)用Java PA(Particle Ability)的機(jī)制,該機(jī)制提供了一種通道來(lái)傳遞方法調(diào)用、處理數(shù)據(jù)返回以及訂閱事件上報(bào)。
當(dāng)前提供Ability和Internal Ability兩種調(diào)用方式,開(kāi)發(fā)者可以根據(jù)業(yè)務(wù)場(chǎng)景選擇合適的調(diào)用方式進(jìn)行開(kāi)發(fā)。
Ability:擁有獨(dú)立的Ability生命周期,F(xiàn)A使用遠(yuǎn)端進(jìn)程通信拉起并請(qǐng)求PA服務(wù),適用于基本服務(wù)供多FA調(diào)用或者服務(wù)在后臺(tái)獨(dú)立運(yùn)行的場(chǎng)景。
Internal Ability:與FA共進(jìn)程,采用內(nèi)部函數(shù)調(diào)用的方式和FA進(jìn)行通信,適用于對(duì)服務(wù)響應(yīng)時(shí)延要求較高的場(chǎng)景。該方式下PA不支持其他FA訪(fǎng)問(wèn)調(diào)用。
JS端與Java端通過(guò)bundleName和abilityName來(lái)進(jìn)行關(guān)聯(lián)。在系統(tǒng)收到JS調(diào)用請(qǐng)求后,根據(jù)開(kāi)發(fā)者在JS接口中設(shè)置的參數(shù)來(lái)選擇對(duì)應(yīng)的處理方式。開(kāi)發(fā)者在指定接口onRemoteRequest()中實(shí)現(xiàn)PA提供的業(yè)務(wù)邏輯。詳細(xì)信息請(qǐng)參考JS FA調(diào)用Java PA機(jī)制—— JS FA如何調(diào)用Java PA。
· JS FA如何調(diào)用Java PA
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-js-fa-call-pa-0000001050435961
而在測(cè)試方面,目前單元測(cè)試測(cè)試框架支持上述JS FA調(diào)用PA機(jī)制的使用。
HJSUnit單元測(cè)試測(cè)試框架借助了HarmonyOS應(yīng)用程序框架的多hap機(jī)制,測(cè)試代碼支持“一次開(kāi)發(fā),多端部署”。HJSUnit和HJUnit集成到DevEco Studio上的項(xiàng)目模板上,方便用戶(hù)采用Java和JS兩種語(yǔ)言做測(cè)試。
兩個(gè)測(cè)試框架測(cè)試框架已隨DevEco Studio的Harmony SDK對(duì)外發(fā)布,工具的更新迭代也與DevEco Studio的更新節(jié)奏保持一致,歡迎大家點(diǎn)擊【閱讀原文】查看更多測(cè)試詳情~
編輯:jq
-
HarmonyOS
+關(guān)注
關(guān)注
80文章
2151瀏覽量
35847
原文標(biāo)題:一文帶你看懂HarmonyOS單元測(cè)試框架
文章出處:【微信號(hào):gh_019562b5fb4b,微信公眾號(hào):gh_019562b5fb4b】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
資料] 汽車(chē)軟件質(zhì)量躍遷的系統(tǒng)性路徑:基于ISO 26262標(biāo)準(zhǔn)的單元測(cè)試體系重構(gòu)與中日實(shí)踐深度對(duì)比(2026學(xué)術(shù)研究報(bào)告)
汽車(chē)軟件質(zhì)量躍遷的系統(tǒng)性路徑:基于ISO 26262標(biāo)準(zhǔn)的單元測(cè)試體系重構(gòu)與中日實(shí)踐深度對(duì)比(2026學(xué)術(shù)研究報(bào)告)
嵌入式軟件單元測(cè)試中AI自動(dòng)化與人工檢查的協(xié)同機(jī)制研究:基于專(zhuān)業(yè)工具的實(shí)證分析
C語(yǔ)言單元測(cè)試在嵌入式軟件開(kāi)發(fā)中的作用及專(zhuān)業(yè)工具的應(yīng)用
嵌入軟件單元測(cè)試的全面研究與實(shí)踐
新能源汽車(chē)質(zhì)量保證體系與傳統(tǒng)汽車(chē)單元測(cè)試規(guī)范的融合研究
單元測(cè)試專(zhuān)業(yè)工具在新能源開(kāi)發(fā)中的作用研究
邊聊安全 | 軟件單元測(cè)試的設(shè)計(jì)方法
簡(jiǎn)述HarmonyOS單元測(cè)試框架
評(píng)論