Cobertura覆盖和断言关键字

我对Cobertura测量的unit testing的线路覆盖范围很痛苦,因为我有assert声明未在测试中涵盖。 我应该测试assert离子,有没有办法让Cobertura忽略它们,这样它们不会影响我的测试覆盖率?

应该通过运行启用了断言的测试套件来简单地覆盖Java assert语句的覆盖,即将-ea作为jvm的参数。 如果你这样做,你会发现cobertura很容易报告100%的线路覆盖率,如果其他线路也被覆盖。

尽管如此, assert线仍将显示为红色,表明覆盖范围不足。 这是因为你的断言通常都是正确的,因此你永远不会遇到假分支。

因此,Cobertura中的分支覆盖率通过使用assert变得混乱,因为断言行将具有50%的分支覆盖率,使得整个分支覆盖百分比难以解释(或无用)。

Clover有一个很好的function, assert在计算覆盖范围时忽略assert 。 我没有在任何开源Java覆盖工具中看到这个function。

如果以逐个合约的方式使用断言,则无需添加使Java assert语句失败的测试。 事实上,对于许多断言(例如,不变量,后置条件),您甚至无法创建会使其失败的对象,因此无法编写此类测试。 但是,您可以使用不变量/后置条件来导出行使其边界的测试用例 – 请参阅Robert Binder的不变边界模式。 但这不会使你的断言失败。

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

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

代码覆盖率是一种允许您改进测试的工具,它不是测试有效性的某种certificate。 您可以从中获得100%的代码覆盖率,查看未涵盖的内容,并思考如何改进测试。

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

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

祝你好运。

据推测,您正在使用断言来validation前置条件或其他一些条件。 考虑您的情况是否类似于Argument Exceptions应该是Unit Tested 。

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

是的,无论如何,测试那些。 你的断言本身就是关于你的假设的逻辑,测试你的守护声明是否会阻止/保护你认为他们所做的场景是一件好事。