JUnit使用

二、核心——斷言

斷言是編寫測試用例的核心實現方式,即期望值是多少,測試的結果是多少,以此來判斷測試是否通過。

1. 斷言核心方法

assertArrayEquals(expecteds, actuals) 查看兩個數組是否相等。
assertEquals(expected, actual) 查看兩個對象是否相等。類似於字符串比較使用的equals()方法
assertNotEquals(first, second) 查看兩個對象是否不相等。
assertNull(object) 查看對象是否爲空。
assertNotNull(object) 查看對象是否不爲空。
assertSame(expected, actual) 查看兩個對象的引用是否相等。類似於使用“==”比較兩個對象
assertNotSame(unexpected, actual) 查看兩個對象的引用是否不相等。類似於使用“!=”比較兩個對象
assertTrue(condition) 查看運行結果是否爲true。
assertFalse(condition) 查看運行結果是否爲false。
assertThat(actual, matcher) 查看實際值是否滿足指定的條件
fail() 讓測試失敗

2. 示例

  1. package test;  
  2.   
  3. import static org.hamcrest.CoreMatchers.*;  
  4. import static org.junit.Assert.*;  
  5.   
  6. import java.util.Arrays;  
  7.   
  8. import org.hamcrest.core.CombinableMatcher;  
  9. import org.junit.Test;  
  10.   
  11. public class AssertTests {  
  12.   
  13.       @Test  
  14.       public void testAssertArrayEquals() {  
  15.         byte[] expected = "trial".getBytes();  
  16.         byte[] actual = "trial".getBytes();  
  17.         org.junit.Assert.assertArrayEquals("failure - byte arrays not same", expected, actual);  
  18.       }  
  19.   
  20.       @Test  
  21.       public void testAssertEquals() {  
  22.         org.junit.Assert.assertEquals("failure - strings not same", 5l, 5l);  
  23.       }  
  24.   
  25.       @Test  
  26.       public void testAssertFalse() {  
  27.         org.junit.Assert.assertFalse("failure - should be false"false);  
  28.       }  
  29.   
  30.       @Test  
  31.       public void testAssertNotNull() {  
  32.         org.junit.Assert.assertNotNull("should not be null"new Object());  
  33.       }  
  34.   
  35.       @Test  
  36.       public void testAssertNotSame() {  
  37.         org.junit.Assert.assertNotSame("should not be same Object"new Object(), new Object());  
  38.       }  
  39.   
  40.       @Test  
  41.       public void testAssertNull() {  
  42.         org.junit.Assert.assertNull("should be null"null);  
  43.       }  
  44.   
  45.       @Test  
  46.       public void testAssertSame() {  
  47.         Integer aNumber = Integer.valueOf(768);  
  48.         org.junit.Assert.assertSame("should be same", aNumber, aNumber);  
  49.       }  
  50.   
  51.       // JUnit Matchers assertThat  
  52.       @Test  
  53.       public void testAssertThatBothContainsString() {  
  54.         org.junit.Assert.assertThat("albumen", both(containsString("a")).and(containsString("b")));  
  55.       }  
  56.   
  57.       @Test  
  58.       public void testAssertThathasItemsContainsString() {  
  59.         org.junit.Assert.assertThat(Arrays.asList("one""two""three"), hasItems("one""three"));  
  60.       }  
  61.   
  62.       @Test  
  63.       public void testAssertThatEveryItemContainsString() {  
  64.         org.junit.Assert.assertThat(Arrays.asList(new String[] { "fun""ban""net" }), everyItem(containsString("n")));  
  65.       }  
  66.   
  67.       // Core Hamcrest Matchers with assertThat  
  68.       @Test  
  69.       public void testAssertThatHamcrestCoreMatchers() {  
  70.         assertThat("good", allOf(equalTo("good"), startsWith("good")));  
  71.         assertThat("good", not(allOf(equalTo("bad"), equalTo("good"))));  
  72.         assertThat("good", anyOf(equalTo("bad"), equalTo("good")));  
  73.         assertThat(7, not(CombinableMatcher.<Integer> either(equalTo(3)).or(equalTo(4))));  
  74.         assertThat(new Object(), not(sameInstance(new Object())));  
  75.       }  
  76. }  
package test;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import java.util.Arrays;

import org.hamcrest.core.CombinableMatcher;
import org.junit.Test;

public class AssertTests {

	  @Test
	  public void testAssertArrayEquals() {
	    byte[] expected = "trial".getBytes();
	    byte[] actual = "trial".getBytes();
	    org.junit.Assert.assertArrayEquals("failure - byte arrays not same", expected, actual);
	  }

	  @Test
	  public void testAssertEquals() {
	    org.junit.Assert.assertEquals("failure - strings not same", 5l, 5l);
	  }

	  @Test
	  public void testAssertFalse() {
	    org.junit.Assert.assertFalse("failure - should be false", false);
	  }

	  @Test
	  public void testAssertNotNull() {
	    org.junit.Assert.assertNotNull("should not be null", new Object());
	  }

	  @Test
	  public void testAssertNotSame() {
	    org.junit.Assert.assertNotSame("should not be same Object", new Object(), new Object());
	  }

	  @Test
	  public void testAssertNull() {
	    org.junit.Assert.assertNull("should be null", null);
	  }

	  @Test
	  public void testAssertSame() {
	    Integer aNumber = Integer.valueOf(768);
	    org.junit.Assert.assertSame("should be same", aNumber, aNumber);
	  }

	  // JUnit Matchers assertThat
	  @Test
	  public void testAssertThatBothContainsString() {
	    org.junit.Assert.assertThat("albumen", both(containsString("a")).and(containsString("b")));
	  }

	  @Test
	  public void testAssertThathasItemsContainsString() {
	    org.junit.Assert.assertThat(Arrays.asList("one", "two", "three"), hasItems("one", "three"));
	  }

	  @Test
	  public void testAssertThatEveryItemContainsString() {
	    org.junit.Assert.assertThat(Arrays.asList(new String[] { "fun", "ban", "net" }), everyItem(containsString("n")));
	  }

	  // Core Hamcrest Matchers with assertThat
	  @Test
	  public void testAssertThatHamcrestCoreMatchers() {
	    assertThat("good", allOf(equalTo("good"), startsWith("good")));
	    assertThat("good", not(allOf(equalTo("bad"), equalTo("good"))));
	    assertThat("good", anyOf(equalTo("bad"), equalTo("good")));
	    assertThat(7, not(CombinableMatcher.<Integer> either(equalTo(3)).or(equalTo(4))));
	    assertThat(new Object(), not(sameInstance(new Object())));
	  }
}

三、核心——註解

1. 說明

@Before 初始化方法
@After 釋放資源
@Test 測試方法,在這裏可以測試期望異常和超時時間
@Ignore 忽略的測試方法
@BeforeClass 針對所有測試,只執行一次,且必須爲static void
@AfterClass 針對所有測試,只執行一次,且必須爲static void
@RunWith 指定測試類使用某個運行器
@Parameters 指定測試類的測試數據集合
@Rule 允許靈活添加或重新定義測試類中的每個測試方法的行爲
@FixMethodOrder 指定測試方法的執行順序

2. 執行順序

一個測試類單元測試的執行順序爲:

@BeforeClass –> @Before –> @Test –> @After –> @AfterClass

每一個測試方法的調用順序爲:

@Before –> @Test –> @After

3. 示例

  1. package test;  
  2.   
  3. import static org.junit.Assert.*;  
  4.   
  5. import org.junit.*;  
  6.   
  7. public class JDemoTest {  
  8.   
  9.     @BeforeClass  
  10.     public static void setUpBeforeClass() throws Exception {  
  11.         System.out.println("in BeforeClass================");  
  12.     }  
  13.   
  14.     @AfterClass  
  15.     public static void tearDownAfterClass() throws Exception {  
  16.         System.out.println("in AfterClass=================");  
  17.     }  
  18.   
  19.     @Before  
  20.     public void before() {  
  21.         System.out.println("in Before");  
  22.     }  
  23.   
  24.     @After  
  25.     public void after() {  
  26.         System.out.println("in After");  
  27.     }  
  28.   
  29.     @Test(timeout = 10000)  
  30.     public void testadd() {  
  31.         JDemo a = new JDemo();  
  32.         assertEquals(6, a.add(33));  
  33.         System.out.println("in Test ----Add");  
  34.     }  
  35.   
  36.     @Test  
  37.     public void testdivision() {  
  38.         JDemo a = new JDemo();  
  39.         assertEquals(3, a.division(62));  
  40.         System.out.println("in Test ----Division");  
  41.     }  
  42.   
  43.     @Ignore  
  44.     @Test  
  45.     public void test_ignore() {  
  46.         JDemo a = new JDemo();  
  47.         assertEquals(6, a.add(15));  
  48.         System.out.println("in test_ignore");  
  49.     }  
  50.   
  51.     @Test  
  52.     public void teest_fail() {  
  53.         fail();  
  54.     }  
  55. }  
  56.   
  57. class JDemo extends Thread {  
  58.   
  59.     int result;  
  60.   
  61.     public int add(int a, int b) {  
  62.         try {  
  63.             sleep(1000);  
  64.             result = a + b;  
  65.         } catch (InterruptedException e) {  
  66.         }  
  67.         return result;  
  68.     }  
  69.   
  70.     public int division(int a, int b) {  
  71.         return result = a / b;  
  72.     }  
  73. }  
package test;

import static org.junit.Assert.*;

import org.junit.*;

public class JDemoTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		System.out.println("in BeforeClass================");
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
		System.out.println("in AfterClass=================");
	}

	@Before
	public void before() {
		System.out.println("in Before");
	}

	@After
	public void after() {
		System.out.println("in After");
	}

	@Test(timeout = 10000)
	public void testadd() {
		JDemo a = new JDemo();
		assertEquals(6, a.add(3, 3));
		System.out.println("in Test ----Add");
	}

	@Test
	public void testdivision() {
		JDemo a = new JDemo();
		assertEquals(3, a.division(6, 2));
		System.out.println("in Test ----Division");
	}

	@Ignore
	@Test
	public void test_ignore() {
		JDemo a = new JDemo();
		assertEquals(6, a.add(1, 5));
		System.out.println("in test_ignore");
	}

	@Test
	public void teest_fail() {
		fail();
	}
}

class JDemo extends Thread {

	int result;

	public int add(int a, int b) {
		try {
			sleep(1000);
			result = a + b;
		} catch (InterruptedException e) {
		}
		return result;
	}

	public int division(int a, int b) {
		return result = a / b;
	}
}

執行結果:

  1. in BeforeClass================  
  2. in Before  
  3. in Test ----Add  
  4. in After  
  5. in Before  
  6. in Test ----Division  
  7. in After  
  8. in AfterClass=================  
in BeforeClass================
in Before
in Test ----Add
in After
in Before
in Test ----Division
in After
in AfterClass=================

 

圖中左上紅框中部分表示Junit運行結果,5個成功(1個忽略),1個錯誤,1個失敗。(注意錯誤和失敗不是一回事,錯誤說明代碼有錯誤,而失敗表示該測試方法測試失敗)

左下紅框中則表示出了各個測試方法的運行狀態,可以看到成功、錯誤、失敗、失敗各自的圖標是不一樣的,還可以看到運行時間。

右邊部分則是異常堆棧,可查看異常信息。

 

下篇中我們給出更多示例還繼續介紹Junit

發佈了39 篇原創文章 · 獲贊 71 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章