目录

黑盒覆盖率测试

DevEco Studio支持黑盒覆盖率测试,不需要开发测试用例,将编译插桩的HAP包推到设备上,然后对该应用/元服务模拟用户操作,测试完成后可生成覆盖率报告,当前仅支持Stage模型。

使用约束

前置操作

将设备与电脑进行连接,并对应用/元服务签名,具体请参考使用本地真机运行应用和应用/元服务签名。

配置覆盖率过滤文件

从DevEco Studio 5.1.0 Release版本开始,支持自定义参与覆盖率测试的文件。在工程目录下创建coverage-filter.json5文件,在文件中配置相关字段,DevEco Studio编译插桩时将按照coverage-filter.json5文件中的配置进行过滤。

修改配置文件后不会触发增量编译,需要重新编译插桩再测试。

[h2]coverage-filter.json5文件字段说明

coverage-filter.json5文件支持以下字段。

字段名称

可选/必选

类型

适用的覆盖率测试

含义

include

可选

字符串数组

黑盒覆盖率测试

仪器覆盖率测试

本地覆盖率测试

配置参与覆盖率测试的文件或文件夹路径。

  • 26.0.0及以上版本:字段可选,路径配置支持以下通配符。
    • *:匹配文件名中的任意数量字符。
    • **:匹配任意文件夹。
    • ?:匹配文件名的单个字符。
  • 26.0.0以下版本:字段必选,仅支持模块名开头的路径,不支持通配符。
说明:

include的优先级比exclude高。

exclude

可选

字符串数组

黑盒覆盖率测试

仪器覆盖率测试

本地覆盖率测试

配置不参与覆盖率测试的文件或文件夹路径。

  • 26.0.0及以上版本:字段可选,路径配置支持通配符,支持的通配符和include字段相同。
  • 26.0.0以下版本:字段必选,仅支持模块名开头的路径,不支持通配符。

includeHar

可选

字符串数组

黑盒覆盖率测试

仪器覆盖率测试

本地覆盖率测试

配置参与覆盖率测试的远程源码har包,不支持远程字节码har包,不支持通配符。

从26.0.0版本开始支持。

extraAbilities

可选

对象数组

黑盒覆盖率测试

如果module.json5中配置的ability是通过import外部的ability类实现,同时在当前文件通过export导出,此ability无法生成黑盒覆盖率数据。可配置extraAbilities>path字段,填写外部的ability路径,生成黑盒覆盖率数据。支持相对路径,不支持通配符。示例如下。

从26.0.0版本开始支持。

extraAbilities字段示例:

// xxx.ets
import EntryAbility  from './EntryAbility';
export default EntryAbility;

// coverage-filter.json5
{
  "extraAbilities": [
    {
      "path": "entry/src/main/ets/entryability/EntryAbility.ets",   // import的EntryAbility的相对路径
    },
  ],
}

[h2]coverage-filter.json5文件示例

// 26.0.0及以上版本
{
  "include":[
    "entry/src/main/ets/pages"  // 无通配符,包括pages下所有文件
  ],
  "exclude":[
    "**/src/**/HspTest?.ets",   // src目录下的HspTest1.ets、HspTest2.ets等文件
    "**/src/**/*Test1.*",       // src目录下所有文件名中有Test1.的文件
    "**/src/**/utils"    	// src目录底下所有utils文件夹里的文件
  ],
  "includeHar":[
    "math"    
  ],
  "extraAbilities": [
    {
      "path": "entry/src/main/ets/entryability/EntryAbility.ets"
    }
  ]
}
// 26.0.0以下版本
{
  "include":[
    "entry/src/main/ets/pages/aaa.ets"
  ],
  "exclude":[
    "entry/src/main/ets/pages"
  ]
}

执行覆盖率测试

[h2]编译与安装

有两种方式进行编译与安装,DevEco Studio方式和命令行方式,具体步骤如下。

[h2]进行测试

在设备上模拟用户操作,进行黑盒测试,测试完毕后,通过以下方式,生成覆盖率数据。
  • 针对UIAbility和存在onDump方法的ExtensionAbility,执行命令生成覆盖率数据。UIAbility从DevEco Studio 5.1.0 Release版本开始支持,ExtensionAbility从DevEco Studio 6.0.1 Beta1版本开始支持。
    hdc shell aa dump -c -l
  • 针对UIAbility,退出应用,触发onDestroy()回调,生成覆盖率数据。
  • 针对存在onDestroy方法的ExtensionAbility,Ability销毁时,触发onDestroy()回调,生成覆盖率数据。从DevEco Studio 6.0.1 Beta1版本开始支持。
  • 针对UIAbility,支持通过EventHub接口通知UIAbility生成覆盖率数据。从DevEco Studio 6.0.2 Beta1版本开始支持。
    const context = this.getUIContext().getHostContext() as common.UIAbilityContext;
    context.eventHub.emit('coverage');

从API 13开始,如果用户使用最近任务列表一键清理来关闭应用,将不会执行onDestroy()回调,导致获取不到覆盖率数据。

[h2]生成覆盖率报告

  1. 从设备上取出覆盖率数据json文件存放到电脑本地,该命令会将cache目录下的所有文件都保存到LocalPath目录下。
    // 如果是应用则执行该命令,其中LocalPath非必填,如果不填写,默认存放在当前执行命令的目录
    hdc file recv data/app/el2/100/base/{bundleName}/haps/{moduleName}/cache {LocalPath}
    // 如果是元服务则执行该命令,其中LocalPath必填
    hdc file recv -b {bundleName} ls ./data/storage/el2/base/haps/{moduleName}/cache {LocalPath}
    • LocalPath:数据在电脑本地存放的路径。

    在多模块相互跳转的场景下,只需要取最后退出的模块下生成的覆盖率数据json文件,但特殊场景下如多模块无跳转关系,则需要取每个独立模块下生成的覆盖率数据json文件。

  2. 生成覆盖率报告:
    hvigorw collectCoverage -p projectPath={projectPath} -p reportPath={reportPath} -p coverageFile={projectPath}/{moduleName}/.test/default/intermediates/ohosTest/init_coverage.json#{LocalPath/bjc_cov_yyyyMMdd_HHmmss_SSS.json} -p patch={patchPath}
    • projectPath:工程路径。
    • reportPath:指定的覆盖率报告文件生成路径。
    • bjc_cov_yyyyMMdd_HHmmss_SSS.json:指定上一个步骤LocalPath目录下的一份最新的json文件,格式以bjc_cov开头,yyyyMMdd_HHmmss_SSS表示年月日_时分秒_毫秒。
    • patchPath:可选参数,指定代码补丁文件路径,用于统计增量代码覆盖率。仅支持绝对路径,后缀必须为.patch或.diff,可以通过git diff等命令生成。从26.0.0版本开始支持。

    在多模块相互跳转的场景下,需要取各模块的init_coverage.json文件路径,与bjc_cov_yyyyMMdd_HHmmss_SSS.json文件通过#拼接生成coverageFile参数。

  3. 在本地找到报告文件路径并在浏览器中打开,查看代码覆盖率详情,关于覆盖率的计算方式请参考查看覆盖率报告。

查看覆盖率报告

执行覆盖率测试后,会生成两份报告,一份是html格式,用于可视化查看报告,一份是json格式,即coverageReport.json文件,记录了详细的覆盖率数据,文件中各字段的含义请参考覆盖率coverageReport.json文件。

[h2]覆盖率报告解读

测试覆盖率报告有三个测量维度,分别是:

以下是关于三个测量维度的细节说明:

[h2]覆盖率coverageReport.json文件

覆盖率coverageReport.json文件记录了详细的覆盖率数据,文件中各字段的含义如下。

在阅读本文前,请先查看覆盖率报告解读,了解行覆盖率、分支覆盖率和函数覆盖率的相关概念和统计方式。

  1. summary字段记录了本次测试的覆盖率,包括行覆盖率、函数覆盖率和分支覆盖率,示例如下。
    {
      "summary": {
        "lines": {         // 行数总览
          "total": 43,     // 可执行行代码行数
          "covered": 12,   // 覆盖数量
          "pct": 27.91     // 行覆盖率
        },
        "functions": {     // 函数总览
          "total": 17,     // 函数数量
          "covered": 4,    // 覆盖数量
          "pct": 23.53     // 函数覆盖率
        },
        "branches": {      // 分支总览
          "total": 2,      // 分支数量
          "covered": 0,    // 覆盖数量
          "pct": 0         // 分支覆盖率 
        }
      },
    }
  2. files是个数组,记录了所有文件的详细覆盖率数据,数组中的每个元素对应一个文件。
    以一个文件为例,各字段含义如下。
    {
      "files": [
        {
          "version": "bjc v1.0.0",   // 覆盖率算法版本
          "versionCode": 10000,      // 覆盖率算法版本代码
          "path": "D:/DevEcoStudioProjects/MyApplication36/application/src/main/ets/applicationability/ApplicationAbility.ets",  // 文件路径
          "hash": "6828362e96a78934b93db4b980fa5ad83af85a111bf187e74da89ae0c0ec613a",  // 文件内容hash值
          "lineCnt": 44,     // 当前文件总行数
          "count": 0,        // 执行次数
          "projectPath": "D:/DevEcoStudioProjects/MyApplication36",     // 工程路径
          "functions": [],   // 函数集合
          "exeLine": {},     // 可执行代码行
          "summary": {}      // 单个文件的覆盖率详情
        },
      ]
    }