Hamcrest是一个协助编写用Java语言进行软件测试的框架。它支持创建自定义的断言匹配器(assertion matchers)(名称“Hamcrest”即为“matchers”的异位构词),允许声明式定义匹配规则。[1]这些匹配器在单元测试框架(例如JUnit[2]和jMock)中有用。

Hamcrest已经被移植到JavaC++Objective-CPythonActionScript 3[3]PHP[4]JavaScript[5]Erlang.[6]

解释

“第一代”的单元测试框架提供了一个断言表达式,允许一个一个测试在特定条件下断言必须为真。如果断言为假,则测试失败。例如:

assert(x == y);

但是在这种语法下,如果“x”和“y”的是不相等的,产生错误资讯不够好——如果错误消息中显示“x”和“y”的值就更好了。 为了解决这个问题,“第二代”单元测试框架提供了一组断言语句,从而产生更好的错误消息。例如,

assert_equal(x, y);
assert_not_equal(x, y);

但是,由于上述断言语句被扩展以支持不同于简单的相等比较的比较方式,这导致了断言宏的数量爆炸。因此,“第三代”单元测试框架使用函数库,如Hamcrest,来支持“assert_that”操作符,操作符可与匹配器(matcher)对象进行组合,从而致使语法像这样:

assert_that(x, equal_to(y))
assert_that(x, is_not(equal_to(y)))

好处是,当断言失败时你仍然可以顺畅的得到错误消息,不过现在你有了更大的可扩展性。现在可以自定义一种操作,采取匹配器作为参数并将返回结果,即形成一种可以从少量原始的匹配器生成大量可能的匹配表达式的语法。

这些高级匹配器的操作包括逻辑连接词(“与”、“或”、“非”),以及遍历集合的操作。这形成了功能强大的匹配器语言,它允许对集合进行复杂的断言判断,表达式写在一个声明中,而不是一个程序中。

参考文献

  1. ^ The Hamcrest Tutorial. [2014-07-15]. (原始内容存档于2014-07-29). 
  2. ^ JUnit 4.5 is released. [2014-07-15]. (原始内容存档于2012-10-14). 
  3. ^ Hamcrest-AS3. [2014-07-15]. (原始内容存档于2016-02-19). 
  4. ^ Hamcrest - Google Code. [2014-07-15]. (原始内容存档于2009-02-25). 
  5. ^ Hamcrest4Qunit. [2014-07-15]. (原始内容存档于2018-06-11). 
  6. ^ Hamcrest Erlang. [2014-07-15]. (原始内容存档于2013-12-26). 

外部链接