我们配置了排除:
def coverageExcludes() {
return [
"com/ourcompany/*Config*",
"com/ourcompany/ServiceApplication*",
"com/ourcompany/Shutdown*",
"com/ourcompany/ShutdownConnector*",
"com/ourcompany/Tomcat*",
"com/ourcompany/TomcatCustomConnectorCustomizer*",
"com/ourcompany/endpoint/exception/**",
"com/ourcompany/endpoint/util/ObjectMapperBuilder*",
"com/ourcompany/framework/**",
"com/ourcompany/helper/ApiHelper*",
"com/ourcompany/helper/OffsetDateTimeDeserializer*",
"com/ourcompany/persistence/entity/**",
"com/ourcompany/persistence/exception/**",
"com/ourcompany/service/exception/ServiceException*",
"com/ourcompany/service/model/**",
"com/ourcompany/v2/**",
"com/ourcompany/v3/**"
]
}
Run Code Online (Sandbox Code Playgroud)
将它们用于jacocoTestReport:
jacocoTestReport {
reports {
xml {
enabled true
}
html {
enabled true
}
}
getExecutionData().setFrom(fileTree(buildDir).include("/jacoco/*.exec"));
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it,
exclude: coverageExcludes()
)
}))
for (Object c : classDirectories) {
System.out.println(c);
}
}
}
Run Code Online (Sandbox Code Playgroud)
并且排除工作:
然后我们尝试在验证任务中使用相同的排除,并将覆盖率失败阈值设置为 0.87,因为这就是覆盖率报告中显示的内容:
jacocoTestCoverageVerification {
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it,
exclude: coverageExcludes()
)
}))
for …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的项目设置为运行 JaCoCo,如果测试覆盖率低于 80%,则构建失败。需要注意的是,我想排除一个特定的文件,但我似乎无法做到这一点。我已经在网络上搜索并阅读了大量的 Stack Overflow 答案、博客文章和插件文档,但我无法让任何东西发挥作用。它始终仍然包含我试图排除的文件。
我开始于:
tasks.jacocoTestCoverageVerification {
violationRules {
rule {
limit {
minimum = "0.8".toBigDecimal()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
显然,这将包括一切,而且确实如此。根据我所读到的内容,我尝试了以下变体,但没有一个起作用:
tasks.jacocoTestCoverageVerification {
violationRules {
rule {
classDirectories.setFrom(sourceSets.main.get().output.asFileTree.matching {
exclude("path.to.my.class.HelloWorld")
})
limit {
minimum = "0.8".toBigDecimal()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
tasks.jacocoTestCoverageVerification {
classDirectories.setFrom(
sourceSets.main.get().output.asFileTree.matching {
exclude("path.to.my.class.HelloWorld")
}
)
violationRules {
rule {
limit {
minimum = "0.8".toBigDecimal()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
tasks.jacocoTestCoverageVerification {
violationRules {
rule {
limit {
minimum = "0.8".toBigDecimal()
}
}
}
}
tasks { …Run Code Online (Sandbox Code Playgroud) 摇篮版本:6.1.1
Android Gradle 插件:4.0.0
当尝试运行我的 jacoco 覆盖范围时,它似乎没有考虑版本。当我查看 HTML 报告时,它显示“使用 JaCoCo 0.7.9.201702052155 创建”,尽管我已经进行了toolVersion = "0.8.5"设置。该报告也没有修复我期望在 0.8.3 中与 Kotlin 相关的问题,作为二次确认,这不起作用。
apply plugin: 'jacoco'
jacoco {
toolVersion = "0.8.5"
reportsDir = file("$buildDir/reports")
}
tasks.withType(Test) {
jacoco.includeNoLocationClasses = true
jacoco.excludes = ['jdk.internal.*']
}
project.afterEvaluate {
(android.hasProperty('applicationVariants')
? android.'applicationVariants'
: android.'libraryVariants').all { variant ->
def variantName = variant.name
def unitTestTask = "test${variantName.capitalize()}UnitTest"
def uiTestCoverageTask = "create${variantName.capitalize()}CoverageReport"
tasks.create(name: "${unitTestTask}Coverage", type: JacocoReport, dependsOn: [
"$unitTestTask",
"$uiTestCoverageTask"
]) {
group = "Reporting"
description = "Generate Jacoco …Run Code Online (Sandbox Code Playgroud) 我的公司要求新代码的测试覆盖率达到 90%,对于 Java 代码,我使用 gradle jacoco 插件,这很好;然而,当分支数量开始呈指数增长(夸张一点,可能是几何增长)时,分支覆盖率很难提高到90%。
这是一个非常人为的例子:
public class Application {
public static void test(boolean a, boolean b) {
if (a && b) {
System.out.println("true!");
} else {
System.out.println("false!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
和测试:
public class ApplicationTests {
@Test
public void test() {
Application.test(true, true);
Application.test(false, false);
}
}
Run Code Online (Sandbox Code Playgroud)
覆盖率报告如下所示:
它还说我错过了 4 个分支中的 1 个,或者换句话说,我已经覆盖了 4 个分支中的 3 个(分支覆盖率为 75%)。
如果我在这里增加布尔值的数量,看起来分支的数量是 n*2,其中 n 是布尔值的数量。因此 3 (a,b,c) 变为 6 个分支,10 变为 20 个分支。所以我想我不明白在这种情况下有 6 个或 20 个分支意味着什么。
为了满足这个问题 - 我可以
A) …
我正在做一门课程的作业,我需要全面了解这种方法

这些是属性和构造函数,它是咖啡机的程序,这是 Recipe 类
public class Recipe {
private String name;
private int price;
private int amtCoffee;
private int amtMilk;
private int amtSugar;
private int amtChocolate;
/**
* Creates a default recipe for the coffee maker.
*/
public Recipe() {
this.name = "";
this.price = 0;
this.amtCoffee = 0;
this.amtMilk = 0;
this.amtSugar = 0;
this.amtChocolate = 0;
}
Run Code Online (Sandbox Code Playgroud)
我用过
/*
* setPrice test
*/
@Test
public void testSetPrice_1() throws RecipeException {
r1.setPrice("25");
r1.setPrice("0");
}
/*
* setPrice test
*/ …Run Code Online (Sandbox Code Playgroud) 我有一个maven项目,使用"test"-phase以及"integration-test"-phase.在测试阶段,执行JUnit-Tests,在集成测试中有HTMLUnit-tests.我正在使用Jacoco [1] -maven-plugin来测量我的项目的JUnit测试所完成的代码覆盖.在进行集成测试时,我使用maven-embedded-glassfish-plugin启动glassfish服务器并在执行测试之前部署我的应用程序.
可悲但真实,我必须暂时禁用jacoco,因为它与"集成测试"相位不一致.
Jacoco的报告目标是/应该在准备包阶段进行,所以我认为它不应该影响集成测试阶段.但是当我启用jacoco:report时,由于内存大小问题,我的集成测试不再运行[2].
如何停止jacoco:报告影响集成测试阶段?
[1] http://www.eclemma.org/jacoco/
[2]
java.lang.instrument.IllegalClassFormatException: Error while instrumenting class com/steadystate/css/parser/SACParserCSS21TokenManager.
at org.jacoco.agent.rt_6l8m50.CoverageTransformer.transform(CoverageTransformer.java:91)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:424)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at com.steadystate.css.parser.SACParserCSS21.<init>(SACParserCSS21.java:2196)
at com.steadystate.css.parser.SACParserCSS21.<init>(SACParserCSS21.java:23)
at com.gargoylesoftware.htmlunit.javascript.host.css.CSSStyleSheet.parseCSS(CSSStyleSheet.java:530)
at com.gargoylesoftware.htmlunit.javascript.host.css.CSSStyleSheet.<init>(CSSStyleSheet.java:152)
at com.gargoylesoftware.htmlunit.javascript.host.html.HTMLStyleElement.getSheet(HTMLStyleElement.java:73)
at com.gargoylesoftware.htmlunit.javascript.host.css.StyleSheetList.item(StyleSheetList.java:129)
at com.gargoylesoftware.htmlunit.javascript.host.Window.getComputedStyle(Window.java:1591)
at com.gargoylesoftware.htmlunit.javascript.host.html.HTMLElement.getCurrentStyle(HTMLElement.java:2465)
at com.gargoylesoftware.htmlunit.html.DomNode.isDisplayed(DomNode.java:688)
at com.gargoylesoftware.htmlunit.html.HtmlSerializer.isVisible(HtmlSerializer.java:377)
at com.gargoylesoftware.htmlunit.html.HtmlSerializer.appendText(HtmlSerializer.java:371)
at com.gargoylesoftware.htmlunit.html.HtmlSerializer.appendNode(HtmlSerializer.java:126)
at com.gargoylesoftware.htmlunit.html.HtmlSerializer.appendChildren(HtmlSerializer.java:249)
at com.gargoylesoftware.htmlunit.html.HtmlSerializer.appendNode(HtmlSerializer.java:198)
at com.gargoylesoftware.htmlunit.html.HtmlSerializer.appendChildren(HtmlSerializer.java:249)
at com.gargoylesoftware.htmlunit.html.HtmlSerializer.appendNode(HtmlSerializer.java:198)
at …Run Code Online (Sandbox Code Playgroud) 我正在使用maven和jacoco-maven-plugin进行测试覆盖率报告
我需要将jacoco-agent配置为远程计算机(Linux),我正在运行运行集成测试的脚本
我怎么做到的?
这是我试过的:
<execution>
<id>prepare-agent-integration</id>
<phase>pre-integration-test</phase>
<goals>
<goal>prepare-agent-integration</goal>
</goals>
<configuration>
<destFile>${sonar.jacoco.itReportPath}</destFile>
<jacoco.address>172.X.X.X</jacoco.address><!-- This is the machine where integration tests runs-->
<jacoco.port>22</jacoco.port>
</configuration>
</execution>
<execution>
<id>report-integration</id>
<goals>
<goal>report-integration</goal>
</goals>
<configuration>
<dataFile>${sonar.jacoco.itReportPath}</dataFile>
<outputDirectory>${project.basedir}/target/site/jacoco-it</outputDirectory>
</configuration>
</execution>
Run Code Online (Sandbox Code Playgroud) 我使用EclEmma生成了一个覆盖率报告,其中包含以下路径:
C:/tmp/coverageReport/report.exec
Run Code Online (Sandbox Code Playgroud)
此文件存在,不为空且可读.关于代码覆盖的我的sonnar-runner配置定义如下:
sonar.java.coveragePlugin=jacoco
sonar.junit.reportsPath=C:/tmp/coverageReport/report.exec
Run Code Online (Sandbox Code Playgroud)
分析成功完成,但单元测试覆盖率小部件中没有可见数据.
此外,我在分析过程中得到以下几行:
18:23:45.036 INFO - parsing C:/tmp/coverageReport/report.exec
18:23:45.037 WARN - Reports path not found: C:/tmp/coverageReport/report.exec
Run Code Online (Sandbox Code Playgroud)
关于我缺少的任何想法?
我正在开发一个项目,我们正在使用TestNG和JUnit进行测试.
不幸的是,在编写TestNG测试时,他们不会在JaCoCo Coverage报告中考虑.
我写了一个testng.gradle文件,我将其包含在每个build.gradle文件中(这是一个多模块项目):
task testNG(type: Test) { useTestNG() }
test.dependsOn testNG
Run Code Online (Sandbox Code Playgroud)
JUnit和TestNG测试都以这种方式工作.
如果我写testng.gradle这样的话:
test {
useTestNG()
}
Run Code Online (Sandbox Code Playgroud)
JaCoCo工作正常,但显然只有TestNG测试才能执行.
我该如何解决?这是Gradle的JaCoCo插件中的错误吗?
我有一个maven项目,我想jacoco用于代码覆盖.这是我的pom的相关部分
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.5.201505241946</version>
<executions>
<execution>
<id>pre-my-test</id>
<phase>pre-integration-test</phase>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<append>true</append>
<destFile>${project.build.directory}/jacoco-it.exec</destFile>
<propertyName>failsafeArgLine</propertyName>
</configuration>
</execution>
<execution>
<id>post-my-test</id>
<phase>post-my-test</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>${project.build.directory}/jacoco-it.exec</dataFile>
<outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
所以我能够很好地运行我的测试,并且还可以很好地构建项目.然后我跑了
mvn clean verify org.jacoco:jacoco-maven-plugin:prepare-agent
Run Code Online (Sandbox Code Playgroud)
我不断收到错误
ERROR] Failed to execute goal org.jacoco:jacoco-maven-plugin:0.7.5.201505241946:
report (post-my-test) on project my-project:
An error has occurred in JaCoCo Test report generation.
Error while creating report:
Error while analyzing class /path/tp/my/project/target/classes/META-INF/
bundled-dependencies/some-third-party-1-jar-with-dependencies.jar@org/slf4j/event/
EventConstants.class. Can't add different class with same name:
org/slf4j/event/EventConstants -> [Help …Run Code Online (Sandbox Code Playgroud) jacoco ×10
gradle ×4
java ×3
maven ×3
junit ×2
maven-3 ×1
multi-module ×1
sonar-runner ×1
sonarqube ×1
testng ×1