声纳:在集成测试处于不同项目时测量代码覆盖率

时间:2013-08-07 21:44:23

标签: maven integration-testing code-coverage sonarqube test-coverage

拥有以下Maven项目结构:

-project1          <-- parent pom with two children.
|--module1         <-- web services
\--module1-itest   <-- integration tests written with TestNG

我们今天所做的事情:

  • 在module1中运行 mvn sonar:sonar ,它显示来自的代码覆盖率 该单元在Sonar的仪表板中进行测试。
  • 在module1上运行 mvn jetty:run ,然后立即在module1-itests上运行 mvn test 进行测试。

我知道这远非理想情况......当我们尝试改进遗留项目而几乎没有任何测试时,它更像是一个中间步骤......


我的问题是:通过在模块1的Sonar仪表板中执行集成测试来完成代码覆盖的最佳方法是什么?

最初,我倾向于将module1-itest中的代码移动到module1,并使用Failsafe插件和与JaCoCo进行充分记录的集成来运行它们。通过这种方式,Module1将混合使用JUnit单元测试和TestNG集成测试,每个组分别由Surefire和Failsafe运行,在预集成阶段启动Jetty服务器。

但是,我们有理由将两个项目分开,所以我想知道:

  1. 上述方法是否合适?
  2. 我们可以使用其他任何推荐的方式来保持两个项目的分离,但包括 module1-itest module1 声纳仪表板中完成的代码覆盖率?
  3. 谢谢,

1 个答案:

答案 0 :(得分:2)

这就是我们解决它的方式:

<强>摘要

  • 服务和服务迭代项目是两个独立的模块。
  • 服务具有单元测试,Sonar报告了覆盖范围。
  • Service-itests使用Cargo加载服务WAR并运行集成测试。此执行中收集的代码覆盖率将在上一级报告。通过这种方式,ITests的覆盖范围被收集并跨模块合并并在父项目pom级别报告。我们也喜欢这种方法,因为它允许我们拥有不同的ITests项目(例如,一个使用Cargo加载应用程序,另一个使用JBehave),并且它们可以独立发展。

在父pom中:

    <modules>
            <module>service</module>
            <module></module>
            <module>service-itest</module>
        </modules>
    <!-- Sonar -->
            <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
            <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
            <!-- The destination file for the code coverage report has to be set to 
                the same value in the parent pom and in each module pom. Then JaCoCo will 
                add up information in the same report, so that, it will give the cross-module 
                code coverage. -->
            <sonar.jacoco.itReportPath>${project.basedir}/../target/jacoco-itests.exec</sonar.jacoco.itReportPath>
...
<build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <version>0.6.3.201306030806</version>
                </plugin>
            </plugins>
        </pluginManagement>
...
<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <configuration>
                    <includes>
                        <include>our.project.packages.*</include>
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <id>pre-test</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>post-test</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

在-itest项目的pom.xml文件中:

<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <configuration>
                    <!-- The destination file for the code coverage report has to be set 
                        to the same value in the parent pom and in each module pom. Then JaCoCo will 
                        add up information in the same report, so that, it will give the cross-module 
                        code coverage. -->
                    <destFile>${project.basedir}/../target/jacoco-itests.exec</destFile>
                    <includes>
                        <include>our.packages.*</include>
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <id>post-test</id>
                        <configuration>
                            <skip>true</skip>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven2-plugin</artifactId>
                <version>1.2.2</version>
                <configuration>
                    <skip>${cargo.skip}</skip>
                    <container>
                        <containerId>jetty7x</containerId>
                        <artifactInstaller>
                            <groupId>org.eclipse.jetty</groupId>
                            <artifactId>jetty-distribution</artifactId>
                            <version>7.6.12.v20130726</version>
                            <type>zip</type>
                        </artifactInstaller>
                    </container>
                    <configuration>
                        <type>standalone</type>
                        <properties>
                            <cargo.servlet.port>${jetty.port}</cargo.servlet.port>
                            <cargo.jvmargs>${argLine}</cargo.jvmargs>
                        </properties>
                        <deployables>
                            <deployable>
                                <artifactId>pam_filetask_manager_service</artifactId>
                                <groupId>${project.groupId}</groupId>
                                <type>war</type>
                                <pingURL>http://server:22000/ping</pingURL>
                                <properties>
                                </properties>
                            </deployable>
                        </deployables>
                    </configuration>
                </configuration>
                <executions>
                    <execution>
                        <id>start-server</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>install</goal>
                            <goal>start</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>stop-server</id>
                        <phase>post-integration-test</phase>
                        <goals>
                            <goal>stop</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>