背景
新建工程
- 新建工程自带的 UT:使用步骤就是点开 Ability.test.ets 然后点击 abilityTest 下的那个绿色箭头就可以看到下面的输出,默认工程会建立一个用例,所以执行结果就是 Tests passed:
-
运行日志可通过 hilog 查看
-
命令行执行
aa test -b com.example.myapplication -m entry_test -s unittest /ets/testrunner/OpenHarmonyTestRunner -s class ActsAbilityTest -s timeout 15000 OHOS_REPORT_SUM: 1 OHOS_REPORT_STATUS: class=ActsAbilityTest OHOS_REPORT_STATUS: class=ActsAbilityTest OHOS_REPORT_STATUS: current=1 OHOS_REPORT_STATUS: id=JS OHOS_REPORT_STATUS: numtests=1 OHOS_REPORT_STATUS: stream= OHOS_REPORT_STATUS: test=assertContain OHOS_REPORT_STATUS_CODE: 1 OHOS_REPORT_STATUS: class=ActsAbilityTest OHOS_REPORT_STATUS: current=1 OHOS_REPORT_STATUS: id=JS OHOS_REPORT_STATUS: numtests=1 OHOS_REPORT_STATUS: stream= OHOS_REPORT_STATUS: test=assertContain OHOS_REPORT_STATUS_CODE: 0 OHOS_REPORT_STATUS: consuming=6 OHOS_REPORT_STATUS: class=ActsAbilityTest OHOS_REPORT_STATUS: suiteconsuming=6 OHOS_REPORT_RESULT: stream=Tests run: 1, Failure: 0, Error: 0, Pass: 1, Ignore: 0 OHOS_REPORT_CODE: 0 OHOS_REPORT_STATUS: taskconsuming=6 TestFinished-ResultCode: 0 TestFinished-ResultMsg: your test finished!!! user test finished.
以上内容就是入门级使用说明,后面讲点理论
ArtTS 单元测试框架
OpenHarmony 自动化测试框架代码部件仓 arkXtest,包含单元测试框架(JsUnit)和 Ui 测试框架(UiTest)。单元测试框架(JsUnit)提供单元测试用例执行能力,提供用例编写基础接口,生成对应报告,用于测试系统或应用接口。Ui 测试框架(UiTest)通过简洁易用的 API 提供查找和操作界面控件能力,支持用户开发基于界面操作的自动化测试脚本。
目录
arkXtest
|-----jsunit 单元测试框架
|-----uitest Ui测试框架
单元测试框架功能特性(jsunit)
No. | 特性 | 功能说明 |
---|---|---|
1 | 基础流程 | 支持编写及异步执行基础用例。 |
2 | 断言库 | 判断用例实际期望值与预期值是否相符。 |
3 | Mock 能力 | 支持函数级 mock 能力,对定义的函数进行 mock 后修改函数的行为,使其返回指定的值或者执行某种动作。 |
4 | 数据驱动 | 提供数据驱动能力,支持复用同一个测试脚本,使用不同输入数据驱动执行。 |
5 | 专项能力 | 支持测试套与用例筛选、随机执行、压力测试、超时设置、遇错即停模式等。 |
使用说明
- 基础流程(jsunit)
测试用例采用业内通用语法,****describe 代表一个测试套, it 代表一条用例。| No. | API | 功能说明 |
| ------------- | --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| 1 | describe | 定义一个测试套,支持两个参数:测试套名称和测试套函数。 |
| 2 | beforeAll | 在测试套内定义一个预置条件,在所有测试用例开始前执行且仅执行一次,支持一个参数:预置动作函数。 |
| 3 | beforeEach | 在测试套内定义一个单元预置条件,在每条测试用例开始前执行,执行次数与 it 定义的测试用例数一致,支持一个参数:预置动作函数。 |
| 4 | afterEach | 在测试套内定义一个单元清理条件,在每条测试用例结束后执行,执行次数与 it 定义的测试用例数一致,支持一个参数:清理动作函数。 |
| 5 | afterAll | 在测试套内定义一个清理条件,在所有测试用例结束后执行且仅执行一次,支持一个参数:清理动作函数。 |
| 6 | beforeItSpecified | 在测试套内定义一个单元预置条件,仅在指定测试用例开始前执行,支持两个参数:单个用例名称或用例名称数组、预置动作函数。 |
| 7 | afterItSpecified | 在测试套内定义一个单元清理条件,仅在指定测试用例结束后执行,支持两个参数:单个用例名称或用例名称数组、清理动作函数 |
| 8 | it | 定义一条测试用例,支持三个参数:用例名称,过滤参数和用例函数。 |
| 9 | expect | 支持 bool 类型判断等多种断言方法。 |
| 10 | getDescribeName | 获取当前正在执行测试套的名称 |
| 11 | getItName | 获取当前正在执行测试用例的名称 |
| 12 | getItAttribute | 获取当前正在执行测试用例的级别、粒度、测试类型 | - 示例代码(jsunit)
以下就是默认工程里的测试用例:****describe 就是定义一个测试套;it 就是一个测试用例;
什么是测试套?:简单理解就是一组测试用例我们可以定为测试套,比如我要测一个页面的功能,播放,暂停,等等,就可以定义为一个测试套。当然测试套可以可以理解是个大范围,比如完整的一系列功能,比如,所有的 arkui 的控件测试套这种;
什么是测试用例?:可以理解为一个测试项目,比如说我点了“保存”按钮,会存手机名称这样;再简单点就是点了 spinbutton,就会选中;很多测试用例组成一个测试套;import hilog from '@ohos.hilog'; import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; export default function abilityTest() { describe('ActsAbilityTest', () => { // Defines a test suite. Two parameters are supported: test suite name and test suite function. beforeAll(() => { // Presets an action, which is performed only once before all test cases of the test suite start. // This API supports only one parameter: preset action function. }) beforeEach(() => { // Presets an action, which is performed before each unit test case starts. // The number of execution times is the same as the number of test cases defined by **it**. // This API supports only one parameter: preset action function. }) afterEach(() => { // Presets a clear action, which is performed after each unit test case ends. // The number of execution times is the same as the number of test cases defined by **it**. // This API supports only one parameter: clear action function. }) afterAll(() => { // Presets a clear action, which is performed after all test cases of the test suite end. // This API supports only one parameter: clear action function. }) it('assertContain', 0, () => { // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); let a = 'abc'; let b = 'b'; // Defines a variety of assertion methods, which are used to declare expected boolean conditions. expect(a).assertContain(b); expect(a).assertEqual(a); }) }) }
- 断言
断言功能列表:
No. | API | 功能说明 |
---|---|---|
1 | assertClose | 检验 actualvalue 和 expectvalue(0)的接近程度是否是 expectValue(1)。 |
2 | assertContain | 检验 actualvalue 中是否包含 expectvalue。 |
3 | assertEqual | 检验 actualvalue 是否等于 expectvalue[0]。 |
4 | assertFail | 抛出一个错误。 |
5 | assertFalse | 检验 actualvalue 是否是 false。 |
6 | assertTrue | 检验 actualvalue 是否是 true。 |
7 | assertInstanceOf | 检验 actualvalue 是否是 expectvalue 类型,支持基础类型。 |
8 | assertLarger | 检验 actualvalue 是否大于 expectvalue。 |
9 | assertLess | 检验 actualvalue 是否小于 expectvalue。 |
10 | assertNull | 检验 actualvalue 是否是 null。 |
11 | assertThrowError | 检验 actualvalue 抛出 Error 内容是否是 expectValue。 |
12 | assertUndefined | 检验 actualvalue 是否是 undefined。 |
13 | assertNaN | @since1.0.4 检验 actualvalue 是否是一个 NAN |
14 | assertNegUnlimited | @since1.0.4 检验 actualvalue 是否等于 Number.NEGATIVE_INFINITY |
15 | assertPosUnlimited | @since1.0.4 检验 actualvalue 是否等于 Number.POSITIVE_INFINITY |
16 | assertDeepEquals | @since1.0.4 检验 actualvalue 和 expectvalue 是否完全相等 |
17 | assertPromiseIsPending | @since1.0.4 判断 promise 是否处于 Pending 状态。 |
18 | assertPromiseIsRejected | @since1.0.4 判断 promise 是否处于 Rejected 状态。 |
19 | assertPromiseIsRejectedWith | @since1.0.4 判断 promise 是否处于 Rejected 状态,并且比较执行的结果值。 |
20 | assertPromiseIsRejectedWithError | @since1.0.4 判断 promise 是否处于 Rejected 状态并有异常,同时比较异常的类型和 message 值。 |
21 | assertPromiseIsResolved | @since1.0.4 判断 promise 是否处于 Resolved 状态。 |
22 | assertPromiseIsResolvedWith | @since1.0.4 判断 promise 是否处于 Resolved 状态,并且比较执行的结果值。 |
23 | not | @since1.0.4 断言取反,支持上面所有的断言功能 |
** 以上都是 jsunit 的断言**
单元测试框架功能特性(uitest)
No. | 特性 | 功能说明 |
---|---|---|
1 | Driver | Ui 测试的入口,提供查找控件,检查控件存在性以及注入按键能力。 |
2 | On | 用于描述目标控件特征(文本、id、类型等),Driver 根据 On 描述的控件特征信息来查找控件。 |
3 | Component | Driver 查找返回的控件对象,提供查询控件属性,滑动查找等触控和检视能力。 |
4 | UiWindow | Driver 查找返回的窗口对象,提供获取窗口属性、操作窗口的能力。 |
使用说明
- 引入 uitest 框架
import {Driver,ON,Component,Uiwindow,MatchPattern} from '@ohos.UiTest'
- 引入 ability
import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry';
- 添加启动应用准备
beforeAll(async (done: Function) => { // Presets an action, which is performed only once before all test cases of the test suite start. // This API supports only one parameter: preset action function. let abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator(); try { await abilityDelegator.startAbility({ bundleName: 'com.example.myapplication', abilityName: 'EntryAbility' }); } catch (exception) { console.info(TAG, `StartAbility_001 exception = ${JSON.stringify(exception)}`); expect().assertFail(); } done(); })
- 添加测试用例
it('StartAbility_001', 0, async (done: Function) => { console.info(TAG, 'StartAbility_001 begin'); let driver = Driver.create(); await driver.delayMs(100); await driver.assertComponentExist(ON.text('Hello World')); // find component by text let button: Component = await driver.findComponent(ON.text('Hello World').enabled(true)) // click component await button.click() // get and assert component text let content: string = await button.getText() expect(content).assertEqual('Hello World') done(); })
须知
On
类提供的接口全部是同步接口,使用者可以使用builder
模式链式调用其接口构造控件筛选条件。Driver
和Component
类提供的接口全部是异步接口(Promise
形式),需使用await
语法。- Ui 测试用例均需使用****异步语法编写用例,需遵循单元测试框架异步用例编写规范。
-
测试运行
-
手动测试
hdc_std.exe -t 7001005458323933328a017ce1c43800 shell aa test -b com.example.myapplication -m entry_test -s unittest /ets/testrunner/OpenHarmonyTestRunner -s class ActsAbilityTest -s timeout 15000 -s coverage true OHOS_REPORT_SUM: 2 OHOS_REPORT_STATUS: class=ActsAbilityTest OHOS_REPORT_STATUS: class=ActsAbilityTest OHOS_REPORT_STATUS: current=1 OHOS_REPORT_STATUS: id=JS OHOS_REPORT_STATUS: numtests=2 OHOS_REPORT_STATUS: stream= OHOS_REPORT_STATUS: test=assertContain OHOS_REPORT_STATUS_CODE: 1 OHOS_REPORT_STATUS: class=ActsAbilityTest OHOS_REPORT_STATUS: current=1 OHOS_REPORT_STATUS: id=JS OHOS_REPORT_STATUS: numtests=2 OHOS_REPORT_STATUS: stream= OHOS_REPORT_STATUS: test=assertContain OHOS_REPORT_STATUS_CODE: 0 OHOS_REPORT_STATUS: consuming=8 OHOS_REPORT_STATUS: class=ActsAbilityTest OHOS_REPORT_STATUS: current=2 OHOS_REPORT_STATUS: id=JS OHOS_REPORT_STATUS: numtests=2 OHOS_REPORT_STATUS: stream= OHOS_REPORT_STATUS: test=StartAbility_001 OHOS_REPORT_STATUS_CODE: 1 OHOS_REPORT_STATUS: class=ActsAbilityTest OHOS_REPORT_STATUS: current=2 OHOS_REPORT_STATUS: id=JS OHOS_REPORT_STATUS: numtests=2 OHOS_REPORT_STATUS: stream= OHOS_REPORT_STATUS: test=StartAbility_001 OHOS_REPORT_STATUS_CODE: 0 OHOS_REPORT_STATUS: consuming=2397 OHOS_REPORT_STATUS: class=ActsAbilityTest OHOS_REPORT_STATUS: suiteconsuming=2405 OHOS_REPORT_COVERAGE_DATA: {"C:\\Users\\Administrator\\DevEcoStudioProjects\\MyApplication12\\entry\\.test\\default\\intermediates\\source\\entry\\src\\main\\ets\\entryability\\EntryAbility.js":{"path":"C:\\Users\\Administrator\\DevEcoStudioProjects\\MyApplication12\\entry\\.test\\default\\intermediates\\source\\entry\\src\\main\\ets\\entryability\\EntryAbility.js","statementMap":{"0":{"start":{"line":5,"column":8},"end":{"line":5,"column":72}},"1":{"start":{"line":8,"column":8},"end":{"line":8,"column":73}},"2":{"start": OHOS_REPORT_COVERAGE_DATA: {"line":12,"column":8},"end":{"line":12,"column":83}},"3":{"start":{"line":13,"column":8},"end":{"line":20,"column":11}},"4":{"start":{"line":15,"column":12},"end":{"line":18,"column":13}},"5":{"start":{"line":16,"column":16},"end":{"line":16,"column":160}},"6":{"start":{"line":17,"column":16},"end":{"line":17,"column":23}},"7":{"start":{"line":19,"column":12},"end":{"line":19,"column":161}},"8":{"start":{"line":24,"column":8},"end":{"line":24,"column":84}},"9":{"start":{"line":28,"column":8},"e OHOS_REPORT_COVERAGE_DATA: nd":{"line":28,"column":76}},"10":{"start":{"line":32,"column":8},"end":{"line":32,"column":76}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":5}},"loc":{"start":{"line":4,"column":32},"end":{"line":6,"column":5}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":4},"end":{"line":7,"column":5}},"loc":{"start":{"line":7,"column":16},"end":{"line":9,"column":5}},"line":7},"2":{"name":"(anonymous_2)","decl":{"start":{"lin OHOS_REPORT_COVERAGE_DATA: e":10,"column":4},"end":{"line":10,"column":5}},"loc":{"start":{"line":10,"column":37},"end":{"line":21,"column":5}},"line":10},"3":{"name":"(anonymous_3)","decl":{"start":{"line":13,"column":47},"end":{"line":13,"column":48}},"loc":{"start":{"line":13,"column":62},"end":{"line":20,"column":9}},"line":13},"4":{"name":"(anonymous_4)","decl":{"start":{"line":22,"column":4},"end":{"line":22,"column":5}},"loc":{"start":{"line":22,"column":27},"end":{"line":25,"column":5}},"line":22},"5":{"name":"(an OHOS_REPORT_COVERAGE_DATA: onymous_5)","decl":{"start":{"line":26,"column":4},"end":{"line":26,"column":5}},"loc":{"start":{"line":26,"column":19},"end":{"line":29,"column":5}},"line":26},"6":{"name":"(anonymous_6)","decl":{"start":{"line":30,"column":4},"end":{"line":30,"column":5}},"loc":{"start":{"line":30,"column":19},"end":{"line":33,"column":5}},"line":30}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":12},"end":{"line":18,"column":13}},"type":"if","locations":[{"start":{"line":15,"column":12},"end":{"line":1 OHOS_REPORT_COVERAGE_DATA: 8,"column":13}},{"start":{"line":15,"column":12},"end":{"line":18,"column":13}}],"line":15},"1":{"loc":{"start":{"line":16,"column":96},"end":{"line":16,"column":158}},"type":"cond-expr","locations":[{"start":{"line":16,"column":151},"end":{"line":16,"column":153}},{"start":{"line":16,"column":156},"end":{"line":16,"column":158}}],"line":16},"2":{"loc":{"start":{"line":16,"column":96},"end":{"line":16,"column":148}},"type":"binary-expr","locations":[{"start":{"line":16,"column":96},"end":{"line" OHOS_REPORT_COVERAGE_DATA: :16,"column":131}},{"start":{"line":16,"column":135},"end":{"line":16,"column":148}}],"line":16},"3":{"loc":{"start":{"line":19,"column":96},"end":{"line":19,"column":159}},"type":"cond-expr","locations":[{"start":{"line":19,"column":152},"end":{"line":19,"column":154}},{"start":{"line":19,"column":157},"end":{"line":19,"column":159}}],"line":19},"4":{"loc":{"start":{"line":19,"column":96},"end":{"line":19,"column":149}},"type":"binary-expr","locations":[{"start":{"line":19,"column":96},"end":{" OHOS_REPORT_COVERAGE_DATA: line":19,"column":132}},{"start":{"line":19,"column":136},"end":{"line":19,"column":149}}],"line":19}},"s":{"0":1,"1":0,"2":1,"3":1,"4":1,"5":0,"6":0,"7":1,"8":0,"9":1,"10":0},"f":{"0":1,"1":0,"2":1,"3":1,"4":0,"5":1,"6":0},"b":{"0":[0,1],"1":[0,0],"2":[0,0],"3":[0,1],"4":[1,1]},"inputSourceMap":{"version":3,"file":null,"sources":["C:\\Users\\Administrator\\DevEcoStudioProjects\\MyApplication12\\entry\\src\\main\\ets\\entryability\\EntryAbility.ets"],"sourcesContent":["import AbilityConstant fro OHOS_REPORT_COVERAGE_DATA: m '@ohos.app.ability.AbilityConstant';\r\nimport hilog from '@ohos.hilog';\r\nimport UIAbility from '@ohos.app.ability.UIAbility';\r\nimport Want from '@ohos.app.ability.Want';\r\nimport window from '@ohos.window';\r\n\r\nexport default class EntryAbility extends UIAbility {\r\n onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {\r\n hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');\r\n }\r\n\r\n onDestroy(): void {\r\n hilog.info(0x0000, 'testTag', '%{ OHOS_REPORT_COVERAGE_DATA: public}s', 'Ability onDestroy');\r\n }\r\n\r\n onWindowStageCreate(windowStage: window.WindowStage): void {\r\n // Main window is created, set main page for this ability\r\n hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');\r\n\r\n windowStage.loadContent('pages/Index', (err, data) => {\r\n if (err.code) {\r\n hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');\r\n return;\r\n }\r OHOS_REPORT_COVERAGE_DATA: \n hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');\r\n });\r\n }\r\n\r\n onWindowStageDestroy(): void {\r\n // Main window is destroyed, release UI related resources\r\n hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');\r\n }\r\n\r\n onForeground(): void {\r\n // Ability has brought to foreground\r\n hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');\r\n }\r\n\r\ OHOS_REPORT_COVERAGE_DATA: n onBackground(): void {\r\n // Ability has back to background\r\n hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');\r\n }\r\n}\r\n"],"names":[],"mappings":"AACA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA;AAChC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA, OHOS_REPORT_COVERAGE_DATA: CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA6B,CAAC,CAAA;AAIpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,SAAQ,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACjD,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAE,CAAwC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,C OHOS_REPORT_COVERAGE_DATA: AAA,CAAA,CAAA,CAAA;QAC3D,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA;IAClE,CAAC,CAAA;IAED,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACP,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAA OHOS_REPORT_COVERAGE_DATA: C,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA;IACnE,CAAC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,CAAC,CAA+B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACj OHOS_REPORT_COVERAGE_DATA: D,CAAyD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACzD,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,C OHOS_REPORT_COVERAGE_DATA: AAA,CAAA,CAAA,CAAE,CAA6B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA;QAE3E,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA;;YACnD,CAAI,CAAA,CAAA,CAAA,CAAA,CA OHOS_REPORT_COVERAGE_DATA: AA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAA+C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,C OHOS_REPORT_COVERAGE_DATA: AAA,CAAE,MAAA,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAA;gBAC3G,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAI,CAAA,CAAA OHOS_REPORT_COVERAGE_DATA: ,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAoD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,MAAA,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA OHOS_REPORT_COVERAGE_DATA: A,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAA;AAClH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA;IACL,CAAC,CAAA;IAED,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAClB,CAAyD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA OHOS_REPORT_COVERAGE_DATA: ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACzD,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAA8B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CA OHOS_REPORT_COVERAGE_DATA: AC,CAAC,CAAA;IAC9E,CAAC,CAAA;IAED,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACV,CAAoC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACpC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA OHOS_REPORT_COVERAGE_DATA: ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA;IACtE,CAAC,CAAA;IAED,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACV,CAAiC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACjC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA, OHOS_REPORT_COVERAGE_DATA: CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA;IACtE,CAAC,CAAA;AACF,CAAA,CAAA;"},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1fa5972a360e03ca6510e055e7ab75413393cf52"},"C:\\Users\\Administrator\\DevEcoStudioProjects\\MyApplica OHOS_REPORT_COVERAGE_DATA: tion12\\entry\\.test\\default\\intermediates\\source\\entry\\src\\main\\ets\\pages\\Index.js":{"path":"C:\\Users\\Administrator\\DevEcoStudioProjects\\MyApplication12\\entry\\.test\\default\\intermediates\\source\\entry\\src\\main\\ets\\pages\\Index.js","statementMap":{"0":{"start":{"line":4,"column":8},"end":{"line":4,"column":46}},"1":{"start":{"line":5,"column":8},"end":{"line":7,"column":9}},"2":{"start":{"line":6,"column":12},"end":{"line":6,"column":49}},"3":{"start":{"line":8,"column":8}, OHOS_REPORT_COVERAGE_DATA: "end":{"line":8,"column":86}},"4":{"start":{"line":9,"column":8},"end":{"line":9,"column":61}},"5":{"start":{"line":10,"column":8},"end":{"line":10,"column":26}},"6":{"start":{"line":11,"column":8},"end":{"line":11,"column":47}},"7":{"start":{"line":14,"column":8},"end":{"line":16,"column":9}},"8":{"start":{"line":15,"column":12},"end":{"line":15,"column":42}},"9":{"start":{"line":17,"column":8},"end":{"line":19,"column":9}},"10":{"start":{"line":18,"column":12},"end":{"line":18,"column":32}},"1 OHOS_REPORT_COVERAGE_DATA: 1":{"start":{"line":20,"column":8},"end":{"line":22,"column":9}},"12":{"start":{"line":21,"column":12},"end":{"line":21,"column":42}},"13":{"start":{"line":27,"column":8},"end":{"line":27,"column":57}},"14":{"start":{"line":30,"column":8},"end":{"line":30,"column":42}},"15":{"start":{"line":31,"column":8},"end":{"line":31,"column":52}},"16":{"start":{"line":32,"column":8},"end":{"line":32,"column":40}},"17":{"start":{"line":35,"column":8},"end":{"line":35,"column":36}},"18":{"start":{"line":38," OHOS_REPORT_COVERAGE_DATA: column":8},"end":{"line":38,"column":37}},"19":{"start":{"line":41,"column":8},"end":{"line":41,"column":36}},"20":{"start":{"line":42,"column":8},"end":{"line":47,"column":11}},"21":{"start":{"line":43,"column":12},"end":{"line":43,"column":33}},"22":{"start":{"line":44,"column":12},"end":{"line":44,"column":49}},"23":{"start":{"line":46,"column":12},"end":{"line":46,"column":97}},"24":{"start":{"line":50,"column":8},"end":{"line":50,"column":34}},"25":{"start":{"line":51,"column":8},"end":{"li OHOS_REPORT_COVERAGE_DATA: ne":56,"column":11}},"26":{"start":{"line":52,"column":12},"end":{"line":52,"column":33}},"27":{"start":{"line":53,"column":12},"end":{"line":53,"column":47}},"28":{"start":{"line":55,"column":12},"end":{"line":55,"column":95}},"29":{"start":{"line":59,"column":8},"end":{"line":62,"column":16}},"30":{"start":{"line":60,"column":12},"end":{"line":60,"column":25}},"31":{"start":{"line":61,"column":12},"end":{"line":61,"column":31}},"32":{"start":{"line":63,"column":8},"end":{"line":66,"column":19} OHOS_REPORT_COVERAGE_DATA: },"33":{"start":{"line":64,"column":12},"end":{"line":64,"column":28}},"34":{"start":{"line":65,"column":12},"end":{"line":65,"column":33}},"35":{"start":{"line":67,"column":8},"end":{"line":71,"column":17}},"36":{"start":{"line":68,"column":12},"end":{"line":68,"column":38}},"37":{"start":{"line":69,"column":12},"end":{"line":69,"column":30}},"38":{"start":{"line":70,"column":12},"end":{"line":70,"column":45}},"39":{"start":{"line":72,"column":8},"end":{"line":72,"column":19}},"40":{"start":{"l OHOS_REPORT_COVERAGE_DATA: ine":73,"column":8},"end":{"line":73,"column":21}},"41":{"start":{"line":74,"column":8},"end":{"line":74,"column":18}},"42":{"start":{"line":77,"column":8},"end":{"line":77,"column":35}},"43":{"start":{"line":80,"column":0},"end":{"line":80,"column":103}},"44":{"start":{"line":81,"column":0},"end":{"line":81,"column":39}},"45":{"start":{"line":82,"column":0},"end":{"line":82,"column":44}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":4},"end":{"line":3,"column":5}},"lo OHOS_REPORT_COVERAGE_DATA: c":{"start":{"line":3,"column":87},"end":{"line":12,"column":5}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":4},"end":{"line":13,"column":5}},"loc":{"start":{"line":13,"column":38},"end":{"line":23,"column":5}},"line":13},"2":{"name":"(anonymous_2)","decl":{"start":{"line":24,"column":4},"end":{"line":24,"column":5}},"loc":{"start":{"line":24,"column":28},"end":{"line":25,"column":5}},"line":24},"3":{"name":"(anonymous_3)","decl":{"start":{"line":26,"column":4},"end OHOS_REPORT_COVERAGE_DATA: ":{"line":26,"column":5}},"loc":{"start":{"line":26,"column":48},"end":{"line":28,"column":5}},"line":26},"4":{"name":"(anonymous_4)","decl":{"start":{"line":29,"column":4},"end":{"line":29,"column":5}},"loc":{"start":{"line":29,"column":23},"end":{"line":33,"column":5}},"line":29},"5":{"name":"(anonymous_5)","decl":{"start":{"line":34,"column":4},"end":{"line":34,"column":5}},"loc":{"start":{"line":34,"column":18},"end":{"line":36,"column":5}},"line":34},"6":{"name":"(anonymous_6)","decl":{"sta OHOS_REPORT_COVERAGE_DATA: rt":{"line":37,"column":4},"end":{"line":37,"column":5}},"loc":{"start":{"line":37,"column":26},"end":{"line":39,"column":5}},"line":37},"7":{"name":"(anonymous_7)","decl":{"start":{"line":40,"column":4},"end":{"line":40,"column":5}},"loc":{"start":{"line":40,"column":20},"end":{"line":48,"column":5}},"line":40},"8":{"name":"(anonymous_8)","decl":{"start":{"line":42,"column":152},"end":{"line":42,"column":153}},"loc":{"start":{"line":42,"column":163},"end":{"line":45,"column":9}},"line":42},"9": OHOS_REPORT_COVERAGE_DATA: {"name":"(anonymous_9)","decl":{"start":{"line":45,"column":17},"end":{"line":45,"column":18}},"loc":{"start":{"line":45,"column":28},"end":{"line":47,"column":9}},"line":45},"10":{"name":"(anonymous_10)","decl":{"start":{"line":49,"column":4},"end":{"line":49,"column":5}},"loc":{"start":{"line":49,"column":17},"end":{"line":57,"column":5}},"line":49},"11":{"name":"(anonymous_11)","decl":{"start":{"line":51,"column":152},"end":{"line":51,"column":153}},"loc":{"start":{"line":51,"column":163},"en OHOS_REPORT_COVERAGE_DATA: d":{"line":54,"column":9}},"line":51},"12":{"name":"(anonymous_12)","decl":{"start":{"line":54,"column":17},"end":{"line":54,"column":18}},"loc":{"start":{"line":54,"column":28},"end":{"line":56,"column":9}},"line":54},"13":{"name":"(anonymous_13)","decl":{"start":{"line":58,"column":4},"end":{"line":58,"column":5}},"loc":{"start":{"line":58,"column":20},"end":{"line":75,"column":5}},"line":58},"14":{"name":"(anonymous_14)","decl":{"start":{"line":59,"column":39},"end":{"line":59,"column":40}}," OHOS_REPORT_COVERAGE_DATA: loc":{"start":{"line":59,"column":68},"end":{"line":62,"column":9}},"line":59},"15":{"name":"(anonymous_15)","decl":{"start":{"line":63,"column":39},"end":{"line":63,"column":40}},"loc":{"start":{"line":63,"column":68},"end":{"line":66,"column":9}},"line":63},"16":{"name":"(anonymous_16)","decl":{"start":{"line":67,"column":39},"end":{"line":67,"column":40}},"loc":{"start":{"line":67,"column":68},"end":{"line":71,"column":9}},"line":67},"17":{"name":"(anonymous_17)","decl":{"start":{"line":76,"c OHOS_REPORT_COVERAGE_DATA: olumn":4},"end":{"line":76,"column":5}},"loc":{"start":{"line":76,"column":15},"end":{"line":78,"column":5}},"line":76}},"branchMap":{"0":{"loc":{"start":{"line":3,"column":48},"end":{"line":3,"column":59}},"type":"default-arg","locations":[{"start":{"line":3,"column":57},"end":{"line":3,"column":59}}],"line":3},"1":{"loc":{"start":{"line":3,"column":61},"end":{"line":3,"column":85}},"type":"default-arg","locations":[{"start":{"line":3,"column":76},"end":{"line":3,"column":85}}],"line":3},"2":{" OHOS_REPORT_COVERAGE_DATA: loc":{"start":{"line":5,"column":8},"end":{"line":7,"column":9}},"type":"if","locations":[{"start":{"line":5,"column":8},"end":{"line":7,"column":9}},{"start":{"line":5,"column":8},"end":{"line":7,"column":9}}],"line":5},"3":{"loc":{"start":{"line":14,"column":8},"end":{"line":16,"column":9}},"type":"if","locations":[{"start":{"line":14,"column":8},"end":{"line":16,"column":9}},{"start":{"line":14,"column":8},"end":{"line":16,"column":9}}],"line":14},"4":{"loc":{"start":{"line":17,"column":8},"e OHOS_REPORT_COVERAGE_DATA: nd":{"line":19,"column":9}},"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":19,"column":9}},{"start":{"line":17,"column":8},"end":{"line":19,"column":9}}],"line":17},"5":{"loc":{"start":{"line":20,"column":8},"end":{"line":22,"column":9}},"type":"if","locations":[{"start":{"line":20,"column":8},"end":{"line":22,"column":9}},{"start":{"line":20,"column":8},"end":{"line":22,"column":9}}],"line":20}},"s":{"0":1,"1":1,"2":0,"3":1,"4":1,"5":1,"6":1,"7":1,"8":0,"9":1,"10":0,"11" OHOS_REPORT_COVERAGE_DATA: :1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":1,"18":0,"19":1,"20":1,"21":0,"22":0,"23":1,"24":1,"25":1,"26":0,"27":0,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":0,"43":1,"44":1,"45":1},"f":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":1,"6":0,"7":1,"8":0,"9":1,"10":1,"11":0,"12":1,"13":1,"14":1,"15":1,"16":1,"17":0},"b":{"0":[1],"1":[1],"2":[0,1],"3":[0,1],"4":[0,1],"5":[0,1]},"inputSourceMap":{"version":3,"file":null,"sources":["C:\\Users\\Administr OHOS_REPORT_COVERAGE_DATA: ator\\DevEcoStudioProjects\\MyApplication12\\entry\\src\\main\\ets\\pages\\Index.ets"],"sourcesContent":["import resourceManager from '@ohos.resourceManager';\nimport { BusinessError } from '@ohos.base';\n@Entry\n@Component\nstruct Index {\n @State message: string = 'Hello World';\n sm = resourceManager.getSystemResourceManager();\n teststr = ''\n\n aboutToAppear() {\n console.log('abouttoapper')\n this.sm.getStringValue($r('app.string.EntryAbility_label').id).then((value:string) => {\ OHOS_REPORT_COVERAGE_DATA: n this.teststr = value\n console.log('abouttoapper: ', value)\n }).catch((error : BusinessError) => {\n console.log(\"abouttoapper getStringValue promise error is \" + JSON.stringify(error));\n });\n }\n onPageShow() {\n console.log('onPageShow')\n this.sm.getStringValue($r('app.string.EntryAbility_label').id).then((value:string) => {\n this.teststr = value\n console.log('onPageShow: ', value)\n }).catch((error : BusinessError) => {\n console.log(\" OHOS_REPORT_COVERAGE_DATA: onPageShow getStringValue promise error is \" + JSON.stringify(error));\n });\n }\n\n build() {\n Row() {\n Column() {\n Text(this.message)\n .fontSize(50)\n .fontWeight(FontWeight.Bold)\n }\n .width('100%')\n }\n .height('100%')\n }\n}"],"names":[],"mappings":"AAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA OHOS_REPORT_COVERAGE_DATA: A,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAC,CAAA;MAI7C,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAFZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,C OHOS_REPORT_COVERAGE_DATA: AAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;sDAG2B,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;kBACjC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,wBAAwB,CAAE,CAAA,CAAA,CAAA;uBACrC,CAAE,CAAA,CAAA,CAAA;;AAN6B,CAAA,CAAA,CAAA,CA OHOS_REPORT_COVERAGE_DATA: AA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;QAIlC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;QAAP,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;IAId,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA;AAC3B, OHOS_REPORT_COVERAGE_DATA: CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAoC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA OHOS_REPORT_COVERAGE_DATA: ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAY,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA;AACnF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA;AAC OHOS_REPORT_COVERAGE_DATA: pB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAG,CAAA,CAAA,CAAC,gBAAgB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAqB,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CA OHOS_REPORT_COVERAGE_DATA: AA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA+C,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AACvF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA;IACL,CAAC,CAAA;IACD,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA, OHOS_REPORT_COVERAGE_DATA: CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAA,CAAA;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAoC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA OHOS_REPORT_COVERAGE_DATA: A,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAY,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA;AAC OHOS_REPORT_COVERAGE_DATA: nF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAG,CAAA,CAAA,CAAC,cAAc,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAqB,EAAE,CAAE,CAAA,CAAA,CAAA OHOS_REPORT_COVERAGE_DATA: ,CAAA;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA6C,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AACrF,C OHOS_REPORT_COVERAGE_DATA: AAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA;IACL,CAAC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;YACE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAAH,CAAG,CAAA,CAAA,CAQF,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;YAPZ,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAAN,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAK OHOS_REPORT_COVERAGE_DATA: L,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;YAJX,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAAjB,CAAI,CAAA,CAAA,CAAA,CACD,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA;AADd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA, OHOS_REPORT_COVERAGE_DATA: CAAA,CAAA,CAAU,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;QAF7B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QADN,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QADR,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AASJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;"},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"d26361759c1c5175ca20706fb24dd56ad5f9d277"}} OHOS_REPORT_RESULT: stream=Tests run: 2, Failure: 0, Error: 0, Pass: 2, Ignore: 0 OHOS_REPORT_CODE: 0 OHOS_REPORT_STATUS: taskconsuming=2405 TestFinished-ResultCode: 0 TestFinished-ResultMsg: your test finished!!! user test finished.
-
覆盖率结果
-
为啥没覆盖到,可以点击具体部分查看
红色部分就是没覆盖部分,其实就是生命周期没覆盖,只测试了启动(也就是前台 Foreground,没有后台 Background,也没有 load 失败)所以生命周期的测试不完整。
专项能力
-** **筛选能力
- 按测试用例属性筛选
** 可以利用 hypium 提供的 Level、Size、TestType 对象,对测试用例进行标记,以区分测试用例的级别、粒度、测试类型,各字段含义及代码如下:**
Key | 含义说明 | Value 取值说明 |
---|---|---|
level | 用例级别 | "0","1","2","3","4", 例如:-s level 1 |
size | 用例粒度 | "small","medium","large", 例如:-s size small "small","medium","large", 例如:-s size small |
testType | 用例测试类型 | "function","performance","power","reliability","security","global","compatibility","user","standard","safety","resilience", 例如:-s testType function |
** 示例代码:**
import { describe, it, expect, TestType, Size, Level } from '@ohos/hypium';
export default function attributeTest() {
describe('attributeTest', () => {
it("testAttributeIt", TestType.FUNCTION | Size.SMALLTEST | Level.LEVEL0, () => {
console.info('Hello Test');
})
})
}
示例命令:
hdc shell aa test -b xxx -m xxx -s unittest OpenHarmonyTestRunner -s testType function -s size small -s level 0
-
按测试套/测试用例名称筛选
hypium 可以通过指定测试套与测试用例名称,来指定特定用例的执行,测试套与用例名称用“#”号连接,多个用“,”英文逗号分隔Key 含义说明 Value 取值范围 class 指定要执行的测试套&用例 **${describeName}#${itName},${describeName} , 例如:-s class attributeTest#testAttributeIt** notClass 指定不执行的测试套&用例 **${describeName}#${itName},${describeName} , 例如:-s notClass attributeTest#testAttribu** 示例代码:
import { describe, it, expect, TestType, Size, Level } from '@ohos/hypium'; export default function attributeTest() { describe('describeTest_000', () => { it("testIt_00", TestType.FUNCTION | Size.SMALLTEST | Level.LEVEL0, () => { console.info('Hello Test'); }) it("testIt_01", TestType.FUNCTION | Size.SMALLTEST | Level.LEVEL0, () => { console.info('Hello Test'); }) }) describe('describeTest_001', () => { it("testIt_02", TestType.FUNCTION | Size.SMALLTEST | Level.LEVEL0, () => { console.info('Hello Test'); }) }) }
** 示例命令 1: **
hdc shell aa test -b xxx -m xxx -s unittest OpenHarmonyTestRunner -s class describeTest_000#testIt_00,describeTest_001
** 该命令作用是执行“describeTest_001”测试套中所用用例,以及“describeTest_000”测试套中的“testIt_00”用例。**
** 示例命令 2:**
hdc shell aa test -b xxx -m xxx -s unittest OpenHarmonyTestRunner -s notClass describeTest_000#testIt_01
** 该命令作用是不执行“describeTest_000”测试套中的“testIt_01”用例。**
-
随机执行
使测试套与测试用例随机执行,用于稳定性测试。Key 含义说明 Value 取值范围 random @since1.0.3 测试套、测试用例随机执行 true, 不传参默认为 false, 例如:-s random true 示例命令:
hdc shell aa test -b xxx -m xxx -s unittest OpenHarmonyTestRunner -s stress 1000
UT 有用的命令
-
用例超时时间设置
指定测试用例执行的超时时间,用例实际耗时如果大于超时时间,用例会抛出"timeout"异常,用例结果会显示“excute timeout XXX”Key 含义说明 Value 取值范围 timeout 指定测试用例执行的超时时间 正整数(单位 ms),默认为 5000,例如: -s timeout 15000 示例命令:
hdc shell aa test -b xxx -m xxx -s unittest OpenHarmonyTestRunner -s timeout 15000
-
遇错即停模式
Key 含义说明 Value 取值范围 breakOnError @since1.0.6 遇错即停模式,当执行用例断言失败或者发生错误时,退出测试执行流程 true, 不传参默认为 false, 例如:-s breakOnError true 示例命令:
hdc shell aa test -b xxx -m xxx -s unittest OpenHarmonyTestRunner -s breakOnError true
-
测试套中用例信息输出
输出测试应用中待执行的测试用例信息Key 含义说明 Value 取值范围 dryRun 显示待执行的测试用例信息全集 true, 不传参默认为 false, 例如:-s dryRun true 示例命令:
hdc shell aa test -b xxx -m xxx -s unittest OpenHarmonyTestRunner -s dryRun true
最后
小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。
为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:
希望这一份鸿蒙学习资料能够给大家带来帮助~
鸿蒙(HarmonyOS NEXT)最新学习路线
该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案
路线图适合人群:
IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术
2.视频学习资料+学习PDF文档
(鸿蒙语法ArkTS、TypeScript、ArkUI教程……)
纯血版鸿蒙全套学习资料(面试、文档、全套视频等)
鸿蒙APP开发必备
总结
参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线