代码覆盖率
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
配置代码覆盖率以跟踪和可视化您的源代码有多少被测试覆盖。您可以:
- 使用
coverage关键字跟踪整体覆盖率指标和趋势。 - 使用
artifacts:reports:coverage_report关键字可视化逐行覆盖率。
配置覆盖率报告
使用 coverage 关键字监控您的测试覆盖率并在合并请求中强制执行覆盖率要求。
通过覆盖率报告,您可以:
- 在合并请求中显示整体覆盖率百分比。
- 聚合来自多个测试作业的覆盖率。
- 添加覆盖率检查批准规则。
- 随时间跟踪覆盖率趋势。
要配置覆盖率报告:
-
将
coverage关键字添加到您的流水线配置中:test-unit: script: - coverage run unit/ coverage: '/TOTAL.+ ([0-9]{1,3}%)/' test-integration: script: - coverage run integration/ coverage: '/TOTAL.+ ([0-9]{1,3}%)/' -
配置正则表达式(regex)以匹配您的测试输出格式。 有关常见模式,请参见 覆盖率正则表达式模式。
-
要聚合来自多个作业的覆盖率,请将
coverage关键字添加到您想要包含的每个作业中。 -
可选。添加覆盖率检查批准规则。
覆盖率正则表达式模式
以下示例正则表达式模式旨在解析常见测试覆盖率工具的覆盖率输出。
请仔细测试正则表达式模式。工具输出格式可能会随时间变化,这些模式可能不再按预期工作。
| 工具 | 语言 | 命令 | 正则表达式模式 |
|---|---|---|---|
| pytest-cov | Python | pytest --cov |
/TOTAL.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/ |
| Simplecov | Ruby | rspec spec |
/(?:LOC\s\(\d+\.\d+%|Line Coverage:\s\d+\.\d+%)/ |
| 工具 | 语言 | 命令 | 正则表达式模式 |
|---|---|---|---|
| gcovr | C/C++ | gcovr |
/^TOTAL.*\s+(\d+\%)$/ |
| tarpaulin | Rust | cargo tarpaulin |
/^\d+.\d+% coverage/ |
| 工具 | 语言 | 命令 | 正则表达式模式 |
|---|---|---|---|
| JaCoCo | Java/Kotlin | ./gradlew test jacocoTestReport |
/Total.*?([0-9]{1,3})%/ |
| Scoverage | Scala | sbt coverage test coverageReport |
/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/ |
| 工具 | 命令 | 正则表达式模式 |
|---|---|---|
| tap | tap --coverage-report=text-summary |
/^Statements\s*:\s*([^%]+)/ |
| nyc | nyc npm test |
/All files[^|]*|[^|]*\s+([\d\.]+)/ |
| jest | jest --ci --coverage |
/All files[^|]*|[^|]*\s+([\d\.]+)/ |
| 工具 | 命令 | 正则表达式模式 |
|---|---|---|
| pest | pest --coverage --colors=never |
/Statement coverage[A-Za-z\.*]\s*:\s*([^%]+)/ |
| phpunit | phpunit --coverage-text --colors=never |
/^\s*Lines:\s*\d+.\d+\%/ |
| 工具 | 命令 | 正则表达式模式 |
|---|---|---|
| go test (single) | go test -cover |
/coverage: \d+.\d+% of statements/ |
| go test (project) | go test -coverprofile=cover.profile && go tool cover -func cover.profile |
/total:\s+\(statements\)\s+\d+.\d+%/ |
| 工具 | 语言 | 命令 | 正则表达式模式 |
|---|---|---|---|
| OpenCover | .NET | None | /(Visited Points).*\((.*)\)/ |
| dotnet test (MSBuild) | .NET | dotnet test |
/Total\s*|*\s(\d+(?:\.\d+)?)/ |
| Pester | PowerShell | None | `/Covered (\d{1,3}(. |
| 工具 | 命令 | 正则表达式模式 |
|---|---|---|
| excoveralls | None | /\[TOTAL\]\s+(\d+\.\d+)%/ |
| mix | mix test --cover |
/\d+.\d+\%\s+|\s+Total/ |
覆盖率可视化
使用 artifacts:reports:coverage_report
关键字来查看合并请求中测试覆盖的具体代码行。
您可以生成以下格式的覆盖率报告:
- Cobertura:适用于多种语言,包括 Java、JavaScript、Python 和 Ruby。
- JaCoCo:仅适用于 Java 项目。
覆盖率可视化使用 artifacts reports 来:
- 收集一个或多个覆盖率报告,包括来自通配符路径的报告。
- 合并所有报告中的覆盖率信息。
- 在合并请求差异中显示合并结果。
覆盖率文件在后台作业中解析,因此在流水线完成和可视化出现在合并请求之间可能会有延迟。
默认情况下,覆盖率可视化数据在创建一周后过期。
配置覆盖率可视化
要配置覆盖率可视化:
-
配置您的测试工具以生成覆盖率报告。
-
将
artifacts:reports:coverage_report配置添加到您的流水线中:test: script: - run tests with coverage artifacts: reports: coverage_report: coverage_format: cobertura # or jacoco path: coverage/coverage.xml
有关特定语言的配置详情,请参见:
子流水线的覆盖率报告
来自子流水线的覆盖率报告会出现在合并请求差异注释中,但不会出现在合并请求小部件中。 这是因为父流水线无法访问子流水线生成的覆盖率报告产物。
在合并请求小部件中显示子流水线覆盖率报告的支持已在 epic 8205 中提出。
添加覆盖率检查批准规则
- Tier: Premium, Ultimate
您可以要求特定用户或组批准降低项目测试覆盖率的合并请求。
先决条件:
要添加 Coverage-Check 批准规则:
- 转到您的项目并选择 设置 > 合并请求。
- 在 合并请求批准 下,执行以下操作之一:
- 在
Coverage-Check批准规则旁边,选择 启用。 - 对于手动设置,选择 添加批准规则,然后输入
Coverage-Check作为 规则名称。
- 在
- 选择一个 目标分支。
- 设置 所需批准数量。
- 选择提供批准的 用户 或 组。
- 选择 保存更改。
当合并基础流水线不包含覆盖率数据时,Coverage-Check 批准规则需要批准,即使合并请求提高了整体覆盖率。
查看覆盖率结果
流水线成功运行后,您可以在以下位置查看代码覆盖率结果:
查看覆盖率历史记录
您可以随时间跟踪项目或组的代码覆盖率演变。
对于项目
要查看项目的代码覆盖率历史记录:
- 在左侧边栏中,选择 搜索或转到 并找到您的项目。
- 选择 分析 > 仓库分析。
- 从下拉列表中,选择您要查看其历史数据的作业。
- 可选。要查看数据的 CSV 文件,请选择 下载原始数据 (.csv)。
对于组
- Tier: Premium, Ultimate
要查看组中所有项目的代码覆盖率历史记录:
- 在左侧边栏中,选择 搜索或转到 并找到您的组。
- 选择 分析 > 仓库分析。
- 可选。要查看数据的 CSV 文件,请选择 下载历史测试覆盖率数据 (.csv)。
显示覆盖率徽章
使用流水线徽章分享您项目的代码覆盖率状态。
要将覆盖率徽章添加到您的项目,请参见 测试覆盖率报告徽章。
故障排除
从代码覆盖率中移除颜色代码
一些测试覆盖率工具输出的 ANSI 颜色代码无法被正则表达式正确解析。这会导致覆盖率解析失败。
一些覆盖率工具不提供禁用输出中颜色代码的选项。如果是这样,请将覆盖率工具的输出通过一个单行脚本管道处理,该脚本会去除颜色代码。
例如:
lein cloverage | perl -pe 's/\e\[?.*?[\@-~]//g'