【发布时间】:2014-05-11 03:15:27
【问题描述】:
当我的单元测试通过 Emma “覆盖”时,我正在尝试让 Sonar IT 代码覆盖范围为我工作。
我的情况:
(1) 我有大量使用 JMockit 的单元测试。删除 JMockit 不是一种选择。我想获得这些测试的单元测试覆盖率报告。
(2) 我有一些集成测试,它们只运行应用程序的核心服务器端部分(它是一个 Spring Web 应用程序),具有不同的输入场景。我想要 IT 代码覆盖率报告。
对于第 (1) 部分,我选择使用 Emma 进行单元测试覆盖,主要是因为 Jacoco 和 JMockit 一起工作时遇到问题,因为它们在运行中检测 java 类时会相互纠缠。这些工具协同工作存在一些问题——没有我认为对单元测试本身可靠且无创的解决方案。所以最后,我选择使用 Emma 作为它的“离线工具”来执行代码覆盖。 Jacoco 也离线,但我无法让 Sonar 在这种模式下获取其结果(也许我忘记了分号 :-))。
对于第 (2) 部分 [IT 代码覆盖率部分] 我只看到了指定以下属性的能力
sonar.jacoco.itReportPath=build/coverage/jacoco.exec
我只能假设,我们需要使用 Jacoco 来检测 IT 测试吗?如果我错了纠正我。所以从技术上讲,我可以在这部分测试中使用 Jacoco,因为我的集成测试不使用 JMockit。
这就是我所做的。我有一个单独的 ant 任务,它重新编译代码库(剥离 Emma 工具),然后重新打包应用程序并针对我的集成测试运行 jacoco:coverage 工具。
问题是.. 我的单元测试是基于 Emma 的.. 那么如何告诉 Sonar 使用 Emma 插件进行 Emma 单元测试和使用 Jacoco 插件进行 IT 测试?这也能做到吗?
这是我设置声纳属性的方法:
sonar.test=test
sonar.sources=src
sonar.binaries=build/compile
# The value of the property must be the key of the language.
sonar.language=java
# Encoding of the source code
sonar.sourceEncoding=UTF-8
sonar.host.url=http://localhost:9000
sonar.dynamicAnalysis=reuseReports
sonar.java.coveragePlugin=emma
sonar.core.codeCoveragePlugin=emma
sonar.jacoco.itReportPath=build/coverage/jacoco.exec
sonar.emma.reportPath=build/coverage
sonar.junit.reportsPath=build/test/report
sonar.surefire.reportsPath=build/test/report
我的 ant 构建运行 Emma 单元测试(以 Emma 形式输出),然后运行 IT 测试并输出到 jacoco.exec 文件。然后我上传到 Sonar。
我得到的是单元测试覆盖率统计数据,而不是 IT 统计数据。我对结果并不感到惊讶。
但是有人知道我在哪里转错了吗?
【问题讨论】:
-
感谢所有建议。最后,我所做的是删除了一些导致问题的崩溃 jmockit 测试,并以不同的方式重新实现它们。笔记。我的一些 jmockit 单元测试可以工作,而另一些则不行。我永远无法推测出 jmockit 给 jacoco 带来问题的模式。
标签: code-coverage sonarqube emma jacoco