有没有一种“断言”覆盖工具(适用于Java)?

7
在这个问题被标记为重复之前,请仔细阅读它。;) 已经有几个关于覆盖工具等问题的提问,但这个问题与通常的问题有些不同(我希望如此)。
根据wikipedia 的说法,有几种不同类型的“覆盖”变量会影响到“覆盖”的几个不同方面。
下面是一个小例子:
public class Dummy {
    public int a = 0;
    public int b = 0;
    public int c = 0;

    public void doSomething() {
        a += 5;

        b += 5;

        c = b + 5;
    }
}

public class DummyTest {

    @Test
    public void testDoSomething() {
        Dummy dummy = new Dummy();

        dummy.doSomething();

        assertEquals( 10, dummy.c );
    }
}

正如您所看到的,测试将覆盖100%的行,对字段“c”的值的断言将覆盖该字段并间接覆盖字段“b”,但是没有对字段“a”的断言覆盖。
这意味着测试覆盖了100%的代码行,并确保c包含预期的值,很可能也包含正确的b,但是根本没有断言a,因此可能有完全错误的值。
那么...现在的问题是:是否有工具能够分析(java)代码并创建关于哪些字段/变量/任何内容未被(直接和/或间接)覆盖的报告?
(使用getter而不是公共字段时,您会发现getA()未被调用,但好吧,这不是我想听到的答案;) )

所以...你正在寻找某种工具来覆盖信息流吗?这实际上会很有用,尽管我不知道任何相关的工具。给你点赞。 - Donal Fellows
是的,因为我很懒;) 我想要一个能够提醒我,“嘿,你忘记在类YZ中测试字段XY的值了”的东西。 - Danilo Tommasina
3个回答

3
正如您所看到的,测试将覆盖100%的代码行,对字段“c”的值的断言将覆盖此字段并间接覆盖字段“b”,但是没有对字段“a”的断言覆盖。这意味着测试覆盖了100%的代码行,并确保c包含预期值,并且很可能还包含正确的b值,但是根本没有对a进行断言,它可能具有完全错误的值。
嗯,“覆盖”不幸地对不同的人意味着不同的事情...... 这个测试确实“涵盖”了100%的代码行,但并没有全部“测试”。
您要寻找的是由突变测试很好地处理的内容。
请查看使用突变测试报告代码覆盖率的Jester

如果这里有什么值得点踩的东西,我会很感激能够知道它是什么。 - Don Roby
也许你在这里有什么个人敌人吗?我没有发现任何反对的东西,所以我认为这个踩也是不公平的。我会用我的赞来弥补它。 - Ingo
投了赞成票,感谢提供这些信息,看起来已经非常有趣,并且符合我所寻找的方向。非常感谢。我仍然不会将其标记为已回答,只是想看看还会有什么其他的意见。 - Danilo Tommasina

1

“测试覆盖率”有数百种定义,其中COTS工具最多只能处理其中的一小部分(我的公司构建测试覆盖率工具,因此我们跟踪这种情况)。请参见关于测试覆盖率的讲座,了解有趣的概述。

我听说过的最接近的定义是数据覆盖率;根据您的定义 :-{ 它告诉您在执行期间每个数据项都已被写入和读取。该讲座谈到了验证特殊情况下已经执行了每个写入和每个读取。

我不知道所有数百种定义,但您可能已经发明了另一种:仅限于断言的数据覆盖率。


感谢您提供的信息,我想我的问题仍然太过模糊了...它不应该局限于“断言”,这只是我用来表示实际值与预期值进行验证的术语。该工具应该提供有关在测试中“使用”但其实际值未经验证与预期值相比较的内部状态/字段/返回值的有用信息。pppf...听起来相当复杂,希望能够理解... - Danilo Tommasina
如果您只关心测试中使用了哪些状态/字段/值,那么您需要数据覆盖率。所有的测试覆盖工具都很复杂;您需要提取有关发生情况的信息,而不会破坏代码并且不需要大量的工作。从根本上讲,您需要仪器来收集感兴趣的数据;该仪器必须成本适中,不会破坏程序功能,并且需要有东西来解释结果。不,我认为您不会找到这样的现成工具。这只是一个愿望,还是您任务的基本要求? - Ira Baxter
这只是一个愿望,当编写单元测试并检查执行代码行的覆盖率时,这个想法就出现了。在搜索了一番后,我没有找到任何与我的想法匹配的东西,所以我想知道是否已经有人完成了这项工作;) 感谢您的反馈。 - Danilo Tommasina

0

如果您正在寻找的是Java中的断言,那么确实有这个功能。

为了查看代码覆盖率,有一些工具可以使用,以下是一些示例: cobertura clover


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接