Hamcrest 测试匹配框架
為什么要用Hamcrest匹配器框架
Hamcrest是一款軟件測試框架, 可以通過現(xiàn)有的匹配器類檢查代碼中的條件.也可以通過自定義的匹配器實現(xiàn).
要在JUnit中使用Hamcrest匹配器,可以用它的assertThat語句,并且可添加一個或多個匹配器.
Hamcrest一般被視作第三代匹配器框架.第一代使用斷言(邏輯語句),但這樣的測試不易讀.第二代測試框架引入了特殊的斷言方法,例如assertEquals().然而這種方式會導(dǎo)致編寫過多類似的斷言方法.Hamcrest采用了assertThat方法和匹配器表達式來確定測試是否成功,解決上述兩個缺點.
Hamcrest的目標(biāo)是使測試盡可能的提高可讀性.例如is()方法其實就是equalTo()的包裝方法
?
案例:
下面的代碼就是一個使用Hamcrest
package com.lulu.androidtestdemo.hamcrest; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*;/*** Created by lulu on 2018/3/17.*/ public class TestHamcrest {boolean a;boolean b;@Testpublic void testHamcrest() throws Exception {//下面語句的測試目的是一致的assertThat(a, equalTo(b));assertThat(a, is(equalTo(b)));assertThat(a, is(b));} }下面代碼比較了一下pure JUnit 4和使用Hamcrest的斷言語句.
// JUnit 4 for equals check assertEquals(expected, actual); // Hamcrest for equals check assertThat(actual, is(equalTo(expected)));// JUnit 4 for not equals check assertNotEquals(expected, actual); // Hamcrest for not equals check assertThat(actual, is(not(equalTo(expected))));也可以通過anyOf()等方法實現(xiàn)匹配器的鏈接.
assertThat("test", anyOf(is("testing"), containsString("est")));通常Hamcrest的錯誤信息也更容易閱讀.(下圖為Pure JUnit 4和Hamcrest錯誤log的對比)
assertTrue(result instanceof String); // error message: java.lang.AssertionErrorat org.junit.Assert.fail(Assert.java:86)at org.junit.Assert.assertTrue(Assert.java:41)at org.junit.Assert.assertTrue(Assert.java:52) // ...assertEquals(String.class, result.getClass()); // error message: java.lang.NullPointerExceptionat com.vogella.hamcrest.HamcrestTest.test(HamcrestTest.java:30) // ....assertThat(result, instanceOf(String.class)); // error message: java.lang.AssertionError: Expected: an instance of java.lang.Stringbut: nullat org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8) // ...添加Hamcrest依賴
<dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId><version>1.3</version><scope>test</scope></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-library</artifactId><version>1.3</version><scope>test</scope></dependency>使用Hamcrest
示例:
Hamcrest匹配器的示例如下所示
assertThat(Long.valueOf(1), instanceOf(Integer.class)); // shortcut for instanceOf assertThat(Long.valueOf(1), isA(Integer.class));靜態(tài)導(dǎo)入
使用靜態(tài)導(dǎo)入可以使得所有匹配器都可用,更方便開發(fā)人員找到合適的匹配器.
import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*;一些重要的Hamcrest匹配器
下面是一些非常重要且常用的Hamcrest匹配器
- allOf - 所有匹配條件都匹配則通過
- anyOf - 任何一個匹配條件匹配則通過
- not - 與匹配條件違背則通過
- equalTo - 使用Object.equals方法測試對象相等
- is - 與equalTo相同,僅用來提高代碼可讀性
- hasToString - 測試 Object.toString方法
- instanceOf,isCompatibleType - 測試類型
- notNullValue,nullValue - 測試null
- sameInstance - 測試是否是同一實例
- hasEntry,hasKey,hasValue - 測試一個Map包含entry,key或者value
- hasItem,hasItems - 測試一個集合包含對應(yīng)元素
- hasItemInArray - 測試一個數(shù)組包含某個元素
- closeTo - 測試浮點值接近于給定值
- greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo
- equalToIgnoringCase - 測試字符串相等且忽略大小寫
- equalToIgnoringWhiteSpace - 測試字符串相等且忽略空白符
- containsString, endsWith, startsWith - 匹配字符串
詳細請看Hamcrest API: http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html
使用Hamcrest內(nèi)置的匹配器
集合匹配器測試集合
測試目標(biāo)
假設(shè)存在下列代碼:
List<Integer> list = Arrays.asList(5, 2, 4);通過使用Hamcrest匹配器對這個list進行下列驗證:
- 大小為3
- 包含2, 4, 5三個元素,忽略順序
- 每個元素都大于1
測試代碼
@Test public void hasSizeOf3() {List<Integer> list = Arrays.asList(5, 2, 4);assertThat(list, hasSize(3)); } @Test public void containsNumbersInAnyOrder() {List<Integer> list = Arrays.asList(5, 2, 4);assertThat(list, containsInAnyOrder(2, 4, 5)); } @Test public void everyItemGreaterThan1() {List<Integer> list = Arrays.asList(5, 2, 4);assertThat(list, everyItem(greaterThan(1))); }集合匹配器驗證數(shù)組
測試目標(biāo)
假設(shè)存在下列代碼:
Integer[] ints = new Integer[] {7, 5, 12, 16};通過使用Hamcrest匹配器對這個ints數(shù)組進行下列驗證:
- 長度為4
- 以特定的順序含有7, 5, 12, 16元素
測試代碼
@Test public void arrayHasSizeOf4() {Integer[] ints = new Integer[] { 7, 5, 12, 16 };assertThat(ints, arrayWithSize(4)); } @Test public void arrayContainsNumbersInGivenOrder() {Integer[] ints = new Integer[] { 7, 5, 12, 16 };assertThat(ints, arrayContaining(7, 5, 12, 16)); }Hamcrest beans匹配器
測試目標(biāo)
假設(shè)存在下面的類:
public class Todo {private final long id;private String summary;private String description;private int year;public Todo(long id, String summary, String description) {this.id = id;this.summary = summary;this.description = description;}//getter 和 setter }通過使用Hamcrest匹配器進行下列驗證:
- Todo類含有名叫 "summary"的屬性
- 如果Todo類被創(chuàng)建時給summary屬性傳入"Learn Hamcrest", 則summary屬性會用這個值進行初始化
- 兩個對象用相同的值創(chuàng)建,會有相同的屬性值
測試代碼
@Testpublic void objectHasSummaryProperty () {Todo todo = new Todo(1, "Learn Hamcrest", "Important");assertThat(todo, hasProperty("summary"));} @Testpublic void objectHasCorrectSummaryValue () {Todo todo = new Todo(1, "Learn Hamcrest", "Important");assertThat(todo, hasProperty("summary", equalTo("Learn Hamcrest")));} @Testpublic void objectHasSameProperties () {Todo todo1 = new Todo(1, "Learn Hamcrest", "Important");Todo todo2 = new Todo(1, "Learn Hamcrest", "Important");assertThat(todo1, samePropertyValuesAs(todo2));}字符串匹配器
實現(xiàn)下列對字符串的檢查:
- ""是一個空字符串
- 一個給定的字符串不是空或者null
?
總結(jié)
以上是生活随笔為你收集整理的Hamcrest 测试匹配框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天气预报Dom解析(转)
- 下一篇: 白话地图投影之初识地球