Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 客户机/服务器web应用程序的代码覆盖率_Java_Maven_Code Coverage_Sonarqube - Fatal编程技术网

Java 客户机/服务器web应用程序的代码覆盖率

Java 客户机/服务器web应用程序的代码覆盖率,java,maven,code-coverage,sonarqube,Java,Maven,Code Coverage,Sonarqube,我正在编写一个多模块应用程序。其中一些模块只是基本的Java库,然后包含在webapp的WAR中 我希望在以下场景中运行代码覆盖率: 我正在通过Maven启动的嵌入式Jetty运行webapp 我有针对webapp执行HTTP请求的测试 我想在webapp和测试中介绍代码 这可能吗?如何通过科贝图拉、杰科科或艾玛实现?据我所知,在这种情况下,代码覆盖范围将只覆盖客户端代码。我说的对吗?我认为,如果您能够将JaCoCo代理连接到运行jetty的jvm,它应该能够测量在您对Web应用程序运行集成

我正在编写一个多模块应用程序。其中一些模块只是基本的Java库,然后包含在webapp的WAR中

我希望在以下场景中运行代码覆盖率:

  • 我正在通过Maven启动的嵌入式Jetty运行webapp

  • 我有针对webapp执行HTTP请求的测试

  • 我想在webapp和测试中介绍代码


这可能吗?如何通过科贝图拉、杰科科或艾玛实现?据我所知,在这种情况下,代码覆盖范围将只覆盖客户端代码。我说的对吗?

我认为,如果您能够将JaCoCo代理连接到运行jetty的jvm,它应该能够测量在您对Web应用程序运行集成测试期间调用了哪些代码。因此,您应该得到一个统计数据,显示代码覆盖率

<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.5.10.201208310627</version>
                <configuration>
                    <skip>${maven.test.skip}</skip>
                    <output>file</output>
                    <append>true</append>
                </configuration>
                <executions>
                    <execution>
                        <id>jacoco-initialize</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>jacoco-site</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
有一个JacoCoMaven插件——尽管我不确定这是否对您的场景有帮助。只是在单元测试中使用了它

编辑:在这里找到一篇似乎指向正确方向的博客文章

您可以使用Jacoco插件生成代码覆盖率这里是我用于junit测试代码覆盖率的插件配置

<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.5.10.201208310627</version>
                <configuration>
                    <skip>${maven.test.skip}</skip>
                    <output>file</output>
                    <append>true</append>
                </configuration>
                <executions>
                    <execution>
                        <id>jacoco-initialize</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>jacoco-site</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

org.jacoco
jacocomaven插件
0.5.10.201208310627
${maven.test.skip}
文件
真的
jacoco初始化
配制剂
杰科科遗址
验证
报告
注意:在使用eclipse时,maven中可能会出现生命周期未涵盖的错误,一种方法是使用插件管理明确提到生命周期。我从市场上安装了jacoco插件,解决了我的问题

以下是我如何实现的

假设您已经有一个最小的pom.xml配置:

<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</
  <version>0.7.4.201502262128</vers
</plugin>
  • 使用嵌入式jetty服务器运行应用程序,例如
    mvn jetty:Run

  • 运行集成测试

  • 在另一个shell中,通过
    mvn jacoco:dump jacoco:report

  • /target/site/index.html
    (默认情况下)上打开报告


  • 我们有一个类似的场景,集成测试在jetty服务器上运行。此外,我们还需要所有单元测试和集成的组合报告。我们实现的解决方案是运行forkedjetty并将jacocojavaagent细节传递给jvmargs。我们的代码覆盖率报告涵盖了所有RESTAPI和服务层java代码。 jacoco的pom配置

    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>${jacoco-maven-plugin.version}</version>
        <configuration>
            <append>true</append>
        </configuration>
        <executions>
            <execution>
                <id>prepare-test</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
                <configuration>
                    <destFile>${project.build.directory}/jacoco.exec</destFile>
                    <propertyName>surefireArgLine</propertyName>
                </configuration>
            </execution>
            <execution>
                <id>prepare-integration</id>
                <goals>
                    <goal>prepare-agent-integration</goal>
                </goals>
                <configuration>
                    <destFile>${project.build.directory}/jacoco.exec</destFile>
                    <propertyName>failsafeArgLine</propertyName>
                </configuration>
            </execution>
        </executions>
    </plugin>
    
    
    org.jacoco
    jacocomaven插件
    ${jacoco maven plugin.version}
    真的
    准备测试
    配制剂
    ${project.build.directory}/jacoco.exec
    surefireArgLine
    准备集成
    准备代理集成
    ${project.build.directory}/jacoco.exec
    故障保护argline
    
    通过上面的配置,我们为单元测试和集成测试生成了一个公共exec文件。接下来,我们将jetty配置为运行forked

    <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>${jetty-maven-plugin.version}</version>
        <configuration>
            <stopKey>foo</stopKey>
            <stopPort>9999</stopPort>
            <webApp>
                <contextPath>/myway</contextPath>
                <descriptor>src/main/webapp/WEB-INF/web.xml</descriptor>
            </webApp>
            <!-- passing the jacoco plugin as a jvmarg -->
            <jvmArgs>${failsafeArgLine}</jvmArgs>
        </configuration>
        <executions>
            <execution>
                <id>start-jetty</id>
                <phase>pre-integration-test</phase>
                <configuration>
                    <daemon>true</daemon>
                    <waitForChild>false</waitForChild>
                </configuration>
                <goals>
                    <goal>run-forked</goal>
                </goals>
            </execution>
            <execution>
                <id>stop-jetty</id>
                <phase>post-integration-test</phase>
                <goals>
                    <goal>stop</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    
    
    org.eclipse.jetty
    jetty maven插件
    ${jetty maven plugin.version}
    福
    9999
    /麦韦
    src/main/webapp/WEB-INF/WEB.xml
    ${failsafeArgLine}
    起动码头
    预集成测试
    真的
    假的
    分叉
    停靠码头
    整合后测试
    停止
    
    这将在带有jvmargs的单独jvm中启动jetty。最后,我们在pom的reporting标签中生成了报告。我们注意到,将报告添加到构建插件并没有捕获jetty运行的集成测试

    <reporting>
      </plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${jacoco-maven-plugin.version}</version>
            <reportSets>
                <reportSet>
                    <id>jacoco-report</id>
                    <reports>
                        <report>report</report>
                    </reports>
                </reportSet>
            </reportSets>
          </plugin>
        </plugins>
    </reporting>
    
    
    org.jacoco
    jacocomaven插件
    ${jacoco maven plugin.version}
    雅科科报告
    报告
    
    可以通过target/site/jacoco/index.html访问这些报告,也可以从命令行运行它

    mvn jacoco:报告


    希望有帮助。

    出于兴趣:您能解释一下您是如何执行测试的吗?这是自动工作还是需要手动为jetty和调用者插入仪器?目前,我有一个基于Maven的项目,它启动了一个带有web模块的jetty。代码覆盖使用Sonar插件在Jenkins中执行。测试是JUnit4.x。如果可能的话,我想我需要使用JaCoCo。我需要为此使用一些Maven插件吗,或者它会被Sonar接收吗…?项目中的JaCoCo Maven插件将启动代理,Jenkins中的后期构建操作将为Sonar提供仪器。这就是它在单元测试中的工作原理,我不使用Eclipse。我更感兴趣的是,在CI服务器上运行报告(在我的例子中是Jenkins)并将结果存储到Sonar时,只生成报告。这行吗…?不确定。我使用eclipse/命令提示符。因此,在命令提示符下,我运行mvn测试,在运行测试用例时,它将在fork到jvm之后生成jacocoexec文件。然后运行mvn jacoco:向gene报告