为什么大多数(全部?)单元测试框架都有大型 API 和单独的函数来指定不同类型的布尔条件(例如assertEquals
,assertNotEqual
等),而不是使用assert
具有所需布尔表达式的单个函数(或语言构造)?
3 回答
一个简单的assert
只会抛出AssertionError
声明断言的条件评估为假:
assert "foo".equals("boo")
java.lang.AssertionError: assertion failed
(更不用说assert string1 == string2
由于参考比较不正确)
通过传递两者a
,b
库可以将它们包含在错误消息中。这里: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
。
我可以想到两个原因:
- 它更具声明性
- 它允许库自动提供更详细的断言失败消息。
声明式的意思是说你想让它做什么,而不是你想让它怎么做。
在谈论对象相等等得到很好支持的东西时,差异很小,但请考虑比较两个集合。你可以有assertIsSubsetOf
, assertAreSameIncludingOrder
, assertAreSameButOrderIsIrrelevant
- 我宁愿阅读这些英文名称,也不愿阅读它们冗长、复杂且容易搞砸的实现。
我曾经质疑这一点,直到我意识到。如果您将这两个值放入 API,则该函数可以报告未断言的“值”。而不是他们不匹配你得到的事实
blah blah blah 99 不等于 10003 blah blah blah
其中在测试结果中为您提供了错误问题的线索。计算机可以提供的任何帮助都是受欢迎的,并且完全符合极端测试的精神。