确保执行此操作。请注意,如果您使用的是Gradle,Maven还是ANT。但以下概念与任何构建系统都非常相似。
- 您必须拥有一个.war/ .ear应用程序工件,您需要在Tomcat后面运行/类似。
- 您还需要确保在调试模式下编译主代码,否则jacoco不会满意。
- 例如:Java中的-g选项和类似的调试选项(如果您使用的是groovy)。
tasks.withType(Compile) {
options.debug = true
options.compilerArgs = ["-g"]
}
- 假设你有.war并使用Tomcat。然后在启动Tomcat时。
- 在Tomcat启动脚本中,确保你告诉Tomcat的JVM在哪里jacocoagent.jar文件并传递其他参数。这是我们有时看到的主要缺失点(即不将jacoco附加到目标JVM的会话并尝试获取代码覆盖率)。
例如:我用传递给Tomcat的以下参数启动我的Tomcat脚本(-Dxxxx=value way)
PROJ_EXTRA_JVM_OPTS=-javaagent:tomcat/jacocoagent.jar=destfile=build/jacoco/ST/jacocoST.exec,append=false
基本上,Tomcat 启动脚本将具有 -Dparameter=value,您可以将上述参数(Linux/Unix 导出变量)传递给 Tomcat/Target JVM 的作用域。
上述参数行在发送到Tomcat时,会将JACOCO代理.jar文件附加到“TARGET”(又名Tomcat JVM)。。在这里,你告诉Tomcat,去寻找jacocoagent.jar文件,该文件来自你工作区下一个名为“tomcat”的导演。它将在build/jacoco/ST文件夹下创建一个名为“jacocoST.exec”(又名Selenium Test的jacoco exec文件)的jacoco .exec文件(我正在使用Gradle,所以Gradle会在你运行build/compile/test/integrationTest/customSeleniumTaskThatYouMightHaveCreated时创建“build”文件夹)。
注意:这意味着,您不必在测试任务中指定jacoco部分(因为这将在BUILD系统的JVM Gradle,Maven或ANT中运行,无论您拥有什么)。
//We don't need jacoco for non-unit tests type of tasks as Jacoco won't be able to find any coverage if done this way. Jacoco agent file needs to be attached/visible to the TARGET's JVM (where you run your application via a .war / .ear etc).
jacoco {
// ... As Gradle runs Unit tests (while doing build), they run free, in the same JVM where Gradle runs the build so Unit test have visibility to the main classes in the same JVM (which Gradle is using to run the build). Thus, you can use jacoco section in Gradle for running unit tests. BUT,
// ... Don't use this section for running Integration, Acceptance, Selenium tests which run on a target JVM. Instead attach jacocoagent.jar and specify jacoco parameters to the target JVM.
}
-
一旦你有你的Tomcat启动并运行,现在你运行你的硒测试。注意: -- 我在 Linux/Unix 机器上使用 Jenkins,“xvfb”插件非常方便,即现在我可以在无头模式下运行 Selenium GUI 测试,并且我不会在运行测试的机器上通过弹出测试页面来 bug 任何用户。
- 如果你最终在Jenkins中使用了“xvfb”插件,你首先需要在运行测试的服务器(Linux/Unix)上启动“Xvfb”服务。
-- 如果您在Windows计算机上运行非单元测试(又名Integrated/Selenium等),那么您可以在运行测试时看到GUI测试弹出。如果您不想看到弹出窗口,那么您的 Jenkins 实例可以将从属(您的 Windows 计算机)进程作为服务运行(“安装即服务”)。如果您将Windows机器创建为从属计算机,当您在计算机上运行JLNP安装时,您将看到一个弹出窗口,表明Jenkins已成功启动从属进程,单击文件>安装为服务将在Windows机器上以“HEADLESS”身份运行从属计算机。
在测试运行时,您会注意到这一次,jacoco 将根据您为 destfile 参数定义的值创建一个文件夹结构/exec 文件,但它仍然是 0 或一些较小的大小。
一旦你的硒/非单元测试完成,你必须“停止”Tomcat /目标JVM。这会将所有 jacoco 覆盖范围信息刷新到此 jacoST.exec 文件(您希望 jacoco 创建的自定义文件)中。-- 注意:如果你想动态刷新jacocoST.exec文件(不需要Tomcat JVM/session停止,那么你可以查看jacoco文档如何做到这一点,那里有一个主题告诉了这一点,这样你的应用程序可以继续运行,你不必停止你的应用程序/webservice)。
-
运行 jacocoTestReport 任务,您将看到 jacoco 代码覆盖率。
例如:
jacocoTestReport {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
ignoreFailures = true
//UT=is for Unit tests, IT=integrationTest, AT=acceptanceTest, ST=Selenium GUI tests.
//executionData = files('build/jacoco/UT/jacocoUT.exec')
//executionData = files('build/jacoco/IT/jacocoIT.exec')
//executionData = files('build/jacoco/UT/jacocoUT.exec', 'build/jacoco/IT/jacocoIT.exec')
//executionData = files(['build/jacoco/UT/jacocoUT.exec', 'build/jacoco/IT/jacocoIT.exec'])
//OR use the following way for all.
executionData = fileTree(dir: 'build/jacoco', include: '**/*.exec')
reports {
xml{
enabled true
//Following value is a file
destination "${buildDir}/reports/jacoco/xml/jacoco.xml"
}
csv.enabled false
html{
enabled true
//Following value is a folder
destination "${buildDir}/reports/jacoco/html"
}
}
//sourceDirectories = files(sourceSets.main.allJava.srcDirs)
sourceDirectories = files('src/java')
//sourceDirectories = files(['src/java','src/groovy'])
classDirectories = files('build/classes/main')
//------------------------------------------
//additionalSourceDirs = files(['test/java','test/groovy','src/java-test', 'src/groovy-test'])
//additionalSourceDirs += files('src/java-test')
}
如果您仍然看到任何问题,请随时与我联系。你也可以在这里看到一些关于stackoverflow的帖子,关于我如何实现这一点,并将相同的报道发布到SonarQube。