【问题标题】:Cobertura exclude vs ignoreCobertura 排除与忽略
【发布时间】:2025-12-23 15:00:11
【问题描述】:

我看到在 cobertura-maven-plugin 中,我可以使用 excludesignores 配置我的工具。这两者有什么区别?

【问题讨论】:

标签: cobertura


【解决方案1】:

真的很抱歉,但重复可怕的文档并没有帮助。你引用了:

您可以通过传入“忽略”正则表达式来告诉 Cobertura 忽略某些类。忽略模式可以是任何有效的 perl 5 正则表达式。这将忽略对与忽略正则表达式匹配的任何方法的任何调用。在检测期间它不会跳过这些类。要从检测中排除类,请将它们从文件集中排除或使用下面的替代方法并指定 excludeClasses 模式。

这个不一致的段落开头声明“...通过传入'ignore'正则表达式来忽略某些类。”,然后是第二句话,“这将忽略对任何与忽略正则表达式匹配的方法的任何调用。 "

嗯,那是什么? “忽略”是否忽略类或方法?命令行参考似乎暗示 ignore 正在忽略基于 RegEx 匹配的 代码(我希望这是真的):

这些解释都不适用于 maven 插件中的

通过实验我发现 是在类级别排除的方式。我还没有找到一种以小于类的粒度排除的方法。但是,他们也没有告诉您的是 需要一个相对文件系统路径,而不是 Java package.class 表达式,这意味着 需要例如one/two/three/Myclass.class,而不是“one.two.three.Myclass”。

【讨论】:

    【解决方案2】:

    忽略和排除的功能完全不同。排除将从 Cobertura 的扫描中删除文件。 Ignore 将删除一个类的所有用法对行覆盖率的贡献。

    考虑以下代码sn-p:

    public class Foo {
         public void someMethod() {
             Bar bar = new Bar();
         }
    }
    

    如果您配置 Foo.class,则整个 Foo 类将不会显示在您的报告中。

    有点令人困惑的是,如果您配置 Foo.class,那么 Foo 仍会显示在您的报告中,但在其他类中使用 Foo 将被忽略。

    如果你配置了Bar.class,那么Foo的扫描会忽略Bar初始化的那一行。

    要真正做到这一点,让我们谈谈为什么要使用忽略。假设您不想在任何类的代码覆盖率扫描中显示某个对象(例如 Logger)。忽略允许您这样做。

    【讨论】:

      【解决方案3】:

      maven 插件不包含此配置选项的任何文档(但它们包含在文档中)。 ant cobertura 文档包含以下文档:

      您可以通过传入“忽略”正则表达式来告诉 Cobertura 忽略某些类。忽略模式可以是任何有效的 perl 5 正则表达式。这将忽略对与忽略正则表达式匹配的任何方法的任何调用。在检测期间它不会跳过这些类。要从检测中排除类,请将它们从文件集中排除或使用下面的替代方法并指定 excludeClasses 模式。

      另请参阅:https://github.com/cobertura/cobertura/wiki/Ant-Task-Reference#cobertura-instrument-task

      【讨论】:

      • 正则表达式还是通配符?