junit覆盖率问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了junit覆盖率问题相关的知识,希望对你有一定的参考价值。

在用junit测试的时候,用coverage来进行覆盖率的测试,不过不知道为什么用junit的测试结果和用coverage的测试结果是不一样的。
就是用junit测试通过的项,用coverage有的却不通过。
希望用过以上两种工具的朋友给点指点,谢谢了!!
在eclipse下,写好的测试用例,点右键有通过junit运行,但是得不到覆盖率;还有一种就是通过coverage as来调用junit运行,可以得到覆盖率。但是,两种方式运行的结果却不一样,用1可以全通过,用2有的不过,这是为什么啊?

不知道你说的junit测试结果与coverage测试结果不同是什么意思,有的测试用例没有过?
coverage我没用过,我用过emma做过白盒测试,能测覆盖率,比较不错的
参考技术A 两种工具的内部结构不一样
测试工具也是有它特有的统计方法
参考技术B 能提供用2不过的测试例子吗?

如果 JUnit 覆盖率低于某个阈值,如何使 Maven 构建失败

【中文标题】如果 JUnit 覆盖率低于某个阈值,如何使 Maven 构建失败【英文标题】:How to fail a maven build, if JUnit coverage falls below certain threshold 【发布时间】:2017-06-13 00:04:37 【问题描述】:

我从 sonar rest api 获取单元测试覆盖率指标。

如果构建低于定义的值,我怎么会失败?

【问题讨论】:

如果 JUnit 提供者检测到测试错误,Maven 默认会失败。 根据项目的JUnit覆盖率构建失败。不是JUnit自行测试。 Cobertura 怎么样? 【参考方案1】:

JaCoCo 提供该功能。

带有配置规则的JaCoCo

使用配置规则 COVEREDRATIOLINEBRANCH 定义 JaCoCo 插件:

<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.7.7.201606060606</version>
  <executions>
    <execution>
      <id>default-prepare-agent</id>
      <goals>
        <goal>prepare-agent</goal>
      </goals>
    </execution>
    <execution>
      <id>check</id>
      <goals>
          <goal>check</goal>
      </goals>
      <configuration>
        <rules>
          <rule>
            <element>CLASS</element>
            <limits>
              <limit>
                <counter>LINE</counter>
                <value>COVEREDRATIO</value>
                <minimum>0.80</minimum>
              </limit>
              <limit>
                <counter>BRANCH</counter>
                <value>COVEREDRATIO</value>
                <minimum>0.80</minimum>
              </limit>
            </limits>
            <excludes>
              <exclude>com.xyz.ClassToExclude</exclude>
            </excludes>
          </rule>
        </rules>
      </configuration>
    </execution>
  </executions>
</plugin>

多种选择

支持的counter 选项有:

LINE 分行 说明 复杂性 方法 类

我相信INSTRUCTION 将允许您进行一般检查(例如,验证整个项目至少有 0.80 的覆盖率)。

Example with INSTRUCTION - overall instruction coverage of 80%

此示例需要 80% 的总体指令覆盖率,并且没有 必须错过课程:

<rules>
  <rule implementation="org.jacoco.maven.RuleConfiguration">
    <element>BUNDLE</element>
    <limits>
      <limit implementation="org.jacoco.report.check.Limit">
        <counter>INSTRUCTION</counter>
        <value>COVEREDRATIO</value>
        <minimum>0.80</minimum>
      </limit>
      <limit implementation="org.jacoco.report.check.Limit">
        <counter>CLASS</counter>
        <value>MISSEDCOUNT</value>
        <maximum>0</maximum>
      </limit>
    </limits>
  </rule>
</rules>

失败消息

如果覆盖范围不符合预期,则会失败并显示以下消息:

[WARNING] Rule violated for class com.sampleapp.SpringConfiguration: lines covered ratio is 0.00, but expected minimum is 0.80
[WARNING] Rule violated for class com.sampleapp.Launcher: lines covered ratio is 0.33, but expected minimum is 0.80
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

排除

在上面的例子中,我设置了&lt;exclude&gt;com.xyz.ClassToExclude&lt;/exclude&gt;。我想你会发现你需要添加许多排除项。项目通常包含许多不可测试/测试的类(Spring 配置、Java bean ...)。你也可以使用正则表达式。


来源:

http://choudhury.com/blog/2014/02/25/enforcing-minimum-code-coverage http://www.eclemma.org/jacoco/trunk/doc/maven.html http://www.eclemma.org/jacoco/trunk/doc/check-mojo.html

【讨论】:

我已经编辑了,我相信您也可以使用 INSTRUCTION(而不是 LINE 或 BRANCH)对项目进行一般检查(例如验证整个项目至少有 0.80 的覆盖率) 使用mvn clean verify来执行它【参考方案2】:

如果您使用的是 0.8.2 或类似版本的 jacoco-maven-plugin,请确保定义了数据文件,并为插件使用以下配置。

<execution>
  <id>jacoco-check</id>
  <goals>
    <goal>check</goal>
  </goals>
  <configuration>
    <dataFile>$project.build.directory/coverage-reports/jacoco.exec</dataFile>
    <rules>
      <rule>
        <element>BUNDLE</element>
        <limits>
          <limit>
            <counter>INSTRUCTION</counter>
            <value>COVEREDRATIO</value>
            <minimum>0.17</minimum>
          </limit>
        </limits>
      </rule>
    </rules>
  </configuration>
</execution>

此代码确保 17% 的整体覆盖率。

请使用验证

mvn clean 验证

命令。

【讨论】:

【参考方案3】:
Specify the datFile location if it is not under default folder.

<execution>
                <id>check</id>
                <goals>
                    <goal>check</goal>
                </goals>
                <configuration>
                  <dataFile><path-to-jacoc-ut.exec></dataFile>
                 <rules><rule>
                 <element>CLASS</element>
                 <limits>
                  <limit>
                    <counter>LINE</counter>
                    <value>COVEREDRATIO</value>
                    <minimum>0.80</minimum>
                  </limit>
                  <limit>
                    <counter>BRANCH</counter>
                    <value>COVEREDRATIO</value>
                    <minimum>0.80</minimum>
                  </limit>
                </limits>
                <excludes>
                   <exclude>com.xyz.ClassToExclude</exclude>
                </excludes>
              </rule></rules></configuration>
            </execution>

【讨论】:

一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。

以上是关于junit覆盖率问题的主要内容,如果未能解决你的问题,请参考以下文章

如何通过非 maven 项目的声纳的 junit 测试来测量代码覆盖率

JUnit 覆盖无法访问的代码

java中springboot集成junit编写单元测试(实战+坑)

spring && Cobertura && maven &&junit 单元测试以及测试覆盖率

JUNIT测试通过,但是hansel测试覆盖率的时候报错了,报错信息如下 求支援

JUnit在eclipse中有方便功能完整的统计覆盖率的功能吗