有没有办法只在新代码上获得单元覆盖率(例如来自 jacoco)?
Is there a way to get unit coverage percentage (eg from jacoco) on only new code?
我假设的情况是这样的:
- 我有 运行 我的 junit 测试并生成了一个 jacoco 文件
- 我的 git diff 显示我已经更改了 10 行代码
现在我的 git diff 和 jacoco 信息的交集是 10 行更改的代码中的 7 行被覆盖了。即 - 我对新代码的覆盖率为 70%。
但我必须手动解决这个问题。
我想要一种自动计算覆盖了多少新代码行的百分比的方法。
我的问题是:有没有办法只在新代码上获得单元覆盖百分比(例如来自 jacoco)?
(注意我知道 sonarqube 可以做到这一点,如果你 运行 使用 analysis.mode=publish
扫描器并使用 JSON API 询问任务结果- 我正在寻找开发人员可以在本地 运行 的轻量级内容。)
读一读:
https://juliangamble.com/blog/2017/09/01/commit-level-coverage-reporting/
然后使用这个项目:
https://github.com/juliangamble/commit-level-coverage-report
Jacoco + diff-cover
它适合我。 CI Shell 脚本:
export PATH="${jobPath}"/buildbox/Python-3.8.2/bin:$PATH
python --version
python -m pip install -i http://xx.xx.xx.com/artifactory/api/pypi/xx-pypi-public/simple/ --trusted-host xx.xx.xx.com diff_cover==4.0.1
mvn clean test -Dmaven.test.failure.ignore=true
diff-cover "${WORKSPACE}"/xxx-test/target/site/jacoco/jacoco.xml --compare-branch origin/"${target_branch}" --src-roots $(find . -name java -type d | grep 'src/main/java$' | egrep -v "target|test|testkit") --html-report ${WORKSPACE}/xxx-test/target/site/jacoco/index.html
有两个插件:
两者都建立在 JaCoCo 之上,并且能够生成类似 JaCoCo 的报告。
此外,如果您的覆盖率低于预期(该比率由插件配置),他们可能会导致构建失败
另一个没有附加插件的选项是用正则表达式解析 html。
build.gradle jacoco 部分:
jacocoTestReport {
dependsOn test
reports {
xml.required = true
csv.required = false
// This method requires html report to be generated
html.required = true
}
}
然后就可以使用sed解析报告了:
sed -nE 's/^.*<td>Total<([^>]+>){4}([^<]*).*$/Missed instructions: /p' build/reports/jacoco/test/html/index.html
这将打印此列中的百分比:
仅第二列:
sed -nE 's/^.*<td>Total<([^>]+>){8}([^<]*).*$/Missed branches: /p' build/reports/jacoco/test/html/index.html
对于两者:
sed -nE 's/^.*<td>Total<([^>]+>){4}([^<]*)([^>]+>){4}([^<]*).*$/First: ; Second: /p' build/reports/jacoco/test/html/index.html
我假设的情况是这样的:
- 我有 运行 我的 junit 测试并生成了一个 jacoco 文件
- 我的 git diff 显示我已经更改了 10 行代码
现在我的 git diff 和 jacoco 信息的交集是 10 行更改的代码中的 7 行被覆盖了。即 - 我对新代码的覆盖率为 70%。
但我必须手动解决这个问题。
我想要一种自动计算覆盖了多少新代码行的百分比的方法。
我的问题是:有没有办法只在新代码上获得单元覆盖百分比(例如来自 jacoco)?
(注意我知道 sonarqube 可以做到这一点,如果你 运行 使用 analysis.mode=publish
扫描器并使用 JSON API 询问任务结果- 我正在寻找开发人员可以在本地 运行 的轻量级内容。)
读一读: https://juliangamble.com/blog/2017/09/01/commit-level-coverage-reporting/
然后使用这个项目: https://github.com/juliangamble/commit-level-coverage-report
Jacoco + diff-cover
它适合我。 CI Shell 脚本:
export PATH="${jobPath}"/buildbox/Python-3.8.2/bin:$PATH
python --version
python -m pip install -i http://xx.xx.xx.com/artifactory/api/pypi/xx-pypi-public/simple/ --trusted-host xx.xx.xx.com diff_cover==4.0.1
mvn clean test -Dmaven.test.failure.ignore=true
diff-cover "${WORKSPACE}"/xxx-test/target/site/jacoco/jacoco.xml --compare-branch origin/"${target_branch}" --src-roots $(find . -name java -type d | grep 'src/main/java$' | egrep -v "target|test|testkit") --html-report ${WORKSPACE}/xxx-test/target/site/jacoco/index.html
有两个插件:
两者都建立在 JaCoCo 之上,并且能够生成类似 JaCoCo 的报告。
此外,如果您的覆盖率低于预期(该比率由插件配置),他们可能会导致构建失败
另一个没有附加插件的选项是用正则表达式解析 html。
build.gradle jacoco 部分:
jacocoTestReport {
dependsOn test
reports {
xml.required = true
csv.required = false
// This method requires html report to be generated
html.required = true
}
}
然后就可以使用sed解析报告了:
sed -nE 's/^.*<td>Total<([^>]+>){4}([^<]*).*$/Missed instructions: /p' build/reports/jacoco/test/html/index.html
这将打印此列中的百分比:
仅第二列:
sed -nE 's/^.*<td>Total<([^>]+>){8}([^<]*).*$/Missed branches: /p' build/reports/jacoco/test/html/index.html
对于两者:
sed -nE 's/^.*<td>Total<([^>]+>){4}([^<]*)([^>]+>){4}([^<]*).*$/First: ; Second: /p' build/reports/jacoco/test/html/index.html