在項目中,咱們常常會使用到JUnit單元測試,那麼咱們今天就來看看JUnit到底有那些用法;java
1, 說到JUnit首先要了解一下它的母親--xUnit, xUnit是一套基於測試驅動開發的測試框架,派生出許多子類框架,有專門測試C++的 CppUnit,Python的PythonUnit和咱們專門測試JAVA的JUnit;數據庫
注意 : 測試用例不是用來證實你是對的,而是證實你沒有錯!數組
2, 測試框架的做用: 框架
(1), 幫助咱們對編寫的程序進行有目的的測試;性能
(2), 幫助咱們最大限度的避免代碼中的BUG,並使程序達到預期效果;單元測試
3, 書寫規範: 測試
(1), 測試方法上必須使用 @Test 進行修飾;ui
(2), 測試方法必須使用 public void 進行修飾,而且不能帶任何參數;this
(3), 新建一個源碼目錄(test)來存放測試代碼;spa
(4), 測試類的包名必須與被測試的包名相同;
(5), 測試單元中的每一個方法必須能夠獨立測試,測試方法間不能有任何依賴;
(6), 測試類使用 Test 做爲類名的前綴;
(7), 測試方法使用 test 做爲方法名的後綴;
4, 測試失敗的兩種狀況;
(1), 測試失敗: Failure 通常有單元測試使用的斷言方法判斷失敗所引發的,它表示測試點發現了問題,就是說程序輸出的結果和咱們預期的結果不一樣;
(2), 測試錯誤: Errors 由代碼異常引發的,它能夠產生於測試代碼自己的錯誤,也能夠是測試代碼中被隱藏的BUG;
注意 : 測試用例不是用來證實你是對的,而是證實你沒有錯!
5, JUnit4的運行流程:
package test; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; public class MyJUnitTest1 { @BeforeClass public static void setUpBeforeClass() throws Exception { System.out.println("this is @BeforeClass"); } @AfterClass public static void tearDownAfterClass() throws Exception { System.out.println("this is @AfterClass"); } @Before public void setUp() throws Exception { System.out.println("this is @Before"); } @After public void tearDown() throws Exception { System.out.println("this is @After"); } @Test public void test() { System.out.println("this is @Test"); } @Test public void test2() { System.out.println("this is @Test2"); } /** * 運行結果 : * this is @BeforeClass 全部方法以前運行; * this is @Before 每一個方法以前運行; this is @Test this is @After 每一個方法以後運行; this is @Before this is @Test2 this is @After this is @AfterClass 全部方法以後運行; * * */ }
(1), @BeforeClass 修飾的方法會在該測試類的全部方法調用以前調用,並且該方法是靜態的,因此當測試類被加載後,接着就會運行它,並且內存中它只會存在一份實例, 比較適合加載配置文件;
(2), @AfterClass 所修飾的方法一般用來對資源的釋放,如關閉數據庫的鏈接,在全部方法以後調用;
(3), @Before 每一個方法以前調用;
(4), @After 每一個方法以後調用;
6: 經常使用註解:
package test; import static org.junit.Assert.*; import org.junit.Ignore; import org.junit.Test; public class MyJUnitTest2 { private int add(int a, int b){ return a+b; } @Test(expected=AssertionError.class) public void test() { //JUnit4中的斷言方法: assertEquals(3,add(6,2)); } @Test(timeout=1000) public void test1() { while(true){ System.out.println("Hello world"); } } @Ignore @Test public void test2() { while(true){ assertEquals(3,add(6,2)); } } /** * 除了以前的註解外,還有: * 1: @Test(expected=AssertionError.class) 預測會拋出 AssertionError.class 異常 * * 2: @Test(timeout=毫秒) 控制測試時間,防止死循環,能夠性能測試; * * 3: @Ignore 所修飾的測試用例會被運行器自動忽略; * * 4: @RunWith 更改測試運行器; * */ }
7, JUnit4 測試套件:
package test; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({MyTest.class,MyTest2.class,MyJUnitTest1.class}) public class MyJUnitSuiteTest { } /** * 測試套件: 就是組織測試測試類一塊兒運行,方便咱們批量測試; * 測試套件入口類,必須爲空類; * @RunWith(Suite.class) : 更改測試運行器爲Suite.class; * @SuiteClasses({MyTest.class,MyTest2.class,MyTest1.class}) : 放入須要測試的測試類數組 * * */
8, JUnit4 參數化設置:
package test; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Collection; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; /** *@description TODO 參數化設置測試類 *@date 2018/1/7 *@author geYang **/ @RunWith(Parameterized.class) public class MyJUnitParamTest { /** * 1, 更改默認的運行測試器爲 @RunWith(Parameterized.class); * 2, 聲明變量存放預期值和結果值, * 3, 聲明一個返回值爲 Collection 的公共靜態方法,而且使用 @Parameters 修飾; * 4, 建立帶參構造器,爲聲明的變量賦值; * */ private int expected = 0; private int param1 = 0; private int param2 = 0; @Parameters public static Collection<Object[]> t(){ return Arrays.asList(new Object[][]{ {3,2,1}, {4,2,2}, {6,3,3} }); } public MyJUnitParamTest(int expected, int param1, int param2) { this.expected = expected; this.param1 = param1; this.param2 = param2; } private int add(int a,int b){ return a+b; } @Test public void test() { assertEquals(expected, add(param1,param2)); } }
有了這麼多的註解和方法,相信在之後的項目開發過程當中,能夠更容易的書寫測試用例.