鸿蒙Harmony南向开发:OH4.0的应用UT开发原理

背景

新建工程
  1. 新建工程自带的 UT:使用步骤就是点开 Ability.test.ets 然后点击 abilityTest 下的那个绿色箭头就可以看到下面的输出,默认工程会建立一个用例,所以执行结果就是 Tests passed: 

  1. 运行日志可通过 hilog 查看

  2. 命令行执行

    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断言库判断用例实际期望值与预期值是否相符。
3Mock 能力支持函数级 mock 能力,对定义的函数进行 mock 后修改函数的行为,使其返回指定的值或者执行某种动作。
4数据驱动提供数据驱动能力,支持复用同一个测试脚本,使用不同输入数据驱动执行。
5专项能力支持测试套与用例筛选、随机执行、压力测试、超时设置、遇错即停模式等。
使用说明
  1. 基础流程(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 | 获取当前正在执行测试用例的级别、粒度、测试类型 |
  2. 示例代码(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);
        })
      })
    }
    
  3. 断言
    断言功能列表:
No.API功能说明
1assertClose检验 actualvalue 和 expectvalue(0)的接近程度是否是 expectValue(1)。
2assertContain检验 actualvalue 中是否包含 expectvalue。
3assertEqual检验 actualvalue 是否等于 expectvalue[0]。
4assertFail抛出一个错误。
5assertFalse检验 actualvalue 是否是 false。
6assertTrue检验 actualvalue 是否是 true。
7assertInstanceOf检验 actualvalue 是否是 expectvalue 类型,支持基础类型。
8assertLarger检验 actualvalue 是否大于 expectvalue。
9assertLess检验 actualvalue 是否小于 expectvalue。
10assertNull检验 actualvalue 是否是 null。
11assertThrowError检验 actualvalue 抛出 Error 内容是否是 expectValue。
12assertUndefined检验 actualvalue 是否是 undefined。
13assertNaN@since1.0.4 检验 actualvalue 是否是一个 NAN
14assertNegUnlimited@since1.0.4 检验 actualvalue 是否等于 Number.NEGATIVE_INFINITY
15assertPosUnlimited@since1.0.4 检验 actualvalue 是否等于 Number.POSITIVE_INFINITY
16assertDeepEquals@since1.0.4 检验 actualvalue 和 expectvalue 是否完全相等
17assertPromiseIsPending@since1.0.4 判断 promise 是否处于 Pending 状态。
18assertPromiseIsRejected@since1.0.4 判断 promise 是否处于 Rejected 状态。
19assertPromiseIsRejectedWith@since1.0.4 判断 promise 是否处于 Rejected 状态,并且比较执行的结果值。
20assertPromiseIsRejectedWithError@since1.0.4 判断 promise 是否处于 Rejected 状态并有异常,同时比较异常的类型和 message 值。
21assertPromiseIsResolved@since1.0.4 判断 promise 是否处于 Resolved 状态。
22assertPromiseIsResolvedWith@since1.0.4 判断 promise 是否处于 Resolved 状态,并且比较执行的结果值。
23not@since1.0.4 断言取反,支持上面所有的断言功能

** 以上都是 jsunit 的断言**


单元测试框架功能特性(uitest)
No.特性功能说明
1DriverUi 测试的入口,提供查找控件,检查控件存在性以及注入按键能力。
2On用于描述目标控件特征(文本、id、类型等),Driver 根据 On 描述的控件特征信息来查找控件。
3ComponentDriver 查找返回的控件对象,提供查询控件属性,滑动查找等触控和检视能力。
4UiWindowDriver 查找返回的窗口对象,提供获取窗口属性、操作窗口的能力。
使用说明
  1. 引入 uitest 框架
    import {Driver,ON,Component,Uiwindow,MatchPattern} from '@ohos.UiTest'
    
  2. 引入 ability
    import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry';
    
  3. 添加启动应用准备
    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();
    })
    
  4. 添加测试用例
    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();
    })
    

须知

  1. On 类提供的接口全部是同步接口,使用者可以使用 builder 模式链式调用其接口构造控件筛选条件。
  2. Driver 和 Component 类提供的接口全部是异步接口(Promise 形式),需使用 await 语法
  3. Ui 测试用例均需使用****异步语法编写用例,需遵循单元测试框架异步用例编写规范。

  1. 测试运行

  2. 手动测试

    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.
    
  3. 覆盖率结果

    覆盖率

  4. 为啥没覆盖到,可以点击具体部分查看

    覆盖差缺


    红色部分就是没覆盖部分,其实就是生命周期没覆盖,只测试了启动(也就是前台 Foreground,没有后台 Background,也没有 load 失败)所以生命周期的测试不完整。

专项能力

-** **筛选能力

  1. 按测试用例属性筛选

** 可以利用 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
  1. 按测试套/测试用例名称筛选
    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”用例。**

  2. 随机执行
    使测试套与测试用例随机执行,用于稳定性测试。

    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开发必备

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值