3

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

4

3 回答 3

8

一个简单的assert只会抛出AssertionError声明断言的条件评估为假:

assert "foo".equals("boo")

java.lang.AssertionError: assertion failed

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

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

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

于 2012-07-09T06:50:44.817 回答
3

我可以想到两个原因:

  1. 它更具声明性
  2. 它允许库自动提供更详细的断言失败消息。

声明式的意思是说想让它做什么,而不是你想让它怎么做。

在谈论对象相等等得到很好支持的东西时,差异很小,但请考虑比较两个集合。你可以有assertIsSubsetOf, assertAreSameIncludingOrder, assertAreSameButOrderIsIrrelevant- 我宁愿阅读这些英文名称,也不愿阅读它们冗长、复杂且容易搞砸的实现。

于 2012-07-09T06:49:04.010 回答
1

我曾经质疑这一点,直到我意识到。如果您将这两个值放入 API,则该函数可以报告未断言的“值”。而不是他们不匹配你得到的事实

blah blah blah 99 不等于 10003 blah blah blah

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

于 2012-07-09T06:51:32.203 回答