Cobertura 测量的单元测试的行覆盖率受到影响,因为我有assert
测试未涵盖的语句。我应该测试assert
离子吗?有什么方法可以让 Cobertura 忽略它们,这样它们就不会影响我的测试覆盖率?
4 回答
Java语句的行assert
覆盖率应该简单地通过运行启用断言的测试套件来覆盖,即将 -ea 作为 jvm 的参数。如果你这样做,你会看到 cobertura 很容易报告 100%的线路覆盖率,如果你的其余线路也被覆盖。
尽管如此,这些assert
线条仍将显示为红色,表明覆盖范围不足。这是因为你的断言通常总是正确的,所以你永远不会碰到错误的分支。
因此, Cobertura 中的分支覆盖率被使用搞砸了assert
,因为 assert 行将有 50% 的分支覆盖率,使得整体分支覆盖率难以解释(或无用)。
Cloverassert
在计算覆盖率时有一个很好的特性可以忽略。我还没有在任何开源 Java 覆盖工具中看到此功能。
如果您以按合同设计的方式使用断言,则无需添加使 Javaassert
语句失败的测试。事实上,对于许多断言(例如,不变量、后置条件),您甚至无法创建会使它们失败的对象,因此不可能编写这样的测试。但是,您可以做的是使用不变量/后置条件来派生行使边界的测试用例——请参阅 Robert Binder 的不变量边界模式。但这不会使您的断言失败。
仅当您对给定方法有一个非常棘手的先决条件时,您可能需要考虑编写一个旨在使先决条件失败的测试。但是,重新考虑您的先决条件可能是一个更好的主意。
已经为 Cobertura 记录了一个功能请求 (1959691),以添加忽略断言行的功能;如果您认为这是一个好主意,请随时观看,以防他们实施并向页面添加评论。遗憾的是,还没有开源覆盖工具支持这一点,因为我绝对认为断言语句是一个好主意,但测试它们通常是不切实际的/不可能的。
代码覆盖率是一种可以让您改进测试的工具,它并不是测试有效性的某种证明。您可以通过实现 100% 的代码覆盖率、查看未覆盖的内容并思考如何改进测试来从中获得价值。
发现存在未覆盖的断言语句只是一个示例,您应该调用:“好的,无需覆盖这个”。一个类似的例子是跟踪宏和调试代码,它添加了从未被覆盖的隐藏“if 语句”。
我猜你不喜欢你的答案是你喜欢对你的代码有一个最小的代码覆盖率要求;我的一些项目也遇到了同样的问题。如果不能丢失覆盖数据,一种解决方案是“覆盖构建”,其中有问题的语句(断言、跟踪等)被替换为空语句(比如通过宏或链接器魔术)。但我相信这通常是一个更好的权衡,只是接受不完美的覆盖。
祝你好运。
大概您正在使用断言来验证先决条件或其他一些条件。考虑您的情况是否类似于Argument Exceptions should be Unit Tested。
无论如何,我希望您最终会尝试确定是否应该测试这些语句的负路径分支。
是的,无论如何,测试这些。您的断言本身就是关于您的假设的逻辑,测试您的保护语句是否可以防止/保护您认为它们会发生的情况是一件好事。