Cobertura覆盖和断言关键字

时间:2011-02-14 17:50:25

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

我对Cobertura测量的单元测试的线路覆盖范围正在受到影响,因为我有assert个语句未在测试中涵盖。我应该测试assert离子吗?有没有办法让Cobertura忽略它们,这样它们不会影响我的测试覆盖率?

4 个答案:

答案 0 :(得分:6)

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

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

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

在计算覆盖率时,

Clover有一个很好的功能可以忽略assert。我没有在任何开源Java覆盖工具中看到过这个功能。

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

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

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

祝你好运。

答案 3 :(得分:2)

据推测,您正在使用断言来验证前置条件或其他一些条件。请考虑您的情况是否与Argument Exceptions should be Unit Tested类似。

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

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