【问题标题】:Is there some kind of 'assertion' coverage tool (for Java)?是否有某种“断言”覆盖工具(用于 Java)?
【发布时间】:2011-05-11 07:43:13
【问题描述】:

在此问题被标记为重复之前,请阅读它。 ;) 已经有几个关于覆盖工具等的问题,但这与通常的问题有点不同(我希望如此)。

根据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”,但是对字段没有断言覆盖'一种'。 这意味着测试覆盖了 100% 的代码行,并确保 c 包含预期值,并且很可能 b 也包含正确的值,但是根本没有断言 a 并且可能是完全错误的值。

所以......现在的问题是:是否有一种工具能够分析(java)代码并创建一个关于哪些字段/变量/任何内容没有(直接和/或间接)被断言覆盖的报告?

(好的,当使用 getter 而不是公共字段时,您会看到 getA() 没有被调用,但这不是我想听到的答案;))

【问题讨论】:

  • 那么……您正在寻找某种工具来覆盖信息流?这实际上是有用的,虽然我不知道任何副手。有一个 +1。
  • 是的,因为我很懒 ;) 我想要一些对我说的话,嘿,你忘了测试 YZ 类中字段 XY 的值。

标签: java code-coverage


【解决方案1】:

如您所见,测试将覆盖 100% 的行,对字段“c”值的断言将覆盖该字段并间接覆盖字段“b”,但是没有对字段的断言覆盖'一种'。这意味着测试覆盖了 100% 的代码行,并确保 c 包含预期值,并且很可能 b 也包含正确的值,但是根本没有断言 a 并且可能是完全错误的值。

好吧,不幸的是,“封面”对不同的人意味着不同的东西......这个测试确实练习 100% 的代码行,但它并没有测试所有代码行.

mutation testing 很好地处理了您要查找的内容。

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

【讨论】:

  • 如果这里有什么值得一票的,我会很高兴知道它是什么。
  • 也许你这里有什么私人敌人?我没有发现任何反对意见,所以我认为反对票也是不公平的。我会用我的赞成票让它变得更好。
  • 投了赞成票,感谢您提供的信息,这看起来已经非常有趣,并且朝着我正在寻找的方向发展。非常感谢。我仍然不会将其标记为已回答,只是为了看看还会有什么输入。
【解决方案2】:

“测试覆盖率”有数百种定义,COTS 工具最多只能处理其中的一小部分。 (我的公司构建了测试覆盖工具,所以我们跟踪这种事情)。有关有趣的概述,请参阅 this lecture on test coverage

我听到的最接近的定义是数据覆盖率;根据您的定义:-{ 它告诉您每个数据项在执行期间已被写入和读取。该讲座讨论了验证 every 写入和 every 已作为特例进行。

我不知道数百个定义,但您可能还发明了一个:数据覆盖仅限于断言。

【讨论】:

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

如果您正在寻找的话,Java 中有 Assertions

要查看覆盖了多少代码,您可以使用一些工具,这里有一些示例: cobertura clover

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2015-02-08
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多