Java Cobertura覆盖率和assert关键字

Java Cobertura覆盖率和assert关键字,java,unit-testing,code-coverage,assertions,cobertura,Java,Unit Testing,Code Coverage,Assertions,Cobertura,我对Cobertura度量的单元测试的行覆盖率受到了影响,因为我有assert语句,这些语句在测试中没有涉及。我是否应该测试断言,有没有办法让Cobertura忽略它们,这样它们就不会影响我的测试覆盖率?假设您使用断言来验证前置条件或其他条件集。考虑你的情况是否类似于 在任何情况下,我希望您最终会尝试确定是否应该测试这些语句的负路径分支 是的,一定要测试一下。您的断言本身就是关于您的假设的逻辑,测试您的guard语句是否阻止/保护您认为它们所做的场景是一件好事。代码覆盖率是一种允许您改进测试的工

我对Cobertura度量的单元测试的行覆盖率受到了影响,因为我有
assert
语句,这些语句在测试中没有涉及。我是否应该测试断言,有没有办法让Cobertura忽略它们,这样它们就不会影响我的测试覆盖率?

假设您使用断言来验证前置条件或其他条件集。考虑你的情况是否类似于

在任何情况下,我希望您最终会尝试确定是否应该测试这些语句的负路径分支


是的,一定要测试一下。您的断言本身就是关于您的假设的逻辑,测试您的guard语句是否阻止/保护您认为它们所做的场景是一件好事。

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

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

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

祝您好运。

您的Java
assert
语句的行覆盖率应该通过在启用断言的情况下运行测试套件来实现,即,将-ea作为jvm的参数。 如果您这样做,您将看到,如果您的其他行也被覆盖,那么cobertura很容易报告100%的覆盖率

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

因此,使用
assert
,Cobertura中的分支覆盖率会被弄乱,因为assert行将有50%的分支覆盖率,使得整个分支覆盖率很难解释(或无用)

在计算覆盖率时可以忽略
assert
。我还没有在任何开源Java覆盖工具中看到这个特性

如果您以某种风格使用断言,则无需添加使Java
assert
语句失败的测试。事实上,事实上, 对于许多断言(例如不变量、后置条件),您甚至无法创建会使它们失败的对象,因此不可能编写此类测试。 不过,您可以使用不变量/后置条件来派生测试用例,并使用它们的边界——请参见Robert Binder的模式。但这不会让你的断言失败


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

Cobertura已经有了一个日志,可以添加忽略断言行的功能;如果你认为这是一个好主意,请随意观看,以防他们实施,并在页面上添加评论。遗憾的是,现在还没有开源覆盖工具支持这一点,因为我肯定认为断言语句是个好主意,但是测试它们通常是不实际/不可能的

+1:同意,尽管我会在“低优先级”级别对断言进行负面路径的单元测试,因为如果出现问题,它们有更高的自我发现机会,并且它们提供了大量本地化信息。OTOH,如果您的代码覆盖率由于断言而受到影响,那么您可能已经遇到了简单的问题!这个问题与这个问题有关。