有没有办法只在新代码上获得单元覆盖率(例如来自 jacoco)?

Is there a way to get unit coverage percentage (eg from jacoco) on only new code?

我假设的情况是这样的:

现在我的 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