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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7747587/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-05 06:40:13  来源:igfitidea点击:

SONAR - Measure Code Coverage using Cobertura

linuxcontinuous-integrationcode-coveragesonarqube

提问by lwijono

I am using sonar to measure code quality. One thing that I do not know is the steps to measure code coverage using Cobertura.

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

I followed the steps from http://cobertura.sourceforge.net/anttaskreference.htmland was able to generate xml files. How do I get these xml files into SONAR?

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

Is there an easier way to use Cobertura in SONAR?

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

I am running the code coverage (Cobertura) in a different server than my SONAR server. Both servers are running under LINUX.

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

Thanks for the help!

谢谢您的帮助!

采纳答案by Mark O'Connor

You configure the Sonar task to upload unit test and cobertura reports generated by other parts of your build logic.

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

This is in contrast to Maven which has a standard build life-cycle that Sonar is able to leverage.

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

Unit test and code coverage

单元测试和代码覆盖

The following logic runs the unit tests with cobertura instrumented classes. An XML coverage report is generated by cobertura at the end:

以下逻辑使用 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>

Invoking Sonar

调用声纳

I normally use a very simple Sonar 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>

And use a properties file to control all aspects of Sonar's behaviour:

并使用属性文件来控制声纳行为的所有方面:

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

Demonstrates how Sonar can be configured to pick up the unit test reports created by junit and the code coverage report generated by cobertura.

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

The build does not have to run on the same server as Sonar. In that case one must provide the remote Sonar URL and JDBC credentials.

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

回答by tolitius

You would have to add these properties to Sonar's pom.xml:

您必须将这些属性添加到声纳的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>

(with paths appropriate to your environment)

(具有适合您环境的路径)

And run:

并运行:

mvn sonar:sonar

Check the user listfor more details.

检查用户列表以获取更多详细信息。

回答by Fabrice - SonarSource Team

if you're using Maven, then you do not have anything special to specify in your POM file. Just run "mvn clean sonar:sonar" and Sonar will automatically compile your code, run your tests with Cobertura (which is the default coverage engine in Sonar) and push all the results in the DB.

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

Same if you're using Ant [1] or the simple java runner [2] instead of Maven.

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

I do insist on the fact that you do not have to manually run Cobertura (with an Ant task for instance) previously to running Sonar.

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

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

[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

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

Fabrice, SonarSource

法布里斯,声纳源