标签: jacoco

我怎样才能在android studio中运行Jacoco进行代码覆盖

我已经在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)

android code-coverage jacoco android-studio

7
推荐指数
1
解决办法
3914
查看次数

不推荐使用属性“ sonar.jacoco.reportPath”。请改用'sonar.jacoco.reportPaths'

不推荐使用属性“ 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)

没有骰子,你怎么看?

java gradle jacoco sonarqube

7
推荐指数
1
解决办法
1万
查看次数

如何忽略 Jacoco 的 lombok.@UtilityClass?

我曾经lombok.@UtilityClass

  • 生成私有构造函数
  • 使班级最终
  • 将实用程序类中的所有字段设为静态

并且 Jacoco 不涵盖 Lombok 生成的代码。如果我显式定义一个私有构造函数,Jacoco 可以识别它。

那么,有什么方法可以避免由于使用而导致的覆盖损失@UtilityClass呢?

lombok jacoco test-coverage

7
推荐指数
1
解决办法
2082
查看次数

即使执行了测试,Jacoco 报告聚合也显示 0 覆盖率

我的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)

integration-testing jacoco jacoco-maven-plugin

7
推荐指数
0
解决办法
1012
查看次数

Sonarqube:导入多模块的 Jacoco xml 报告

我有一个多模块 Maven 项目,其中覆盖率报告位于另一个模块中,而不是覆盖的 Java 类中。将非空 xml 覆盖率报告(带有覆盖率信息)导入 Sonarqube 成功,但显示覆盖率为 0。

重现步骤:

  1. 查看以下github 项目并使用mvn clean verify. 之后,存在位于 中的聚合 xml 报告coverage/target/site/jacoco-aggregate-all/jacoco.xml。您可以在其中以及相应的 html 报告中看到覆盖率数据。

报道报告

  1. 使用以下命令启动 sonarqube(当前版本 8.4.1)并稍等一下。
docker run -d -p 9000:9000 sonarqube
Run Code Online (Sandbox Code Playgroud)

编辑:插件“JaCoco xml 报告导入器”已安装在此映像中。

JaCoco xml 报告导入器已安装

  1. 使用以下(详细)命令发布覆盖率数据。报告导入成功(参见日志)。
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)
  1. 浏览至http://localhost:9000/dashboard?id=example. 您会看到覆盖率为 0。

我究竟做错了什么?

声纳报告

code-coverage jacoco sonarqube jacoco-maven-plugin

7
推荐指数
1
解决办法
1万
查看次数

Jacoco 无法覆盖仅包含静态方法的类

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”,并报告其已覆盖 7​​5%。怎样做才能让课堂覆盖率达到100%?

不在测试方法中实例化该类,此处的覆盖率降低了 25%。这有什么意义呢?JaCoCo有缺陷吗?

提前致谢!

java jacoco jacoco-maven-plugin

7
推荐指数
1
解决办法
6739
查看次数

Jacoco 聚合报告显示覆盖率 0%

我正在尝试为多模块项目的单元测试添加聚合覆盖率报告。各个模块的覆盖率报告按预期生成。但报告模块目标中生成的聚合报告显示覆盖率为 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)

java code-coverage report jacoco jacoco-maven-plugin

7
推荐指数
0
解决办法
1002
查看次数

如何修复 JaCoCo reportDir 已弃用

摇篮7.1

jacoco {
    toolVersion = "0.8.5"
    reportsDir = file("$buildDir/jacoco")
}
Run Code Online (Sandbox Code Playgroud)

如何用 reportsDir 替换语句以隐藏有关已弃用功能的警告?

java gradle jacoco

7
推荐指数
1
解决办法
5958
查看次数

JaCoCo 规则元素的含义以及如何组合它们

我试图理解 JaCoCo 规则,但周围没有很多很好的例子。我看到的每个线程都循环使用文档中的相同示例。

我看到 3 个不同的指标:

  • 元素类型(BUNDLE、PACKAGE、CLASS、SOURCEFILE 或 METHOD)
  • 限制(指令、行、分支、复杂性、方法、类别)
  • 值(TOTALCOUNT、COVEREDCOUNT、MISSEDCOUNT、COVEREDRATIO、MISSEDRATIO)

我理解“元素类型”代表每个规则的范围,这很公平。

  • BUNDLE:代表整个项目
  • PACKAGE:每个java包
  • CLASS:顾名思义,一个类
  • 源文件:这与 有何不同CLASS?这与内部类有关吗?
  • 方法:范围适用于每种方法

但现在,限制和价值如何进入范围?例如:

<limit>
    <counter>LINE</counter>
    <value>COVEREDRATIO</value>
    <minimum>80%</minimum>
</limit>
Run Code Online (Sandbox Code Playgroud)

我可以替换LINEINSTRUCTION例如吗?如果,这意味着什么?

还来自文档:

如果限制是指比率,则它必须在 0.0 到 1.0 的范围内,其中小数位数也将决定错误消息的精度。

RATIOvsCOUNT很清楚,但我可以互换使用它们吗?IE:

<limit>
    <counter>LINE</counter>
    <value>TOTALCOUNT</value>
    <minimum>3</minimum>
</limit>
Run Code Online (Sandbox Code Playgroud)

如果,上述规则意味着什么?从生成的报告中,INSTRUCTION并且BRANCH始终处于比率 哈科科报告

jacoco jacoco-maven-plugin

7
推荐指数
1
解决办法
5877
查看次数

运行时面临Jacoco Method Too Large 错误

面对 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) 在 …

maven jacoco jacoco-maven-plugin

7
推荐指数
1
解决办法
4732
查看次数