为什么assertEquals(a,b)而不是assert(a == b)?

时间:2012-07-09 06:45:21

标签: unit-testing

为什么大多数(所有?)单元测试框架都有大型API,其中包含用于指定不同类型的布尔条件的单独函数(例如assertEqualsassertNotEqual等),而不是使用单个{{1}具有所需布尔表达式的函数(或语言构造)?

3 个答案:

答案 0 :(得分:5)

一个简单的assert只会抛出AssertionError,说明断言的条件被评估为false:

assert "foo".equals("boo")

java.lang.AssertionError: assertion failed

(更不用说assert string1 == string2由于参考比较而不正确)

通过传递ab,库可以将它们包含在错误消息中。在这里:FEST assertions

assertThat("foo").isEqualTo("boo");

//throws:
Exception in thread "main" org.junit.ComparisonFailure:
expected:<'[b]oo'> but was:<'[f]oo'>

请注意,某些语言更强大:

在Groovy中(例如:Groovy 1.7 Power Assert):

a = 10
b = 9

assert 91 == a * b

的产率:

Assertion failed: 

assert 91 == a * b
          |  | | |
          |  10| 9
          |    90
          false

    at ConsoleScript2.run(ConsoleScript2:4)

在Scala(ScalaTest)中有一个特殊的===运算符:

assert(1 === 2)

收益1 did not equal 2

答案 1 :(得分:3)

我可以想到两个原因:

  1. 这是更具说服力的
  2. 它允许库自动提供更详细的断言失败消息。
  3. 声明意味着说你希望它做什么,而不是如何你想要它完成。

    在讨论像对象平等一样受支持的东西时,差别很小,但考虑比较两个集合。你可能有assertIsSubsetOfassertAreSameIncludingOrderassertAreSameButOrderIsIrrelevant - 我更愿意阅读这些英文名称,而不是长篇,涉及且容易混淆的实现。

答案 2 :(得分:1)

我曾经质疑这一点,直到我意识到。如果您将这两个值放入API中,那么该函数可以报告&#39;值&#39;不要断言。而不是他们不匹配的事实

  blat blah blah 99并不等于10003 等等等等等等等等

其中为您提供了测试结果中有关错误问题的线索。计算机可以给予的任何帮助都是受欢迎的,并且完全符合极端测试的精神。