在java中,單元測試是指類的測試,重點是測試類中的方法是否按照設計的邏輯運行。一個測試用例主要有如下步驟:java
測試大概能夠分爲兩類:無依賴和有依賴的。無依賴,是指要測試類再也不依賴其餘本身要編寫的類,主要是工具類。能夠直接使用Junit測試。有依賴,是指存在調用關係,例如Service層調用DAO。對於這種測試,須要進行隔離,就是說當前只測試Service層,那麼默認爲DAO層是能夠正常工做的,對於DAO層的方法須要進行模擬。通常用的框架有Mocktio、EasyMock、PowerMock。 框架
Junit是用於編寫單元測試的框架。對於已經寫好的函數,可使用Junit生成單元測試代碼。ide
本身的環境是:Linux函數
Java環境是:JDK1.7工具
IDE:Eclipse Java EE IDE for Web Developers.Version: Mars.2 Release (4.5.2) Build id: 20160218-0600性能
使用步驟單元測試
1、新建項目,命名爲JUnit_Test,編寫了一個用於計算的類:Calcutor,代碼中故意留下一些問題,便於測試。代碼以下:測試
1 package com.test.unit; 2 3 public class Calculator{ 4 5 // 加法 6 public int add(int a, int b){ 7 return a + b; 8 } 9 10 // 減法 11 public int substract(int a, int b){ 12 return a + b; // Bug: 正確的應該是a-b 13 } 14 15 // 乘法 16 public int multiply(int a, int b) { 17 try{ 18 Thread.sleep(300);//用於性能測試 19 }catch (InterruptedException e){ 20 // TODO Auto-generated catch block 21 e.printStackTrace(); 22 } 23 return a * b; 24 } 25 26 // 除法 27 public int divide(int a, int b) throws ArithmeticException{ 28 if (b == 0){ 29 throw new ArithmeticException(); 30 } 31 return a / b; 32 } 33 34 // 平方根 35 public void squareRoot(int n) { 36 for (;;) 37 ; // Bug : 死循環 38 } 39 }
2、引入Junit庫。選中項目,右鍵——Build Path——Add Libraries,選擇JUnit,引入的包以下:ui
3、生成測試類。選中 Calcutor.java,右鍵——New——JUnit Test Casespa
選擇setUp,再下一步,選擇要進行測試的方法,及生成了選擇的函數的測試用例,再根據須要本身編寫代碼。
主要測試類型有三種:
(1)常規的計算測試。調用函數計算值,輸入本身指望的值,以及出錯信息。若是調用函數計算的值與本身指望的值不相等,則拋出出錯信息。
(2)用於性能測試。要讓一個方法,200毫秒裏運行完,若是這個方法200毫秒不能運行完,那麼這個方法就應該拋出異常。
(3)異常測試。期待拋出異常,若是沒有拋出異常,則報錯。
測試代碼以下:
1 package com.test.unit; 2 3 import static org.junit.Assert.*; 4 5 import org.junit.Before; 6 import org.junit.Test; 7 8 public class CalculatorTest{ 9 10 Calculator cal; 11 12 //每一個方法執行前會執行 13 @Before 14 public void setUp() throws Exception{ 15 cal = new Calculator(); 16 } 17 18 //測試方法,以test開始 19 @SuppressWarnings("deprecation") 20 @Test 21 public void testAdd(){ 22 int rel = cal.add(10, 5);//調用函數計算的值 23 assertEquals("加法有問題", 15, rel);//傳入計算的值,本身指望的值,出錯信息 24 } 25 26 @Test 27 public void testSubstract(){ 28 int rel = cal.substract(20, 5); 29 assertEquals("減法有問題", 16, rel); 30 } 31 32 // 用於性能測試 33 // 要讓一個方法,200毫秒裏運行完,若是這個方法200毫秒不能運行完,那麼這個方法就應該拋出異常 34 @Test(timeout = 200) 35 public void testMultiply(){ 36 int rel = cal.multiply(2, 4); 37 assertEquals("乘法有問題", 8, rel); 38 } 39 40 //異常測試 41 @Test(expected = ArithmeticException.class) 42 public void testDivide(){ 43 int rel = cal.divide(10, 0); 44 assertEquals("除法有問題", 5, rel); 45 } 46 47 }
4、完成測試代碼的編寫後,包管理器中選中CalculatorTest,右鍵——Run as——JUnit Test,進行測試,測試結果以下:
根據報錯信息再修改本身的代碼。
其餘註解
@Ignore:忽略的測試方法,標註的含義就是「某些方法還沒有完成,咱不參與這次測試」;這樣的話測試結果就會提示你有幾個測試被忽略,而不是失敗。一旦你完成了相應的函數,只須要把 @Ignore 註解刪除便可,就能夠進行正常測試了。固然,這個 @Ignore 註解對於像我這樣有「強迫症」的人仍是大有意義的。每當看到紅色條(測試失敗)的時候就會全身不舒服,感受沒法忍受(除非要測試的目的就是讓它失敗)。固然,對代碼也是同樣,沒法忍受那些雜亂不堪的代碼。
@BeforeClass:針對全部測試,也就是整個測試類中,在全部測試方法執行前,都會先執行由它註解的方法,並且只執行一次。固然,須要注意的是,修飾符必須是 public static void xxxx ;此 Annotation 是 JUnit 4 新增的功能。
@AfterClass:針對全部測試,也就是整個測試類中,在全部測試方法都執行完以後,纔會執行由它註解的方法,並且只執行一次。固然,須要注意的是,修飾符也必須是 public static void xxxx ;此 Annotation 也是 JUnit 4 新增的功能,與 @BeforeClass 是一對。