带有Surefire + Jacoco报告的Maven货物插件

时间:2018-03-26 20:30:08

标签: jacoco maven-surefire-plugin maven-failsafe-plugin jacoco-maven-plugin

我有一个项目使用货物插件激活tomcat,然后对该tomcat实例运行集成测试。我的目标是获得在tomcat中运行的代码的集成测试覆盖率报告(不是我的集成测试的覆盖范围)。

问题是,如何获得在tomcat(单独的JVM)中运行的代码的代码覆盖率结果?

我已经能够获得集成测试本身和测试模块中的java类的覆盖报告,但是这些报告相当没用。

在jacoco-sessions.html文件中,我只能看到测试模块的类路径中可用的类。在tomcat服务器中运行的类不存在。

2 个答案:

答案 0 :(得分:0)

根据jacoco-maven-plugin http://www.jacoco.org/jacoco/trunk/doc/prepare-agent-mojo.html的文档:

  

准备一个指向JaCoCo运行时代理的属性,该属性可以作为VM参数传递给被测试的应用程序。默认情况下,根据项目打包类型设置具有以下名称的属性:

     
      
  • tycho.testArgLine用于包装类型eclipse-test-plugin和
  •   
  • argLine否则。
  •   

argLine属性会影响使用测试启动JVM的maven-surefire-pluginmaven-failsafe-plugin - 请分别参阅http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#argLinehttp://maven.apache.org/surefire/maven-failsafe-plugin/integration-test-mojo.html#argLine,但此属性对{{{{}}不起作用1}}用Tomcat启动JVM。

根据https://stackoverflow.com/a/38435778/244993https://codehaus-cargo.github.io/cargo/Tomcat+9.x.html,您需要将cargo-maven2-plugin设置的属性传递给jacoco-maven-plugin cargo-maven2-plugin

答案 1 :(得分:0)

除了the answer of Godin外,您还必须确保测试类的coverage数据本身不使用与在货柜中运行的代码的coverage数据相同的输出文件。我认为就我而言,测试范围覆盖了被测代码范围。

请注意,我正在使用jacoco.exec作为集成测试下代码的覆盖率数据。通常,这用于单元测试,但是我的模块中没有单元测试。这样,我不需要为额外的文件名配置SonarQube,但是如果您愿意,可以在此处使用另一个文件名。

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>prepare-agent-integration-cargo</id>
            <goals>
                <goal>prepare-agent-integration</goal>
            </goals>
            <configuration>
                <destFile>${project.build.directory}/jacoco.exec</destFile>
                <propertyName>argLineCargo</propertyName>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <groupId>org.codehaus.cargo</groupId>
    <artifactId>cargo-maven2-plugin</artifactId>
    <configuration>
        <container>
            <!-- ... -->
        </container>
        <configuration>
            <properties>
                <cargo.start.jvmargs>${argLineCargo}</cargo.start.jvmargs>
                <!-- ... -->
            </properties>
        </configuration>
        <!-- ... -->
    </configuration>
    <!-- ... -->
</plugin>

以及父POM中的JaCoCo配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <configuration>
                <includes>
                    <include>my/project/package/**/*</include>
                </includes>
            </configuration>
            <executions>
                <execution>
                    <id>prepare-agent</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>prepare-agent-integration</id>
                    <goals>
                        <goal>prepare-agent-integration</goal>
                    </goals>
                </execution>
                <execution>
                    <id>reports</id>
                    <goals>
                        <goal>report</goal>
                        <goal>report-integration</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <argLine>@{argLine}</argLine>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <argLine>@{argLine}</argLine>
            </configuration>
        </plugin>
    </plugins>
</build>