2011-05-11 79 views
7

在此问题被标记为重复之前,请阅读它。 ;) 已经有几个关于覆盖工具的问题,但是这与通常的有点不同(我希望)。是否有某种'断言'覆盖工具(用于Java)?

根据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)代码并创建一个关于哪些字段/变量/没有被直接和/或间接地由断言覆盖的报告?

(使用干将,而不是公共领域时,你会看到木屐()不叫,但嗯,这不是我想听到的答案确定;))

+0

所以...你正在寻找某种工具做全面的资料流?这实际上是有用的,虽然我不知道任何副手。有+1。 – 2011-05-11 08:34:55

+0

是的,因为我很懒惰;)我想要一些说我的东西,嘿,你忘了在YZ类中测试字段XY的值。 – 2011-05-11 08:52:58

回答

2

正如你可以看到,该测试将具有100%的线的覆盖范围,在字段“C”的值的断言将覆盖本领域和间接地也覆盖场“b”,然而,在'a'领域没有断言。这意味着测试覆盖了100%的代码行,并确保c包含期望值,并且很可能b也包含正确的值,但a完全没有被声明,并且可能是完全错误的值。

嗯,“盖”不幸的是意味着不同的事情不同的人......这的确测试练习的代码行 100%,但它并不测试他们。

您要找的是mutation testing

看看Jester,它使用变异测试来报告代码覆盖率。

+0

如果有什么值得赞扬的话,我会很高兴知道它是什么。 – 2011-05-11 13:33:16

+0

也许你在这里有任何个人的敌人?我没有发现任何反对意见,所以我认为downvote也是不公平的。我会用我的一个赞成票来做到这一点。 – Ingo 2011-05-11 14:09:22

+0

投了票,谢谢你的信息,这看起来已经很有趣了,并且进入了我所寻找的方向。非常感谢。我仍然不会将它标记为答案,只是为了看看还有什么输入。 – 2011-05-12 06:17:08

0

请经过下面这个链接

Compatibility Test Tools

+0

mmh,感谢您的链接。如果我理解正确,规范trac工具将检查'单元测试'经过了多少'JDK断言'的'覆盖'。然而,我的问题是,如果有一种工具可以帮助查找某些在测试期间被修改的字段是否缺少断言。 – 2011-05-11 08:32:17

1

“测试范围”有数百个定义,其中COTS工具最多只能处理很少的几个。 (我的公司构建测试覆盖工具,以便跟踪这种事情)。请参阅this lecture on test coverage以获得有趣的概述。

我听到的最接近的定义是数据覆盖;取决于你的定义: - {它告诉你每个数据项在执行期间已经被写入和读取。讲座谈到验证写和阅读已被行使作为一种特殊情况。

我不知道数百个定义的核心,但你可能已经发明了一个:数据覆盖限于断言。

+0

感谢您提供的信息丰富的输入,我想我的问题仍然太模糊......它不应该局限于“断言”,它是我的术语说实际值是根据预期值进行验证的。该工具应提供有用的信息,说明在测试中“使用”过的内部状态/字段/返回值,但其实际值未根据预期值进行验证。 pppf ...听起来相当复杂,希望这是可以理解的...... – 2011-05-12 06:29:07

+0

如果您只关心在测试中“使用”了哪些状态/字段/值,那么您需要数据覆盖。 ...所有的测试覆盖工具都很复杂;你想提取关于发生的事情的信息而不会破坏代码并且没有很多工作。基本上你需要仪器来收集感兴趣的数据;这种分解必须是适度的运行成本,而不是破坏程序功能,而且必须解释结果。不,我不认为你会找到这样一个现成的工具。这只是一个愿望,或者是您的任务的基本要求? – 2011-05-12 17:05:27

+0

这是一个愿望,这个想法是在编写单元测试并根据已执行的代码行检查其覆盖范围时产生的。找了一下后,我没有发现任何与我的想法相符的东西,我只是想知道是否有人已经完成了这项工作;)感谢您的反馈。 – 2011-05-13 07:22:15

0

在Java中有Assertions如果这是你在找什么。

,看看有多少代码已经覆盖有,您可以使用此工具是一些例子: cobertura clover