我已经在android studio中调试了一下.我的app模块的gradle配置文件包含以下内容:
debug{
testCoverageEnabled true
}
Run Code Online (Sandbox Code Playgroud)
然后我在终端中运行以下命令:
gradlew createDebugCoverageReport
Run Code Online (Sandbox Code Playgroud)
事实上我得到了一个报告,但应用程序也崩溃了一个只读错误,我似乎无法弄明白.我正在使用mac.这是堆栈跟踪:
**java.io.FileNotFoundException: /jacoco.exec: open failed: EROFS (Read-only file system)**
03-01 00:04:56.871 19006-19006/mypackage.org.duckduck W/System.err? at libcore.io.IoBridge.open(IoBridge.java:416)
03-01 00:04:56.871 19006-19006/mypackage.org.duckduck W/System.err? at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
03-01 00:04:56.871 19006-19006/mypackage.org.duckduck W/System.err? at org.jacoco.agent.rt.internal_932a715.output.FileOutput.openFile(FileOutput.java:67)
03-01 00:04:56.871 19006-19006/mypackage.org.duckduck W/System.err? at org.jacoco.agent.rt.internal_932a715.output.FileOutput.startup(FileOutput.java:49)
03-01 00:04:56.871 19006-19006/mypackage.org.duckduck W/System.err? at org.jacoco.agent.rt.internal_932a715.Agent.startup(Agent.java:122)
03-01 00:04:56.871 19006-19006/mypackage.org.duckduck W/System.err? at org.jacoco.agent.rt.internal_932a715.Agent.getInstance(Agent.java:50)
03-01 00:04:56.871 19006-19006/mypackage.org.duckduck W/System.err? at org.jacoco.agent.rt.internal_932a715.Offline.<clinit>(Offline.java:31)
03-01 00:04:56.871 19006-19006/mypackage.org.duckduck W/System.err? at mypackage.org.duckduck.MainApplication.$jacocoInit(MainApplication.java)
03-01 00:04:56.871 19006-19006/mypackage.org.duckduck W/System.err? at mypackage.org.duckduck.MainApplication.<clinit>(MainApplication.java)
03-01 00:04:56.871 19006-19006/mypackage.org.duckduck W/System.err? at java.lang.Class.newInstanceImpl(Native Method)
03-01 …Run Code Online (Sandbox Code Playgroud) 不推荐使用属性“ sonar.jacoco.reportPath”。请改为使用“ sonar.jacoco.reportPaths”。
当通过Gradle运行SonarQube时,我一直收到此消息,并且短语“ reportPath”甚至在整个多模块项目中甚至都没有出现。我什至将sonarqube属性放在allprojects下,以覆盖可能存在的任何默认设置。关于如何摆脱此错误的任何提示?
我在用:
allprojects {
sonarqube {
properties {
property "sonar.jacoco.reportPaths", "${project.buildDir}/jacoco/test.exec"
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑1:
摇篮包装3.1
我在build.gradle的根目录中使用它
plugins {
id "jacoco"
id "org.sonarqube" version "2.5"
}
Run Code Online (Sandbox Code Playgroud)
并尝试了您的建议
allprojects {
sonarqube {
properties {
property "sonar.jacoco.reportPath", ""
property "sonar.jacoco.reportPaths", "${project.buildDir}/jacoco/test.exec"
}
}
}
Run Code Online (Sandbox Code Playgroud)
没有骰子,你怎么看?
我曾经lombok.@UtilityClass:
并且 Jacoco 不涵盖 Lombok 生成的代码。如果我显式定义一个私有构造函数,Jacoco 可以识别它。
那么,有什么方法可以避免由于使用而导致的覆盖损失@UtilityClass呢?
我的maven项目目录结构如下:
parent
-child
-src/java
-src/test <!-- unit tests -->
-pom.xml
-integration_test
-src/test
-pom.xml
-report
-pom.xml
-pom.xml
Run Code Online (Sandbox Code Playgroud)
由于集成测试和源代码位于不同的模块中,因此我使用了 Jacoco report-aggragate (报告模块)。
父pom.xml
<profile>
<id>codecoverage-it</id>
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.4</version>
<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>
</executions>
</plugin>
</plugins>
</build>
</profile>
Run Code Online (Sandbox Code Playgroud)
报告模块pom.xml
<dependencies>
<dependency>
<groupId>###</groupId>
<artifactId>child</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>###</groupId>
<artifactId>integration_test</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>overage-aggregate</id>
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>report-aggregate</id>
<phase>verify</phase>
<goals>
<goal>report-aggregate</goal>
</goals>
</execution>
</executions>
</plugin> …Run Code Online (Sandbox Code Playgroud) 我有一个多模块 Maven 项目,其中覆盖率报告位于另一个模块中,而不是覆盖的 Java 类中。将非空 xml 覆盖率报告(带有覆盖率信息)导入 Sonarqube 成功,但显示覆盖率为 0。
重现步骤:
mvn clean verify. 之后,存在位于 中的聚合 xml 报告coverage/target/site/jacoco-aggregate-all/jacoco.xml。您可以在其中以及相应的 html 报告中看到覆盖率数据。docker run -d -p 9000:9000 sonarqube
Run Code Online (Sandbox Code Playgroud)
编辑:插件“JaCoco xml 报告导入器”已安装在此映像中。
mvn sonar:sonar -X -Dsonar.projectKey=example -Dsonar.host.url=http://localhost:9000 -Dsonar.login=admin -Dsonar.password=admin -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco-aggregate-all/jacoco.xml
## Log output contains
...
10:54:28.519 Reading report '<project-path>\maven-multimodule-coverage\coverage\target\site\jacoco-aggregate-all\jacoco.xml'
...
Run Code Online (Sandbox Code Playgroud)
http://localhost:9000/dashboard?id=example. 您会看到覆盖率为 0。我究竟做错了什么?
Jacoco 无法覆盖仅包含静态方法的类。我没有在测试类中实例化该类,而是直接调用静态方法来测试。
public class DateUtil {
final static String datePattern = "EEE MM/dd/yyyy";
public static String convertToGMTDate(Date date ) {
DateFormat df = new SimpleDateFormat(datePattern, Locale.getDefault());
df.setTimeZone(TimeZone.getTimeZone("GMT"));
return df.format(date);
}
}
class DateUtilTest {
static DateUtil dateutil;
@Test
void convertToGMTDate() {
Date date = new GregorianCalendar(2020, Calendar.FEBRUARY, 11).getTime();
String stringDate = dateutil.convertToGMTDate(date);
assertEquals("Tue 02/11/2020)",stringDate);
}
}
Run Code Online (Sandbox Code Playgroud)
错误报告仅突出显示了类名“DateUtil”,并报告其已覆盖 75%。怎样做才能让课堂覆盖率达到100%?
不在测试方法中实例化该类,此处的覆盖率降低了 25%。这有什么意义呢?JaCoCo有缺陷吗?
提前致谢!
我正在尝试为多模块项目的单元测试添加聚合覆盖率报告。各个模块的覆盖率报告按预期生成。但报告模块目标中生成的聚合报告显示覆盖率为 0%
模块结构如下:
Root
|
|
- - - Components module
|
|
- - - - - - - - - Sub module A
|
|
- - - - - - - - - Sub module B
|
|
- - - - - - - - - Aggregate report module
Run Code Online (Sandbox Code Playgroud)
我关注了这个示例项目:https://github.com/jacoco/jacoco/blob/master/jacoco-maven-plugin.test/it/it-report-aggregate/pom.xml
现有的根 pom 包含插件配置如下,我没有更改任何内容:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<executions>
<execution>
<id>default-instrument</id>
<goals>
<goal>instrument</goal>
</goals>
</execution>
<execution>
<id>default-restore-instrumented-classes</id>
<goals>
<goal>restore-instrumented-classes</goal>
</goals>
</execution>
<execution>
<id>pre-unit-test</id>
<goals>
<goal>prepare-agent</goal>
</goals> …Run Code Online (Sandbox Code Playgroud) 摇篮7.1
jacoco {
toolVersion = "0.8.5"
reportsDir = file("$buildDir/jacoco")
}
Run Code Online (Sandbox Code Playgroud)
如何用 reportsDir 替换语句以隐藏有关已弃用功能的警告?
我试图理解 JaCoCo 规则,但周围没有很多很好的例子。我看到的每个线程都循环使用文档中的相同示例。
我看到 3 个不同的指标:
我理解“元素类型”代表每个规则的范围,这很公平。
CLASS?这与内部类有关吗?但现在,限制和价值如何进入范围?例如:
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>80%</minimum>
</limit>
Run Code Online (Sandbox Code Playgroud)
我可以替换LINE为INSTRUCTION例如吗?如果是,这意味着什么?
还来自文档:
如果限制是指比率,则它必须在 0.0 到 1.0 的范围内,其中小数位数也将决定错误消息的精度。
RATIOvsCOUNT很清楚,但我可以互换使用它们吗?IE:
<limit>
<counter>LINE</counter>
<value>TOTALCOUNT</value>
<minimum>3</minimum>
</limit>
Run Code Online (Sandbox Code Playgroud)
面对 drools 库中方法的 jacoco 的方法太大错误,如何解决这个问题?我还尝试将 ** DRL6Lexer.class添加到 jacoco 中的排除项中,但它不起作用。我还能如何解决这个问题。
错误:
java.lang.instrument.IllegalClassFormatException:检测 org/drools/compiler/lang/DRL6Lexer 时出错。在 org.jacoco.agent.rt.internal_f3994fa.CoverageTransformer.transform(CoverageTransformer.java:94) 在 java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246) 在 java.instrument/sun.instrument .TransformerManager.transform(TransformerManager.java:188) 在 java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:563) 在 java.base/java.lang.ClassLoader.defineClass1(本机方法) 在 java.base /java.lang.ClassLoader.defineClass(ClassLoader.java:1016) 在 java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) 在 java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader .java:800) 在 java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:698) 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:621) 在 java.基/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579)在java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)在java.base/java.lang。 ClassLoader.loadClass(ClassLoader.java:521) 在 org.drools.compiler.compiler.DRLFactory.getDRLLexer(DRLFactory.java:112) 在 org.drools.compiler.compiler.DRLFactory.buildLexer(DRLFactory.java:59) 在 org .drools.compiler.compiler.DrlParser.parse(DrlParser.java:163) 在 org.drools.compiler.compiler.DrlParser.parse(DrlParser.java:154) 在 org.drools.compiler.compiler.DrlParser.parse(DrlParser) .java:144) 在 DroolsParser.parseDrl(DroolsParser.java:36) 在 DroolsParserTest.generateRules_success(DroolsParserTest.java:39) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 java.base/ jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 位于 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于 java.base/java.lang.reflect.Method。在 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 调用(Method.java:566) org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)在 org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)在 org.junit.internal.runners.statements。 RunBefores.evaluate(RunBefores.java:26) 在 org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) 在 org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100) 在 org.junit .runners.ParentRunner.runLeaf(ParentRunner.java:366) 在 …