我对Cobertura进行的单元测试的测试覆盖面很痛苦,因为我有assert
语句,这些语句未在测试中覆盖。我应该测试assert
ionic 吗?有什么方法可以让Cobertura忽略它们,以免它们影响我的测试范围?
最佳答案
应该通过在启用了断言的情况下运行测试套件来简单地覆盖Java assert
语句的行范围,即,将-ea作为jvm的参数。
如果执行此操作,您将看到cobertura轻松报告100%行覆盖率(如果其余行也都包含在内)。
但是,assert
行仍将显示为红色,表明覆盖范围不足。
这是因为您的断言通常总是正确的,因此您永远都不会打假分支。
因此,在Cobertura中使用assert
弄乱了分支覆盖范围,因为断言行将具有50%的分支覆盖范围,从而使整个分支覆盖范围的百分比难以解释(或无用)。
Clover具有一个不错的功能,可以在计算覆盖率时忽略assert
。我没有在任何开源Java覆盖工具中看到此功能。
如果您使用design-by-contract风格的断言,则无需添加使Java assert
语句失败的测试。事实上,
对于许多断言(例如不变式,后置条件),您甚至无法创建会使它们失败的对象,因此无法编写此类测试。
但是,您可以做的是使用不变式/后置条件来推导行使其边界的测试用例-参见Robert Binder的invariant boundaries模式。但这不会使您的断言失败。
仅当您对给定方法有非常棘手的前提条件时,才可能要考虑编写一个旨在使前提条件失败的测试。但是,重新考虑您的前提条件可能是一个更好的主意。