标签: jacoco-maven-plugin

用Jacoco从Sonar的条件覆盖范围中排除groovy slf4j日志记录

我们将SonarQube 5.1与Jacoco maven插件0.7.4一起使用,并且所有slf4j日志记录语句(例如,log.debug('Something happened')表明仅覆盖2个分支中的1个)。我知道这是因为slf4j在内部执行if debug,这很好,但是我们不希望这会影响我们的数字。我们对测试slf4j并不感兴趣,我们宁愿不要针对不同的日志记录级别多次运行每个测试。

那么,我们如何告诉Sonar和/或Jacoco将这些线路排除在覆盖范围之外?它们都具有可配置的文件排除项,但是据我所知,这些排除项仅是用于从覆盖范围中排除自己的类(使用目标目录),而不是导入的库。groovy.util.logging.*'无论如何,我都尝试将其添加到排除列表中,但是它什么也没做。

logger.isDebugEnabled()杀死了我的代码覆盖范围。我打算在运行cobertura时将其排除在外,并且建议对于Cobertura,应使用'ignore'属性而不是'exclude'。我在设置或文档中没有看到类似Jacoco或Sonar的东西。

编辑:运行Jacoco覆盖后,附带的Eclipse示例图像(Sonar在其GUI中显示相同的内容)。这是我们其中一个类的实际代码。 Jacoco分支机构对slf4j日志记录的覆盖

编辑2:我们正在使用Slf4j批注。此处的文档:http : //docs.groovy-lang.org/next/html/gapi/groovy/util/logging/Slf4j.html

此本地转换使用LogBack日志记录为您的程序添加了日志记录功能。对名为log的未绑定变量的每个方法调用都将映射到对记录器的调用。为此,将在类中插入一个日志字段。如果该字段已经存在,则使用此转换将导致编译错误。方法名称将用于确定在记录器上调用的内容。

log.name(exp)

映射到

if (log.isNameLoggable() {
        log.name(exp)
     }
Run Code Online (Sandbox Code Playgroud)

这里name是信息,调试,警告,错误等的占位符。如果表达式exp是常量或仅是变量访问,则方法调用将不会转换。但这仍然会导致对注入的记录器的调用。

希望这可以澄清正在发生的事情。如果为避免未启用的日志级别构建昂贵的字符串,我们的日志语句将成为2个分支(据我所知,这是一种常见做法)。但这意味着要保证覆盖所有这些分支,我们必须针对每个日志记录级别重复运行每个测试。

groovy unit-testing code-coverage sonarqube jacoco-maven-plugin

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

Jacoco maven 插件阻塞了控制台,Exceptions-java.lang.IllegalStateException:类已经被检测

我正在使用 Jacoco 插件进行声纳代码覆盖,并使用强大的模拟 mockito 组合来编写 JUnit 测试用例,而当我运行 mvn clean install 时,构建一切顺利,但控制台显示了一个非常长的堆栈跟踪链,它不断出现项目中使用了很多很多类,而且很烦人,异常跟踪类似于以下-

java.lang.instrument.IllegalClassFormatException: Error while instrumenting class..
Caused by: java.io.IOException: Error while instrumenting class.
Caused by: java.lang.IllegalStateException: Class <class-name> is already instrumented.
Run Code Online (Sandbox Code Playgroud)

我通过以下链接寻求解决方案,但找不到出路:-

https://github.com/jacoco/jacoco/issues/32
Run Code Online (Sandbox Code Playgroud)

链接说“该错误表明为同一进程配置了两个 JaCoCo 代理,看起来激活 surefire-report-plugin 导致双重代理,这不是特例,而是用于测试的 JVM 配置错误“在我的情况下,我猜它甚至不是双重代理,因为我的 argLine 设置为只有一个 jacoco 代理。

在我的情况下,argLine 设置为以下 -

javaagent:C:\\Users\\user\\.m2\\repository\\org\\jacoco\\org.jacoco.agent\\0.7.6.201602180812\\org.jacoco.agent-0.7.6.201602180812-runtime.jar=destfile=C:Users\\user\\git\\package\\target\\jacoco.exec
Run Code Online (Sandbox Code Playgroud)

我的 jacoco-sonar 配置的 pom.xml 条目如下 -

<properties>
        <sonar.sources>src/main/java</sonar.sources>
        <sonar.tests>src/test/java</sonar.tests>
        <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
        <sonar.jacoco.reportPaths>${project.basedir}/target/jacoco.exec</sonar.jacoco.reportPaths>
        <sonar.language>java</sonar.language>
        <sonar.binaries>${project.basedir}/target/classes</sonar.binaries>
        <sonar.inclusions>
            **/com/abc/service/impl/ABCServiceImpl.java,
            **/com/abc/dao/impl/ABCDAOImpl.java
        </sonar.inclusions>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20</version>
                <configuration>
                    <skipTests>false</skipTests>
                    <argLine>-Xmx1024m -XX:MaxPermSize=256m ${argLine}</argLine>
                </configuration> …
Run Code Online (Sandbox Code Playgroud)

java instrumentation powermock jacoco-maven-plugin

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

在SonarQube +报告中未显示的相关模块中的汇总覆盖范围或覆盖范围由Jacoco生成

我正在运行jacoco插件来生成html,xml并jacoco.exec报告以测量我的testNg测试所测试的代码的覆盖范围.

我在本地和以及Jenkins我的所有单元测试结果中成功生成了这些报告,Sonar并且它向我展示了覆盖范围.

jacoco.exec的模块和依赖模块的覆盖率都有.我已经验证了这个eclemma plugin用于eclipse.

我没有在Sonar的依赖模块中获得覆盖结果.任何一个我做错了.

我的插件就是这样的

<plugin>
 <groupId>org.jacoco</groupId>
 <artifactId>jacoco-maven-plugin</artifactId>
 <version>0.7.7.201606060606</version>
 <executions>
    <execution>
        <goals>
            <goal>prepare-agent</goal>
        </goals>
    </execution>
    <execution>
        <id>report</id>
        <phase>prepare-package</phase>
        <goals>
            <goal>report</goal>
        </goals>
    </execution>
  </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

我的目标是 jacoco:report-aggregate

java jenkins eclemma sonarqube jacoco-maven-plugin

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

即使执行了测试,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 聚合报告正在生成 Exec 文件而不是 XML

我们有一个多模块 Maven 项目。我们用的是java8。

\n
-Parent\n-- Child 1\n-- Child 2\n-- Coverage-Report\n
Run Code Online (Sandbox Code Playgroud)\n

所有项目都有单元测试用例,运行良好,覆盖率超过 85%。父 pom.xml 文件具有 jacoco-profile 和 jacoco-maven-plugin 插件,如下所示

\n
      <plugin>\n            <groupId>org.jacoco</groupId>\n            <artifactId>jacoco-maven-plugin</artifactId>\n            <version>0.8.6</version>\n            <configuration>\n                <destFile>${sonar.coverage.jacoco.xmlReportPaths}</destFile>\n                <append>true</append>\n            </configuration>\n            <executions>\n                <execution>\n                    <id>prepare-agent</id>\n                    <goals>\n                        <goal>prepare-agent</goal>\n                    </goals>\n                </execution>\n                <execution>\n                    <id>report</id>\n                    <phase>verify</phase>\n                    <goals>\n                        <goal>report</goal>\n                    </goals>\n                </execution>\n            </executions>\n        </plugin>\n
Run Code Online (Sandbox Code Playgroud)\n

在Coverage-Report模块中,只有pom.xml用于聚合报告。它的配置文件为 jacoco 如下

\n
    <profile>\n        <id>jacoco</id>\n        <activation/>\n        <build>\n            <plugins>\n                <plugin>\n                    <groupId>org.jacoco</groupId>\n                    <artifactId>jacoco-maven-plugin</artifactId>\n                    <executions>\n                        <execution>\n                            <id>report-aggregate</id>\n                            <phase>verify</phase>\n                            <goals>\n                                <goal>report-aggregate</goal>\n                            </goals>\n                        </execution>\n                    </executions>\n                </plugin>\n            </plugins>\n        </build>\n    </profile>\n
Run Code Online (Sandbox Code Playgroud)\n

要生成报告,我们使用以下命令

\n
mvn clean verify -Pjacoco\n
Run Code Online (Sandbox Code Playgroud)\n

我们确实看到父 pom.xml …

java maven jacoco-maven-plugin

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

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
查看次数