• 覆盖率统计
    • Web
    • Android
    • iOS
    • 命令行工具

    覆盖率统计

    Macaca 提供多端覆盖率统计方案,支持 Web, Android, iOS 以相一致的方案在测试执行过程中收集行覆盖率,并生成覆盖率报告。

    覆盖率是测试有效性的重要度量。

    Web

    通过在前端项目中集成 macaca-coverage 模块并扩展 webdriver API 方法实现覆盖率收集。

    扩展示例:

    1. wd.addPromiseChainMethod('coverage', function (context) {
    2. const coverageHtml = path.join(cwd, 'coverage', 'index.html');
    3. return this
    4. .execute('return window.__coverage__')
    5. .then(__coverage__ => {
    6. if (!__coverage__) {
    7. return this
    8. .execute('return location.href')
    9. .then(url => {
    10. console.log(`>> coverage failed: ${url}`);
    11. });
    12. }
    13. const reporter = new Reporter();
    14. collector.add(__coverage__);
    15. reporter.addAll([
    16. 'html',
    17. 'lcov'
    18. ]);
    19. return new Promise(resolve => {
    20. reporter.write(collector, true, () => {
    21. console.log(`>> coverage: ${coverageHtml}`);
    22. resolve('ok');
    23. });
    24. });
    25. })
    26. .catch(e => {
    27. console.log(e);
    28. });
    29. });

    推荐在每个用例执行后收集:

    1. afterEach(function () {
    2. return driver
    3. .coverage() // 收集覆盖率
    4. .saveScreenshots(this);
    5. });

    覆盖率统计 - 图1

    覆盖率统计 - 图2

    通过 Macaca Coverage 实现 React, Vue, Angular, 常规前端工程的覆盖率请看更多示例项目。

    注意:JavaScript 语言的覆盖率是使用流行的 istanbul 包完成的,在执行前需要进行插桩。


    Android

    Android 端以 Android Studio 2.x 为例,最常规的做法是在 gradle 脚本中引入 jacoco 插件开启覆盖率开关。

    1. apply plugin: 'jacoco'
    2. jacoco {
    3. toolVersion = '0.7.9'
    4. }
    5. android {
    6. buildTypes {
    7. debug {
    8. testCoverageEnabled true
    9. }
    10. }
    11. }

    随后通过反射的方式调用 jacoco 提供的收集方法生成 .exec 文件。

    1. public static void collect2ExecFile(boolean isNew) {
    2. String coverageFileDir = Environment.getExternalStorageDirectory()
    3. .getPath() + "/coverage.exec";
    4. File mCoverageFilePath = new File(coverageFileDir);
    5. OutputStream out = null;
    6. try {
    7. if (isNew && mCoverageFilePath.exists()) {
    8. mCoverageFilePath.delete();
    9. }
    10. if (!mCoverageFilePath.exists()) {
    11. mCoverageFilePath.createNewFile();
    12. }
    13. out = new FileOutputStream(mCoverageFilePath.getPath(), true);
    14. Object agent = Class.forName("org.jacoco.agent.rt.RT")
    15. .getMethod("getAgent")
    16. .invoke(null);
    17. out.write((byte[]) agent.getClass().getMethod("getExecutionData", boolean.class)
    18. .invoke(agent, false));
    19. } catch (Exception e) {
    20. Log.i("Jacoco", e.getMessage());
    21. } finally {
    22. if (out == null)
    23. return;
    24. try {
    25. out.close();
    26. } catch (IOException e) {
    27. e.printStackTrace();
    28. }
    29. }
    30. }

    获取 coverage.exec 文件

    1. $ adb pull /storage/emulated/0/coverage.exec .

    然后使用 Macaca 提供的覆盖率工具生成报告:

    1. $ macaca coverage -r java -f ./coverage.exec -c ./android_app_bootstrap/build/intermediates/classes/debug -s ./android_app_bootstrap/src/main/java --html ./reporter

    覆盖率统计 - 图3

    覆盖率统计 - 图4

    注意:Java 语言的覆盖率是使用流行的 jacoco 包完成的,请参考示例项目。


    iOS

    iOS 目前的实现需要开启 Xcode IDE 的覆盖率收集开关。然后引入 Macaca 提供的 iOS 端驱动包 xctestwd 进行测试。

    覆盖率统计 - 图5

    注意:下一版本会提供侵入式集成包,直接与应用集成而不依赖 Xcode启动,当前版本还不支持。

    在测试执行完成后使用 Macaca 提供的覆盖率工具生成报告:

    1. $ macaca coverage -r ios -n ios-app-bootstrap -p ./ios-app-bootstrap.xcodeproj --html ./reporter

    覆盖率统计 - 图6

    覆盖率统计 - 图7

    注意:iOS 平台的覆盖率请参考示例项目。


    命令行工具

    Macaca 覆盖率工具集成在 macaca-cli 中,请按照 快速上手中提供的方式安装即可。

    1. $ macaca coverage -h
    1. Options:
    2. -r, --runtime <s> set the type of runtime(web, java, ios)
    3. -f, --file <s> coverage file to read(java<*.exec>, web)
    4. -s, --source <s> location of the source files(java only)
    5. -c, --classfiles <s> location of Java class files(java only)
    6. -p, --project <s> location of Xcode project(ios only)
    7. -n, --name <s> name of Xcode project's scheme(ios only)
    8. --html <s> generate HTML report
    9. --json <s> generate JSON report
    10. --xml <s> generate XML report(java, ios)
    11. --verbose show more debugging information
    12. -h, --help output usage information

    目前支持几种常用格式(html, xml, json) 的报告器。

    注意

    • 需要指定运行时类型 —runtime-r
    • Java 语言项目需要传入编译好的 classfiles 地址,如需源码映射需要传入源码地址
    • iOS 项目需要工程地址 —project-p 和具体的 scheme 名称。

    原文: https://macacajs.github.io/zh/coverage