【问题标题】:Cobertura coverage and the assert keywordCobertura 覆盖范围和 assert 关键字
【发布时间】:2011-06-27 02:21:50
【问题描述】:

Cobertura 测量的单元测试的行覆盖率受到影响,因为我有 assert 未在测试中覆盖的语句。我应该测试assertions,有什么方法可以让 Cobertura 忽略它们,这样它们就不会影响我的测试覆盖率?

【问题讨论】:

标签: java unit-testing code-coverage assertions cobertura


【解决方案1】:

已经为 Cobertura 记录了一个 feature request (1959691) 以添加忽略断言行的功能;如果您认为这是一个好主意,请随时观看,以防他们实施并向页面添加评论。遗憾的是,还没有开源覆盖工具支持这一点,因为我绝对认为断言语句是一个好主意,但测试它们通常是不切实际的/不可能的。

【讨论】:

    【解决方案2】:

    Java assert 语句的 覆盖范围应该通过运行启用断言的测试套件来简单地覆盖,即将 -ea 作为 jvm 的参数。 如果您这样做,您将看到 cobertura 轻松报告 100% line 覆盖率(如果您的其余线路也被覆盖)。

    尽管如此,assert 行仍将显示为红色,表明覆盖范围不足。 这是因为你的断言通常总是正确的,所以你永远不会碰到错误的分支。

    因此,使用 assert 会破坏 Cobertura 中的 branch 覆盖率,因为断言行将具有 50% 的分支覆盖率,从而导致整体分支覆盖率难以解释(或无用)。

    Clover 有一个很好的功能,可以在计算覆盖率时忽略assert。我还没有在任何开源 Java 覆盖工具中看到此功能。

    如果您以design-by-contract 样式使用断言,则无需添加使Java assert 语句失败的测试。事实上, 对于许多断言(例如,不变量、后置条件),您甚至无法创建会使它们失败的对象,因此 不可能 编写这样的测试。 但是,您可以做的是使用不变量/后置条件来导出测试用例,以行使它们的边界——请参阅 Robert Binder 的invariant boundaries 模式。但这不会使您的断言失败。

    只有当您对给定方法有一个非常棘手的前提条件时,您才可能需要考虑编写一个旨在使前提条件失败的测试。但是,重新考虑您的先决条件可能是一个更好的主意。

    【讨论】:

      【解决方案3】:

      代码覆盖率是一种可以让您改进测试的工具,它并不是测试有效性的某种证明。您可以通过实现 100% 的代码覆盖率、查看未覆盖的内容并思考如何改进测试来从中获得价值。

      发现存在未覆盖的断言语句只是一个示例,您应该调用:“好的,不需要覆盖这个”。一个类似的例子是跟踪宏和调试代码,它们添加了从未被覆盖的隐藏“if 语句”。

      我猜你不喜欢你的答案的地方是你喜欢对你的代码有一个最小的代码覆盖率要求;我的一些项目也遇到了同样的问题。如果一个必须不丢失覆盖数据,一种解决方案是“覆盖构建”,其中有问题的语句(断言、跟踪等)被替换为空语句(比如通过宏或链接器魔术) .但我相信这通常是一个更好的权衡,只是接受不完美的覆盖。

      祝你好运。

      【讨论】:

        【解决方案4】:

        大概您正在使用断言来验证先决条件或其他一些条件。考虑一下你的情况是否和Argument Exceptions should be Unit Tested类似。

        无论如何,我希望您最终会尝试确定是否应该测试这些语句的否定路径分支。

        是的,一定要测试一下。您的断言本身就是关于您的假设的逻辑,测试您的保护语句是否可以防止/保护您认为它们会发生的情况是一件好事。

        【讨论】:

        • +1:同意,尽管我会将否定路径的单元测试放在“低优先级”级别的断言上,因为如果出现问题,它们有更高的自我发现机会,并且它们提供很多本地化信息。 OTOH,如果您的代码覆盖率因断言而受到影响,那么您可能已经遇到了简单的问题!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-11
        • 2018-10-14
        • 2011-04-02
        • 2021-06-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多