JUnit - 使用错误的断言

时间:2009-09-10 01:31:23

标签: unit-testing junit

我引用exubero's条目中的这篇文章。我认为这个条目将使每个正在进行单元测试的人受益:

有很多不同的方法以Junit的Assert类中定义的assert开头。这些方法中的每一种都有关于它们断言的含义略有不同的参数和语义。

以下显示了assertTrue的一些不规则用法:

assertTrue("Objects must be the same", expected == actual);
assertTrue("Objects must be equal", expected.equals(actual));
assertTrue("Object must be null", actual == null);
assertTrue("Object must not be null", actual != null);

一些单元测试专家指出,上面的代码可以更好地写成:

assertSame("Objects must be the same", expected, actual);
assertEquals("Objects must be equal", expected, actual);
assertNull("Object must be null", actual);
assertNotNull("Object must not be null", actual);

使用适当的'assertXXX()'的一个优点是可以提高单元测试的可读性。任何人都可以指出使用适当的'assertXXX()'还有什么好处?

2 个答案:

答案 0 :(得分:8)

我不是Java开发人员,我不知道断言失败时JUnit会输出什么。 我使用的许多单元测试框架在使用assertEquals这样的东西时会输出更好的错误信息。

让我告诉你一个我正在谈论的例子:

assertTrue("Objects must be equal", "One" == "Two");
assertEquals("Objects must be equal", "One", "Two");

在第一种情况下,您可以输出错误信息:

错误:预期的真实实际为假。

第二种情况的输出:

错误:执行“一个”实际是“两个”。

正如您所看到的,第二种情况提供了更有意义的信息。

答案 1 :(得分:0)

除了@Vadim上面的内容之外,使用正确的断言可以防止由测试的剪切复制粘贴创建的错误。

作为一个例子

assertTrue("Objects must not be the same", expected != actual);

然后复制并修改为

assertTrue("Objects must not be the same", newobject == actual);

当代码更改并且此测试失败时,评论会欺骗下一个开发人员以引入新错误的方式“修复”代码。

如果剪切复制粘贴代码是这样的:

assertFalse("Objects must be the same", newobject == actual);

评论,断言和测试用例的不一致性可能更明显。

是的,我已经看到了这种情况。