SONAR - 使用 Cobertura 测量代码覆盖率

Posted

技术标签:

【中文标题】SONAR - 使用 Cobertura 测量代码覆盖率【英文标题】:SONAR - Measure Code Coverage using Cobertura 【发布时间】:2011-12-06 13:11:42 【问题描述】:

我正在使用声纳来测量代码质量。我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤。

我按照http://cobertura.sourceforge.net/anttaskreference.html 的步骤进行操作,并且能够生成 xml 文件。如何将这些 xml 文件导入 SONAR?

有没有更简单的方法在 SONAR 中使用 Cobertura?

我在与我的 SONAR 服务器不同的服务器上运行代码覆盖 (Cobertura)。两台服务器都在 LINUX 下运行。

感谢您的帮助!

【问题讨论】:

关于此主题的更新:示例可以在我们的声纳示例存储库中找到 => github.com/SonarSource/sonar-examples/tree/master/projects/… 【参考方案1】:

您将 Sonar 任务配置为上传由构建逻辑的其他部分生成的单元测试和 cobertura 报告。

这与具有 Sonar 能够利用的标准构建生命周期的 Maven 形成对比。

单元测试和代码覆盖率

以下逻辑使用 cobertura 检测类运行单元测试。最后由 cobertura 生成 XML 覆盖率报告:

<target name="instrument-classes" depends="compile-tests">
    <taskdef resource="tasks.properties" classpathref="test.path"/>
    <cobertura-instrument todir="$instrumented.classes.dir" datafile="$build.dir/cobertura.ser">
        <fileset dir="$classes.dir"/>
    </cobertura-instrument>
</target>

<target name="junit" depends="instrument-classes">
    <junit printsummary="yes" haltonfailure="yes">
        <classpath>
            <path refid="test.path"/>
            <pathelement path="$instrumented.classes.dir"/>
            <pathelement path="$test.classes.dir"/>
        </classpath>

        <formatter type="xml"/>

        <batchtest fork="yes" todir="$test.reports.dir">
            <fileset dir="$test.src.dir">
                <include name="**/*Test*.java"/>
                <exclude name="**/AllTests.java"/>
            </fileset>
        </batchtest>
    </junit>
</target>

<target name="test" depends="junit">
    <cobertura-report format="xml" datafile="$build.dir/cobertura.ser" destdir="$cobertura.reports.dir"/> 
</target>

调用声纳

我通常使用一个非常简单的声纳目标:

<target name="sonar" depends="test">
    <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml" classpathref="sonar.path"/>

    <sonar:sonar key="$sonar.project.key" version="$sonar.project.version" xmlns:sonar="antlib:org.sonar.ant"/>
</target>

并使用属性文件来控制 Sonar 行为的各个方面:

sonar.project.key=org.demo:demo
sonar.project.version=1.0-SNAPSHOT
sonar.projectName=Demo project

sonar.host.url=http://myserver:9000
sonar.jdbc.url=jdbc:mysql://myserver:3306/sonar?useUnicode=true&characterEncoding=utf8
sonar.jdbc.driverClassName=com.mysql.jdbc.Driver
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar

sonar.sources=$src.dir
sonar.tests=$test.src.dir
sonar.binaries=$classes.dir

sonar.dynamicAnalysis=reuseReports
sonar.surefire.reportsPath=$test.reports.dir
sonar.java.coveragePlugin=cobertura
sonar.cobertura.reportsPath=$cobertura.reports.dir/coverage.xml

演示如何配置 Sonar 以获取由 junit 创建的单元测试报告和由 cobertura 生成的代码覆盖率报告。

构建不必与 Sonar 在同一台服务器上运行。在这种情况下,必须提供远程 Sonar URL 和 JDBC 凭据。

【讨论】:

我尝试按照您的指示进行操作;但是,我仍然遇到和以前一样的问题,我看不到 SONAR 中的覆盖率统计信息。生成的 xml 和 ser 文件与我之前的类似。您能帮我获取 SONAR 作品中的统计数据吗? Sonar 任务输出是否显示您正在加载正确的覆盖率文件? 您是否配置了“sonar.cobertura.reportsPath”属性来获取正确的文件?任务输出应显示完整的文件路径。如果 Sonar 试图加载一个不存在的文件,这将解释您缺少的代码覆盖率指标 是的,我有。我想我已经开始工作了。之前让我感到困惑的是因为我看到测试覆盖率为 0%,所以我认为我可能没有正确配置它。后来,我意识到如果声纳配置不正确,它只会给我“-”。谢谢你的帮助。顺便说一句,我喜欢你组织声纳配置参数的方式。现在我需要弄清楚为什么它给了我 0% 的覆盖率。 在以后的版本中,'sonar.cobertura.reportsPath' 属性已更改为 'sonar.cobertura.reportPath' > docs.codehaus.org/display/SONAR/Advanced+parameters。【参考方案2】:

您必须将这些属性添加到 Sonar 的 pom.xml

<properties>
    <sonar.dynamicAnalysis>false</sonar.dynamicAnalysis>
    <sonar.phase>generate-sources</sonar.phase>
    <sonar.surefire.reportsPath>target/reports/test/</sonar.surefire.reportsPath>
    <sonar.cobertura.reportPath>../project/target/reports/coverage/coverage.xml</sonar.cobertura.reportPath>
</properties>

(使用适合您环境的路径)

然后运行:

mvn sonar:sonar

查看user list了解更多详情。

【讨论】:

如果我的项目不使用 Maven 怎么办?我还需要运行它吗?从 Cobertura 网站,看起来我们也可以使用 ANT。我错了吗?现在,我对声纳 - Maven - Cobertura 之间的关系感到困惑。假设我通过调用将运行我的构建脚本的 ant 从 hudson 调用构建。我的构建脚本将进行构建并更新 SONAR DB。此外,最初,我认为我只需要在我的构建脚本中添加一些将运行 Coberture 的命令。现在我不确定。在我的情况下,我应该如何使用 maven 调用 Coberture?也欢迎其他解决方案?感谢您的帮助。 Sonar 直到最近才与 Maven 耦合。从 2.6(2011 年 3 月)开始,Sonar 也支持 ANT。您可以将上述属性添加到 ant 脚本中,如 here 所示,例如:&lt;property key="sonar.dynamicAnalysis" value="false" /&gt;。我没有运行 Sonar + Cobertura + Ant runner,但应该没有什么不同。或者,您可以查看 Sonar Stand Alone(无 ANT、Maven 等)runner【参考方案3】:

如果您使用的是 Maven,那么您无需在 POM 文件中指定任何特殊内容。只需运行“mvn clean sonar:sonar”,Sonar 将自动编译您的代码,使用 Cobertura(Sonar 中的默认覆盖引擎)运行您的测试并将所有结果推送到数据库中。

如果您使用 Ant [1] 或简单的 java runner [2] 而不是 Maven,则相同。

我确实坚持这样一个事实,即您不必在运行 Sonar 之前手动运行 Cobertura(例如使用 Ant 任务)。

[1]http://docs.codehaus.org/display/SONAR/Analyzing+with+Sonar+Ant+Task

[2]http://docs.codehaus.org/display/SONAR/Analyse+with+a+simple+Java+Runner

面料, 声纳源

【讨论】:

以上是关于SONAR - 使用 Cobertura 测量代码覆盖率的主要内容,如果未能解决你的问题,请参考以下文章

cobertura代码测试覆盖率使用案例

Jenkins 2 - Sonar 6.3 - JaCoCo 报告未找到

使用 Cobertura 从代码覆盖中排除方法

如何使用来自 Hudson 的 Maven 生成 Cobertura 代码覆盖率报告

从 Grails 中的 Cobertura 报告中排除插件

我可以在 PowerMock 的单元测试中使用 Cobertura 吗?