1. 引言
JUnit4提供的新斷言語(yǔ)法具有很多優(yōu)點(diǎn)且使用簡(jiǎn)單,這已經(jīng)不再是新鮮事了,可發(fā)現(xiàn)在實(shí)際測(cè)試代碼中仍未被普及應(yīng)用,特發(fā)此文,以期更多的人能掌握運(yùn)用。
2. assertThat基本語(yǔ)法
Hamcrest 是一個(gè)測(cè)試輔助工具,提供了一套通用的匹配符 Matcher,靈活使用這些匹配符定義的規(guī)則,程序員可以更加精確的表達(dá)自己的測(cè)試思想,指定所想設(shè)定的測(cè)試條件。
Junit4結(jié)合Hamcrest提供了新的斷言語(yǔ)句-assertThat,只需一個(gè)assertThat語(yǔ)句,結(jié)合Hamcrest提供的匹配符,可以表達(dá)全部的測(cè)試思想。
assertThat的基本語(yǔ)法如下:
assertThat(T actual, Matcher matcher)
assertThat(String reason, T actual, Matcher matcher)
actual 是接下來(lái)想要驗(yàn)證的值;
matcher是使用 Hamcrest 匹配符來(lái)表達(dá)的對(duì)前面變量所期望的值的聲明,如果 actual值與 matcher 所表達(dá)的期望值相符,則斷言成功,否則斷言失敗。
reason是自定義的斷言失敗時(shí)顯示的信息。
一個(gè)簡(jiǎn)單的例子:
// 如果測(cè)試的字符串testedString包含子字符串"taobao"則斷言成功
assertThat( testedString, containsString( "taobao" ) );
3. assertThat優(yōu)點(diǎn)
統(tǒng)一
只需一條assertThat語(yǔ)句即可替代舊有的其他語(yǔ)句(如assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull等),使斷言變得簡(jiǎn)單、代碼風(fēng)格統(tǒng)一,增強(qiáng)測(cè)試代碼的可讀性和可維護(hù)性。
語(yǔ)法直觀(guān)易懂
assertThat 不再像 assertEquals 那樣,使用比較難懂的“謂賓主”語(yǔ)法模式(如:assertEquals(3, x);)。相反,assertThat 使用了類(lèi)似于“主謂賓”的易讀語(yǔ)法模式(如:assertThat(x,is(3));),使得代碼更加直觀(guān)、易讀,符合人類(lèi)思維習(xí)慣。
錯(cuò)誤信息更具描述性
舊的斷言語(yǔ)法如果斷言失敗,默認(rèn)不會(huì)有額外的提示信息,如
assertTrue(testedString.indexOf(“taobao”) > -1);
如果該斷言失敗,只會(huì)拋出無(wú)用的錯(cuò)誤信息,如java.lang.AssertionError: ,除此之外不會(huì)有更多的提示信息。
新的斷言語(yǔ)法會(huì)默認(rèn)自動(dòng)提供一些可讀的描述信息,如
assertThat(testedString, containsString(“taobao”));
如果該斷言失敗,拋出的錯(cuò)誤提示信息如下:
java.lang.AssertionError:
Expected: a string containing “taobao”
got: “taoba”
跟Matcher匹配符聯(lián)合使用更靈活強(qiáng)大
Matcher提供了功能豐富的匹配符,assertThat結(jié)合這些匹配符使用可更靈活更準(zhǔn)確的表達(dá)測(cè)試思想。
// 驗(yàn)證字符串 s是否含有子字符串 "taobao" 或 "qa" 中間的一個(gè)
// 舊的斷言,不直觀(guān),需要分析代碼邏輯明白驗(yàn)證意圖
assertTrue(s.indexOf("taobao")>-1||s.indexOf("qa")>-1);
// 新的斷言,直觀(guān)易懂,準(zhǔn)確表達(dá)測(cè)試思想
assertThat(s,anyOf(containsString("taobao"),containsString("qa")));
// anyOf滿(mǎn)足條件之一即成立,containsString包含字符串則成立
4. assertThat使用
要想發(fā)揮assetThat的威力,必須跟Hamcrest聯(lián)合使用,JUnit4本身包含了一些自帶了一些 Hamcrest 的匹配符 Matcher,但是只有有限的幾個(gè)。因此建議你將Hamcrest包加入項(xiàng)目。
在pom里加入Hamcrest依賴(lài)。
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.1</version>
</dependency>
在測(cè)試類(lèi)里導(dǎo)入包
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
通過(guò)例子學(xué)習(xí)是有效的學(xué)習(xí)方式之一,下面通過(guò)常用的示例演示如何使用assertThat,更詳細(xì)的用法請(qǐng)參考Hamcrest相關(guān)文檔。
字符相關(guān)匹配符