日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hamcrest 测试匹配框架

發布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hamcrest 测试匹配框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么要用Hamcrest匹配器框架

Hamcrest是一款軟件測試框架, 可以通過現有的匹配器類檢查代碼中的條件.也可以通過自定義的匹配器實現.

要在JUnit中使用Hamcrest匹配器,可以用它的assertThat語句,并且可添加一個或多個匹配器.

Hamcrest一般被視作第三代匹配器框架.第一代使用斷言(邏輯語句),但這樣的測試不易讀.第二代測試框架引入了特殊的斷言方法,例如assertEquals().然而這種方式會導致編寫過多類似的斷言方法.Hamcrest采用了assertThat方法和匹配器表達式來確定測試是否成功,解決上述兩個缺點.

Hamcrest的目標是使測試盡可能的提高可讀性.例如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()等方法實現匹配器的鏈接.

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

靜態導入

使用靜態導入可以使得所有匹配器都可用,更方便開發人員找到合適的匹配器.

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 - 測試一個集合包含對應元素
  • hasItemInArray - 測試一個數組包含某個元素
  • closeTo - 測試浮點值接近于給定值
  • greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo
  • equalToIgnoringCase - 測試字符串相等且忽略大小寫
  • equalToIgnoringWhiteSpace - 測試字符串相等且忽略空白符
  • containsString, endsWith, startsWith - 匹配字符串

詳細請看Hamcrest API: http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html

使用Hamcrest內置的匹配器

集合匹配器測試集合

測試目標

假設存在下列代碼:

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))); }

集合匹配器驗證數組

測試目標

假設存在下列代碼:

Integer[] ints = new Integer[] {7, 5, 12, 16};

通過使用Hamcrest匹配器對這個ints數組進行下列驗證:

  • 長度為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匹配器

測試目標

假設存在下面的類:

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類被創建時給summary屬性傳入"Learn Hamcrest", 則summary屬性會用這個值進行初始化
  • 兩個對象用相同的值創建,會有相同的屬性值

測試代碼

@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));}

字符串匹配器

實現下列對字符串的檢查:

  • ""是一個空字符串
  • 一個給定的字符串不是空或者null
@Testpublic void isStringEmpty() {String stringToTest = "";assertThat(stringToTest, isEmptyString());} @Testpublic void isStringEmptyOfNull() {String stringToTest = "";assertThat(stringToTest, isEmptyOrNullString());}

?

總結

以上是生活随笔為你收集整理的Hamcrest 测试匹配框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。