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). 

外部連結