JUnit - 概述
所謂單元測試是測試應用程序的功能是否能夠按需要正常運行,並且確保是在開發人員的水平上,單元測試生成圖片。單元測試是一個對單一實體(類或方法)的測試。單元測試是每個軟件公司提高產品質量、滿足客戶需求的重要環節。
JUnit 是一個 Java 編程語言的單元測試框架。JUnit 在測試驅動的開發方面有很重要的發展,是起源於 JUnit 的一個統稱為 xUnit 的單元測試框架之一。
JUnit 促進了“先測試后編碼”的理念,強調建立測試數據的一段代碼,可以先測試,然后再應用。這個方法就好比“測試一點,編碼一點,測試一點,編碼一點……”,增加了程序員的產量和程序的穩定性,可以減少程序員的壓力和花費在排錯上的時間。
特點:
- JUnit 是一個開放的資源框架,用於編寫和運行測試。
- 提供注釋來識別測試方法。
- 提供斷言來測試預期結果。
- 提供測試運行來運行測試。
- JUnit 測試允許你編寫代碼更快,並能提高質量。
- JUnit 優雅簡潔。沒那么復雜,花費時間較少。
- JUnit 測試可以自動運行並且檢查自身結果並提供即時反饋。所以也沒有必要人工梳理測試結果的報告。
- JUnit 測試可以被組織為測試套件,包含測試用例,甚至其他的測試套件。
- JUnit 在一個條中顯示進度。如果運行良好則是綠色;如果運行失敗,則變成紅色。
測試用例:
1.新建NumberMethods類,里面寫好方法:
package demo; /**類描述: *@author: zk *@date: 日期:2018-6-6 時間:下午4:16:49 *@version 1.0 */ public class NumberMethods { public int getCount(int i,int j){ return i+j; } public int getSuntract(int i,int j){ return i-j; } public float getDivision(int i,int j){ return i/j; } public float getPlus(int i,int j){ return i*j; } }
2.新建NumberTest測試類,用於測試:
新建操作如下
正在測試的類 打自己的類名
選擇下一步,選中類中要測試的方法
然后會生成每個方法的默認測試方法,里面默認寫了一個類似報錯的方法fail(),重寫每個方法:
package demo; import static org.junit.Assert.*; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; /**類描述: *@author: zk *@date: 日期:2018-6-6 時間:下午4:21:31 *@version 1.0 */ public class NumberTest { static NumberMethods num=null; @BeforeClass public static void initclass(){ System.out.println("@BeforeClass"); num=new NumberMethods(); } @AfterClass public static void afterclass(){ System.out.println("@AfterClass"); num=new NumberMethods(); } @Before public void init(){ System.out.println("@Before"); } @After public void after(){ System.out.println("@After"); } @Test public void testGetCount() { NumberMethods number=new NumberMethods(); int a=number.getCount(2, 4); assertEquals("計算錯誤", 6, a); System.out.println("測試加法通過"); } @Test public void testGetSuntract() { System.out.println("測試減法通過"); } @Test public void testGetDivision() { System.out.println("測試除法通過"); } @Test public void testGetPlus() { System.out.println("測試乘法通過"); } }
鼠標右鍵>運行方式>junit測試
@BeforeClass用於初始化,只執行一次,由於其是在jvm還沒加載類之前執行,所以初始化的資源必須為靜態。
@AfterClass用於類后執行,只執行一次。
@Before每個方法之前執行
@After每個方法之后執行
測試套件:
在實際項目中,隨着項目進度的開展,單元測試類會越來越多,可是直到現在我們還只會一個一個的單獨運行測試類,這在實際項目實踐中肯定是不可行的。為了解決這個問題,JUnit 提供了一種批量運行測試類的方法,叫做測試套件。
這樣,每次需要驗證系統功能正確性時,只執行一個或幾個測試套件便可以了。測試套件的寫法非常簡單,我們需要遵循以下規則:
1. 創建一個空類作為測試套件的入口。
2. 使用注解 org.junit.runner.RunWith 和 org.junit.runners.Suite.SuiteClasses 修飾這個空類。
3. 將 org.junit.runners.Suite 作為參數傳入注解 RunWith,以提示 JUnit 為此類使用套件運行器執行。
4. 將需要放入此測試套件的測試類組成數組作為注解 SuiteClasses 的參數。
5. 保證這個空類使用 public 修飾,而且存在公開的不帶有任何參數的構造函數。
新建JunitTestOne測試類:
package test; import org.junit.Assert; import org.junit.Test; /**類描述: *@author: zk *@date: 日期:2018-6-6 時間:下午3:56:17 *@version 1.0 */ public class JunitTestOne { @Test public void test() { System.out.println("測試一。。。"); Assert.assertTrue(true); } }
新建JunitTestTwo測試類:
package test; import org.junit.Assert; import org.junit.Test; /**類描述: *@author: zk *@date: 日期:2018-6-6 時間:下午3:58:56 *@version 1.0 */ public class JunitTestTwo { @Test public void test() { System.out.println("測試二。。。"); Assert.assertTrue(true); } }
新建測試套件類:
package test; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; /**類描述: *@author: zk *@date: 日期:2018-6-6 時間:下午4:00:06 *@version 1.0 */ @RunWith(Suite.class) @SuiteClasses({ JunitTestOne.class,JunitTestTwo.class }) public class AllTests { }
測試通過,控制台輸出:
上例代碼中,我將2個測試類放入了測試套件AllTests中,在 Eclipse 中運行測試套件,可以看到2個測試類被調用執行了。測試套件中不僅可以包含基本的測試類,而且可以包含其它的測試套件,這樣可以很方便的分層管理不同模塊的單元測試代碼。
注意:一定要保證測試套件之間沒有循環包含關系,否則無盡的循環就會出現在我們的面前。
下面寫一個例子
新建AllTestsTwo測試類,包含測試類JunitTestOne、JunitTestTwo、AllTests:
package test; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; /**類描述: *@author: zk *@date: 日期:2018-6-6 時間:下午4:07:08 *@version 1.0 */ @RunWith(Suite.class) @SuiteClasses({ AllTests.class, JunitTestOne.class, JunitTestTwo.class }) public class AllTestsTwo { }
再給AllTests測試類@SuiteClasses中添加AllTestsTwo:
package test; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; /**類描述: *@author: zk *@date: 日期:2018-6-6 時間:下午4:00:06 *@version 1.0 */ @RunWith(Suite.class) @SuiteClasses({ AllTestsTwo.class, JunitTestOne.class,JunitTestTwo.class }) public class AllTests { }
然后執行AllTests的junit測試:
報錯,原因就是AllTests測試的AllTestsTwo包含對AllTests的測試。