You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Android项目Fastlane集成代码覆盖率方案(Jacoco/Xcov不兼容)

Android + Fastlane 代码覆盖率获取方案推荐

方案1:直接通过Fastlane调用Jacoco Gradle任务并解析报告

Jacoco本身是Android项目常用的覆盖率工具,Fastlane虽然没有专门的Jacoco插件,但可以直接调用Gradle任务生成报告,再通过脚本解析报告提取覆盖率百分比:

  1. 确保你的Android项目已配置Jacoco(在build.gradle中启用Jacoco插件,并定义jacocoTestReport任务)
  2. 在Fastfile中添加如下lane:
lane :get_coverage do
  # 先执行单元测试(根据你的build变体调整任务名)
  gradle(task: "testDebugUnitTest")
  # 生成Jacoco覆盖率报告
  gradle(task: "jacocoTestDebugReport")
  
  # 解析Jacoco的XML报告获取覆盖率(以指令覆盖率为例)
  require 'rexml/document'
  xml_report_path = "./app/build/reports/jacoco/jacocoTestDebugReport/jacocoTestDebugReport.xml"
  
  doc = REXML::Document.new(File.read(xml_report_path))
  counter = doc.root.elements['counter[@type="INSTRUCTION"]']
  covered = counter.attributes['covered'].to_f
  total = counter.attributes['total'].to_f
  coverage_percent = (covered / total) * 100
  
  puts "当前代码覆盖率:#{sprintf('%.2f', coverage_percent)}%"
end

方案2:使用社区Fastlane Jacoco插件

有社区维护的Fastlane插件可以简化Jacoco报告的解析工作,步骤如下:

  1. 在项目根目录执行命令安装插件:
fastlane add_plugin jacoco
  1. 在Fastfile中使用插件:
lane :coverage do
  # 执行测试并生成报告
  gradle(task: "testDebugUnitTest")
  gradle(task: "jacocoTestDebugReport")
  
  # 调用插件解析并输出覆盖率
  jacoco(
    project_name: "app",
    build_type: "debug",
    coverage_types: ["INSTRUCTION"] # 指定要统计的覆盖率类型
  )
end

该插件会自动解析Jacoco报告,并在控制台输出对应的覆盖率数值。

方案3:自定义Fastlane Action

如果需要更灵活的逻辑,可以自定义Fastlane Action来处理覆盖率解析:

  1. 在项目的fastlane/actions目录下创建parse_jacoco_coverage.rb文件,内容示例:
module Fastlane
  module Actions
    class ParseJacocoCoverageAction < Action
      def self.run(params)
        require 'rexml/document'
        doc = REXML::Document.new(File.read(params[:report_path]))
        counter = doc.root.elements['counter[@type="INSTRUCTION"]']
        covered = counter.attributes['covered'].to_f
        total = counter.attributes['total'].to_f
        coverage = (covered / total) * 100
        UI.message("代码覆盖率:#{sprintf('%.2f', coverage)}%")
        return coverage
      end

      def self.description
        "解析Jacoco覆盖率报告并返回百分比"
      end

      def self.available_options
        [
          FastlaneCore::ConfigItem.new(key: :report_path,
                                       description: "Jacoco XML报告的路径",
                                       type: String)
        ]
      end
    end
  end
end

Fastlane::Actions.register_action(Fastlane::Actions::ParseJacocoCoverageAction)
  1. 在Fastfile中调用自定义Action:
lane :get_coverage do
  gradle(task: "testDebugUnitTest")
  gradle(task: "jacocoTestDebugReport")
  coverage = parse_jacoco_coverage(report_path: "./app/build/reports/jacoco/jacocoTestDebugReport/jacocoTestDebugReport.xml")
  # 可以将覆盖率值用于后续操作,比如上传到统计平台
end

注意事项

  • 请根据你的项目build变体(debug/release)调整Gradle任务名称,比如testReleaseUnitTest、jacocoTestReleaseReport
  • Jacoco支持多种覆盖率统计类型(INSTRUCTION、LINE、METHOD等),可根据需求修改解析逻辑

内容的提问来源于stack exchange,提问作者Tushar Patil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 02:17:31