使用 Cobertura 从代码覆盖中排除方法

Posted

技术标签:

【中文标题】使用 Cobertura 从代码覆盖中排除方法【英文标题】:Exclude methods from code coverage with Cobertura 【发布时间】:2010-10-31 09:30:10 【问题描述】:

有没有办法将代码排除在 Cobertura 覆盖率报告中?我们有一些方法不应包含在覆盖率报告中,因此不会降低覆盖率。

我知道 Clover 有这样的功能,但我没有找到 Cobertura 的类似功能。

【问题讨论】:

希望它很快就会到来。问题:sourceforge.net/tracker/… 和有关包含此sourceforge.net/mailarchive/… 的版本的对话 见this post,这是用声纳和詹金斯排除cobertura代码的选项,但我希望它的答案可以适用于非詹金斯项目 【参考方案1】:

您可以从检测中排除类。然后它们不应该出现在报告中。请参阅下面的排除语句。

您也可以忽略对某些方法的调用。请参阅下面的 ignore 语句。

如果您使用的是 maven,请参阅 maven plugin manual。

    <configuration>
      <instrumentation>
        <ignores>
          <ignore>com.example.boringcode.*</ignore>
        </ignores>
        <excludes>
          <exclude>com/example/dullcode/**/*.class</exclude>
          <exclude>com/example/**/*Test.class</exclude>
        </excludes>
      </instrumentation>
    </configuration>

对于蚂蚁,请参阅this。

<cobertura-instrument todir="$instrumented.dir">
  <ignore regex="org.apache.log4j.*" />
  <fileset dir="$classes.dir">
    <include name="**/*.class" />
    <exclude name="**/*Test.class" />
  </fileset>
  <fileset dir="$jars.dir">
    <include name="my-simple-plugin.jar" />
  </fileset>
</cobertura-instrument>

【讨论】:

谢谢。有什么可以添加到代码中以排除方法的吗?比 ANT 中的一长串列表更容易。任何注释支持? 我对 Cobertura 文档进行了非常快速的搜索,但找不到关于 Cobertura 注释的任何信息。因此,您似乎需要处理单元测试或包结构以使您的排除列表更短;) 好的,这证实了我没有错过任何东西。希望有一个隐藏的功能......好吧,也许我们迟早会得到一个。谢谢! 在任何地方,有没有关于如何设置正则表达式的参考??基本上,任何关于不同正则表达式如何表现的参考 有人确认插件上的说明是否真的有效吗?我尝试了几种不同的设置,但无法让排除项正常工作。【参考方案2】:

这已经让我头疼了一段时间了。

我的问题是我在报告部分而不是构建部分中设置了 cobertura maven 插件。

如果您不在构建部分进行设置,则不会应用检测设置,因此排除类或包,因此请注意这一点。

【讨论】:

这是正确答案!我也很想把它放在 Maven 3.0.4 pom 的 部分。 你能举个例子吗?【参考方案3】:

记得也要排除内部类。

<exclude>path/to/class/MyClass*.class</exclude>

我花了很长时间才注意到我错过了一个星号!

【讨论】:

发现这是最有用的答案!显然,点之前的星星对于这个工作是必不可少的。谢谢!【参考方案4】:

Cobertura 目前不提供这样的功能,Emma(我们使用的)也没有,尽管它被列为即将推出的增强功能 - 尽管我相信它是以排除规则的扩展形式而不是作为注释的形式。

将那些难以接近的角落干净地掩盖起来会很方便,这样您就可以在不荒谬的情况下争取 100%。

我认为注释可能是一种更友好的方式,但它们应该被相当明确地命名并基于可接受的场景列表,因为我担心像“@ExcludeFromCoverage”这样的东西会被慷慨地添加。

【讨论】:

-1 因为写“cobertura 目前不提供这样的功能”是不正确的。根据接受的答案,确实如此。 @Jason,看看我的回答,也许你犯了和我一样的错误。 实际上问题是关于排除方法,而不是类,这个答案是正确的,现在不可能。 编辑了问题标题以避免混淆。顺便说一句,这个答案是正确的,正如@MateuszChromiński 所说【参考方案5】:

从 2.0 开始,您可以编写自己的 @CoverageIgnore 注释。

它将被 Cobertura 识别,这将避免考虑带注释的方法(据我所知不适用于类)。

    创建一个空注释:
public @interface CoverageIgnore 
    然后注释要从报告中排除的方法:
public class SomeClass 
    @CoverageIgnore
    public void foo(String baz) 
        // useless stuff
    

来源:https://github.com/cobertura/cobertura/wiki/Coverage-Annotations

【讨论】:

缺少一个关键部分:将注释添加到 cobertura-instrument 任务:

以上是关于使用 Cobertura 从代码覆盖中排除方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用来自 Hudson 的 Maven 生成 Cobertura 代码覆盖率报告

cobertura代码测试覆盖率使用案例

SONAR - 使用 Cobertura 测量代码覆盖率

从 gradle 向配置了 cobertura 的 sonarqube 报告覆盖率

配置 Angular 9 e2e cobertura 覆盖率报告的正确方法是啥?

实践Jenkins集成Cobertura自动化构建SpringBoot工程