标签: jacoco

如何使用jacoco获取外部Java库的代码覆盖率?

如果我有一个使用库(jar文件)的java项目,是否可以在这个jar中获取类的代码覆盖率?

这背后的想法是,我想找出项目所依赖的外部库的比例(假设是spring,hibernate,或者它可能是scala jar,如果它是scala项目,为什么不这样)实际上是使用的.我甚至想象我可以尝试列出它们并在一个jar中重新绑定它们,这个jar 包含必要的.class文件(例如像apache felix这样的插件)以获得尽可能小的jar.我不确定我是否真的想要这样做,我知道这可能是一个坏主意,原因有很多,但我认为这是一个实验.

我找不到怎么做,jacoco直接在我的项目中报告类文件的覆盖范围.也许我做错了什么,我正在使用像这样的maven插件:

        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.5.6.201201232323</version>
            <configuration>
                <destfile>${basedir}/target/coverage-reports/jacoco-unit.exec</destfile>
                <datafile>${basedir}/target/coverage-reports/jacoco-unit.exec</datafile>
                <includes>
                    <include>**</include>
                </includes>
            </configuration>
            <executions>
                <execution>
                    <id>jacoco-initialize</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>jacoco-site</id>
                    <phase>package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
Run Code Online (Sandbox Code Playgroud)

我已经尝试更改include标记,但唯一的效果是限制默认值,其中只包含项目中的类文件.

提前致谢 !


在oers的回答后编辑:

我发现如何使用ant和antrun-plugin来做这件事,虽然它非常复杂,我在使用antrun插件版本时遇到了很多麻烦(无法使最新版本工作,即使是基本任务)我真的很想坚持Maven.如果有人知道如何使用je jacoco maven插件代替蚂蚁,我很感兴趣!

使用ant的部分解决方案:实际上jacoco.exec文件已经包含对我的外部jar类的引用; 因此,报告任务应该被告知考虑到这些jar,而不是我想的运行时阶段.这是我使用的maven配置(我在http://intellectualcramps.wordpress.com/2012/03/22/jacoco-tycho-and-coverage-reports/上找到了帮助):

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <!--<version>1.7</version>-->
            <dependencies>
                <dependency>
                    <groupId>org.jacoco</groupId>
                    <artifactId>org.jacoco.ant</artifactId>
                    <version>0.5.6.201201232323</version>
                </dependency>
                <dependency>
                    <groupId>ant-contrib</groupId>
                    <artifactId>ant-contrib</artifactId>
                    <version>20020829</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <id>jacoco-report</id>
                    <phase>package</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <tasks>

                            <taskdef name="jacoco-report"
                                   classname="org.jacoco.ant.ReportTask"
                                   classpathref="maven.plugin.classpath" />
                            <taskdef classpathref="maven.runtime.classpath"
                     resource="net/sf/antcontrib/antcontrib.properties" /> …
Run Code Online (Sandbox Code Playgroud)

java maven jacoco

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

jacoco在使用蚂蚁时不排除课程

我无法获得jacoco/junit ant目标以从覆盖范围中排除类.我可以通过这样的方式来排除包:

<jacoco:coverage destfile="${coverage.reports.dir.xml}/output.jacoco" excludes="foo.*:bar.fiz.*:my.long.package.name.*">
Run Code Online (Sandbox Code Playgroud)

这并不排除我的测试类,因为测试类与它们测试的类在同一个包中.我已经厌倦了用正则表达式排除测试类,但它不起作用.

<jacoco:coverage destfile="${coverage.reports.dir.xml}/output.jacoco" excludes="foo.*:bar.fiz.*:**/Test.*:**/Tests.*">
Run Code Online (Sandbox Code Playgroud)

我还尝试在报告任务中包含我想要的类,但由于我们的测试类位于不起作用的相同包中.我们的构建将所有类放在同一目录中,例如buildRoot/classes/ProjectName.因此buildRoot/classes/ProjectName/foo将包含测试和非测试类的编译类.

有关如何让jacoco排除此设置中的所有测试的任何建议吗?

谢谢.

jacoco

9
推荐指数
1
解决办法
7374
查看次数

JaCoCo - 从报告中排除JSP

在JaCoCo生成的Maven站点报告中,由于我所有已编译的JSP都包含在内(并且它们很长),因此我的报道非常糟糕.我尝试了以下内容reporting:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <configuration>
        <exclude>target/classes/jsp/**/*.class</exclude>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

另一个外观相似的配置在buildPOM的prepare-package相位部分.这并不能阻止JSP类包含在报告中.怎么避免呢?

jsp maven jacoco

9
推荐指数
1
解决办法
6826
查看次数

与詹金斯的代码覆盖率

我被要求使用Jenkins来测试Java项目的代码覆盖率.问题是我从未使用过Jenkins,并且几乎没有实际代码覆盖率的经验.我一直在寻找,我遇到了JaCoCo和Cobertura作为插头.问题在于,关于它们的一切都在我的头上.我的问题是,据我所知,Jenkins和JaCoCo/Cobertura用于运行测试(Junit?),并报告处理我的代码的程度,但他们在哪里获得测试?显然我应该制作它们,但这些文件是什么类型的(再次是Junit?)以及这些工具如何获得它们?

如果你感觉很慷慨,这些工具有没有很好的入门级教程?

java code-coverage cobertura jenkins jacoco

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

Gradle Jacoco - 覆盖率报告包括配置中排除的类别

我在项目中添加了一组没有测试的源代码,我不希望它们破坏我的测试覆盖率统计信息.我在下一个方面配置了Jacoco:

test {
    jacoco{
        excludes = ['org/bla/**']
        includes = ['com/bla/**']
        append = false
    }
}

jacocoTestReport {
    dependsOn test
    description = "Generate Jacoco coverage reports after running tests."
    reports {
        xml.enabled true
        html.enabled true
    }
    classDirectories = fileTree(dir: 'build/classes/main', include: 'com/bla/**')
    sourceDirectories = fileTree(dir: 'scr/main/java', include: 'com/bla/**')
}
Run Code Online (Sandbox Code Playgroud)

但无论如何,在生成报告时,Jacoco还包括来自org.bla的

有人能帮我吗 ?

编辑

经过一些调试后,似乎所有默认输出都添加到org.gradle.testing.jacoco.tasks.JacocoReport#classDirectories私有方法中org.gradle.testing.jacoco.plugins.JacocoPlugin#addDefaultReportTasks

使用此类代码时可见:

jacocoTestReport {
    classDirectories = files('build/classes/main/com/bla')
    println("-----------------------------------------------------------")
    getAllClassDirs().each { File file ->
        println(file.absolutePath)
    }
    println("-----------------------------------------------------------")
    getAdditionalClassDirs().each{ File file ->
        println(file.absolutePath)
    }
} …
Run Code Online (Sandbox Code Playgroud)

gradle jacoco

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

Jacoco - 零覆盖率

我正在尝试将jacoco集成到我们的ant构建中,并使用一个简单的测试项目对其进行评估.

编译和其他输出看起来很有希望,但是当我查看覆盖范围时,它总是为零.

package alg;

public class SpecialAlgorithm {
    public SpecialAlgorithm() {}

    public int uncoveredMethod(int i) {
        return i * i;
    }

    public int sum(int i, int j) {
        return i + j;
    }   
}
Run Code Online (Sandbox Code Playgroud)

测试用例:

package alg;

import static org.junit.Assert.assertEquals;
import org.junit.Test;
import alg.SpecialAlgorithm;

public class SpecialAlgorithmTest {
    @Test
    public void testSum() {
        SpecialAlgorithm alg = new SpecialAlgorithm();
        int sum = alg.sum(1, 2);
        assertEquals(3, sum);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ant脚本:

<project xmlns:jacoco="antlib:org.jacoco.ant" name="Code Coverage with JaCoCo"
    default="rebuild">
    <property name="src.dir" location="../java" />
    <property …
Run Code Online (Sandbox Code Playgroud)

java jacoco

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

SonarQube单元测试没有二进制文件

经过无休止的谷歌搜索和阅读大量的文件,我完全被finihed.

我想将已创建的单元测试报告(如.xml和.exec文件(JUnit和Jacoco))导入SonarQube.问题是

Sensor JaCoCoOverallSensor...
15:54:48 15:54:48.909 INFO  - No JaCoCo analysis of project coverage can be done since there is no class files.
15:54:48 15:54:48.909 INFO  - Sensor JaCoCoOverallSensor done: 374 ms
15:54:48 15:54:48.909 INFO  - Sensor JaCoCoSensor...
15:54:48 15:54:48.910 INFO  - No JaCoCo analysis of project coverage can be done since there is no class files.
15:54:48 15:54:48.910 INFO  - Sensor JaCoCoSensor done: 1 ms 
Run Code Online (Sandbox Code Playgroud)

由于我们有一个相当大的代码,我们没有src的所有二进制文件.因此,问题是:"如何在没有二进制文件的情况下仅将完成的报告导入SonarQube?"

SonarRunner Properties

sonar.dynamicAnalysis=reuseReports
sonar.core.coveragePlugin=Jacoco
sonar.junit.reportsPath=[...]/workspace/junit/xml-results
sonar.jacoco.reportPath=[...]/workspace/junit/junit-test.exec
Run Code Online (Sandbox Code Playgroud)

任何帮助都非常感谢!提前致谢!

unit-testing jacoco sonar-runner sonarqube

9
推荐指数
1
解决办法
2683
查看次数

如果使用@PrepareForTest,Jacoco会错过所有覆盖范围

我遇到了一个有趣的问题,如果使用的话,Jacoco会报告单位测试下的0%覆盖率@PrepareForTest.

长话短说,我的单元测试是使用@RunWith(PowerMockRunner.class)@PrepareForTest(SomeStaticMethodClass.class)执行单元测试的组合,需要模拟静态方法.你可以阅读这两篇文章,我就嘲笑静态方法(发表文章1,2).模拟静态方法效果很好.不好的副作用是,当Jacoco使用@PrepareForTest注释运行单元测试时,任何测试的类单元都会被忽略,并且该类的Jacoco报告显示0%的覆盖率.我已经将问题专门针对@PrepareForTest注释.我这样做是通过创建一个简单的POJO单元测试,在该POJO上获得100%的覆盖率,然后在@PrepareForTest单元测试的注释中添加.在添加该注释后,Jacoco报告显示POJO覆盖率为0%.

所以任何人对此都有任何想法?

以下是一些技术信息:

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) Client VM (build 25.45-b02, mixed mode)

Apache Maven 3.0.4 (r1232337; 2012-01-17 02:44:56-0600)

<plugin>
  <groupId>org.jacoco</groupId> 
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.7.4.201502262128</version>
. . .
</plugin>


<plugin>
  <groupId>org.apache.maven.plugins</groupId> 
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.18.1</version>
  . . .
</plugin>


    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>1.5.6</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-easymock</artifactId>
        <version>1.5.6</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>1.5.6</version>
        <scope>test</scope>
    </dependency>
    <dependency> …
Run Code Online (Sandbox Code Playgroud)

java unit-testing mocking powermock jacoco

9
推荐指数
0
解决办法
1263
查看次数

没有内联Kotlin方法的报道

inline在编译期间,用关键字标记的Kotlin函数很好地内联,似乎代码覆盖工具(如JaCoCo)无法正确计算代码覆盖率.克服这个问题的常用方法是什么?有没有办法让测试以某种方式避免内联步骤并直接调用测试方法?是否可以跳过所有内联方法的报告生成(例如,通过Gradle任务)而不排除整个类?

testing code-coverage gradle jacoco kotlin

9
推荐指数
2
解决办法
931
查看次数

maven Jacoco:如何自动增加代码覆盖率阈值

我正在使用JacocoMaven构建器来完成项目的代码覆盖.我已经配置了最大错过的类/方法和最小线覆盖失败的规则,maven构建失败(下面的示例).

<rules>
    <rule>
        <element>BUNDLE</element>
        <limits>
            <limit>
                <counter>CLASS</counter>
                <value>MISSEDCOUNT</value>
                <maximum>90</maximum>
            </limit>
        </limits>
    </rule>
</rules>
Run Code Online (Sandbox Code Playgroud)

我试图找出是否存在一种机制,如果添加更多测试用例(或者使用相同的测试覆盖更多方法),这些规则会自动更新.

假设我为另外5个类添加了测试用例,最大值超出规则应该更改为85.

java junit maven jacoco

9
推荐指数
1
解决办法
463
查看次数