SpringBoot(20)---斷言(Assert)

  咱們在寫單元測試的時候,除了接口直接拋異常而致使該單元測試失敗外,還有種是業務上的錯誤也表明着該單元測試失敗。比如咱們在測試接口的時候,java

  該接口返回是1表明成功,若是是0那就表明是失敗的,這個時候能夠考慮使用斷言。git

  1、原理咱們知道,咱們能夠經過斷言來校驗測試用例的返回值和實際指望值進行比較,以此來判斷測試是否經過。那咱們先來看下若是失敗的狀況下它的流程是怎麼樣的。github

  對於斷言而言,若是是錯誤最終都會進入下面的方法數組

  static public void fail(String message) {less

  if (message == null) {單元測試

  throw new AssertionError();測試

  }spa

  throw new AssertionError(message);.net

  }rest

  很明顯,這裏有一個AssertionError對象,咱們來看下這個對象。

  public class AssertionError extends Error {

  //......

  }

  咱們很明顯看到,它實繼承是Error,而不是Exception。這說明什麼,說明你沒法經過try catch去捕獲這個異常,只要進入斷言fail中,必定會拋出異常。

  2、Assert 源碼這裏只展現Assert源碼中經常使用的方法,一些不經常使用或者過時的方法這裏就不展現了。

  public class Assert {

  /**

  * 結果 = 預期 則正確

  */

  static public void assertEquals(Object expected, Object actual)

  /**

  * 結果 != 預期 則正確

  */

  static public void assertNotEquals(Object unexpected, Object actual)

  /**

  * condition == true 則正確

  */

  static public void assertTrue(boolean condition)

  /**

  * condition == false 則正確

  */

  static public void assertFalse(boolean condition)

  /**

  * 永遠是錯誤

  */

  static public void fail()

  /**

  * 結果不爲空 則正確

  */

  static public void assertNotNull(Object object)

  /**

  * 結果爲空 則正確

  */

  static public void assertNull(Object object)

  /**

  * 兩個對象引用 相等 則正確(上面至關於equels 這裏相似於使用「==」比較兩個對象)

  */

  static public void assertSame(Object expected, Object actual)

  /**

  * 兩個對象引用 不相等 則正確

  */

  static public void assertNotSame(Object unexpected, Object actual)

  /**

  * 兩個數組相等 則正確

  */

  public static void assertArrayEquals(Object[] expecteds, Object[] actuals)

  /**

  * 這個單獨介紹

  */

  public static void assertThat(T actual, Matcher matcher)

  }

  注意 上面每個方法,都會有一個多一個參數的方法,這個參數爲:String message。意思就是錯誤的狀況下,咱們能夠輸出咱們自定義的message

  示例

  //這個就表示 結果 != 預期 的狀況下,拋出的AssertionError 信息是咱們指定的message

  static public void assertEquals(String message,Object expected, Object actual)

  上面還有一個方法須要單獨介紹,那就是assertThat方法。

  3、assertThat方法你們習慣把assertThat理解成新斷言,由於上面因此的功能方法,均可以經過assertThat這一個方法來實現。

  一、基本語法

  assertThat 的基本語法以下:

  assertThat( [value], [matcher statement] );

  value 是接口返回信息中,咱們想要測試的變量值

  matcher statement: 是使用Hamcrest匹配符來表達的對前面變量所指望的值的聲明,若是value值與matcher statement所表達的指望值相符,則測試成功,不然測試失敗。

  二、基本使用

  字符串匹配符 String n = "xiao";

  // containsString:字符串變量中包含指定字符串時,測試經過

  assertThat(n, containsString("xiao"));

  // startsWith:字符串變量以指定字符串開頭時,測試經過

  assertThat(n, startsWith("xi"));

  // endsWith:字符串變量以指定字符串結尾時,測試經過

  assertThat(n, endsWith("ao"));

  // euqalTo:字符串變量等於指定字符串時,測試經過

  assertThat(n, equalTo("xiao"));

  // equalToIgnoringCase:字符串變量在忽略大小寫的狀況下等於指定字符串時,測試經過

  assertThat(n, equalToIgnoringCase("xiao"));

  // equalToIgnoringWhiteSpace:字符串變量在忽略頭尾任意空格的狀況下等於指定字符串時,測試經過

  assertThat(n, equalToIgnoringWhiteSpace(" xiao "));

  int匹配符int s = 1;

  // allOf:全部條件必須都成立,測試才經過(大於1同時小於3)

  assertThat(s, allOf(greaterThan(1), lessThan(3)));

  // anyOf:只要有一個條件成立,測試就經過 (大於1或者小於2)

  assertThat(s, anyOf(greaterThan(1), lessThan(2)));

  // anything:不管什麼條件,測試都經過

  assertThat(s, anything());

  // is:變量的值等於指定值時,測試經過

  assertThat(s, is(2));

  // not:和is相反,變量的值不等於指定值時,測試經過

  assertThat(s, not(1));

  double匹配符double d = 1D;

  // closeTo:浮點型變量的值在3.0±0.5範圍內,測試經過

  assertThat(d, closeTo(3.0, 0.5));

  // greaterThan:變量的值大於指定值時,測試經過

  assertThat(d, greaterThan(3.0));

  // lessThan:變量的值小於指定值時,測試經過

  assertThat(d, lessThan(3.5));

  // greaterThanOrEuqalTo:變量的值大於等於指定值時,測試經過

  assertThat(d, greaterThanOrEqualTo(3.3));

  // lessThanOrEqualTo:變量的值小於等於指定值時,測試經過

  assertThat(d, lessThanOrEqualTo(3.4));

  集合匹配符List list = new ArrayList();

  // hasItem:Iterable變量中含有指定元素時,測試經過

  assertThat(list, hasItem("xiao"));

  Map m = new HashMap<>();

  // hasEntry:Map變量中含有指定鍵值對時,測試經過

  assertThat(m, hasEntry("xi", "xiao"));

  // hasKey:Map變量中含有指定key時,測試經過

  assertThat(m, hasKey("x"));

  // hasValue:Map變量中含有指定value值時,測試經過

  assertThat(m, hasValue("x"));

  4、測試這裏對於老斷言,和新斷言各測試5個。

  一、老斷言

  示例public class TestServiceImplTest {

  @Test

  public void test1() {

  String str = "xiao";

  assertEquals(str, "xiaoniao");//不相等,因此錯誤

  }

  @Test

  public void test2() {

  assertFalse(Boolean.TRUE); //不是false,因此錯誤

  }

  @Test

  public void test3() {

  fail("直接是錯誤"); //直接是錯誤

  }

  @Test

  public void test4() {

  assertNull("xiao"); //不爲空因此爲錯誤

  }

  @Test

  public void test5() {

  assertNotNull("xiao");//不爲空,因此爲正確

  }

  }

  這裏應該只有第5個測試用例經過,前面4個都不經過的,咱們在來看實際運行結果

  

 

  與實際相符,前面4個,測試用例不經過。並且能夠看到第3個是咱們自定義錯誤信息,在控制檯也打印出來了。

  二、新斷言

  示例import org.assertj.core.util.Lists;

  import org.junit.Test;

  import java.util.HashMap;

  import java.util.List;

  import java.util.Map;

  import static org.hamcrest.CoreMatchers.anyOf;

  import static org.hamcrest.Matchers.*;

  import static org.hamcrest.core.Is.is;

  import static org.junit.Assert.assertThat;

  public class TestServiceImplTest {

  @Test

  public void test1() {

  String str = "xiao";

  assertThat("這兩字符串不相等",str, is("xiaoniao"));//不相等,因此錯誤

  }

  @Test

  public void test2() {

  int s = 1;

  assertThat(s, anyOf(greaterThan(1), lessThan(2)));//知足 大於1或者小於2 因此正確

  }

  @Test

  public void test3() {

  double d = 1D;

  assertThat(d, allOf(greaterThanOrEqualTo(1D),lessThan(2D)));//知足大於等於1 而且 小於2 因此正確

  }

  @Test

  public void test4() {  鄭州作無痛人流多少錢http://www.zzchfk.com/

  List list = Lists.newArrayList("xiao","zhong","da");

  assertThat(list, hasItem("xiao")); //包含xiao 因此正確

  }

  @Test

  public void test5() {

  Map map = new HashMap<>();

  map.put("xiao", "xiao");

  assertThat(map, hasKey("xiao")); //該map包含該key,因此正確  鄭州無痛人流醫院哪家好:http://www.zztjyyxb.com/

  }

  }

  這裏應該只有第1個測試用例不經過,其它都是經過的,咱們在來看實際運行結果

  

 

  符合預期。

  好了,整篇文章到這裏就結束了,下面把該項目的具體代碼放到github上。

相關文章
相關標籤/搜索