一、什麼是JUnit
JUnit是一個Java語言的單元測試架構。單元測試是一種白盒測試,用於測試代碼的功能模組(單個功能)。
二、Intellij IDEA中安裝JUnit外掛程式
1.選擇File菜單的Settings…選項
2.選擇Settings…介面中的Plguins選項內的Browse repositories選項
3.在搜尋方塊中輸入JUnit,在下面菜單中選擇JUnit Generator V2.0安裝
(因為我已經安裝,故沒有顯示install選項)
4.安裝完成,在待測試類別中按產生方法的快速鍵ALT+INS,出現JnitTest方法。
三、使用Junit進行單元測試的方法
1.產生單元測試類
在待測試的類中使用快速鍵ALT+INS菜單中選擇JUnit Test—->JUnit4,自動產生測試類別。
解決編碼問題,點擊reload in another encoding(紅色橢圓標記處)選擇預設編碼(GBK)
解決註解無法識別問題,此時註解都為cannot resolve狀態,原因是JUnit4未加入項目的classpath,使用ALT+ENTER快速鍵將JUnit4添加到classpath即可
2.單元測試類中的方法和註解說明
·所有方法必須無傳回值(public void)且不能有參數
·@Test註解
說明此方法為單元測試方法,可以單獨執行此方法實現測試功能。
·@Before註解
運行每個單元測試方法之前執行此方法。
·@After註解
每個單元測試方法執行結束後執行此方法。
·@BeforeClass註解(方法必須為static)
在所有單元測試方法執行之前執行此方法。
·@AfterClass註解(方法必須為static)
在所有單元測試方法執行之後執行此方法。
·@Ignore註解
忽略此方法,在執行測試類別時忽略此方法(不執行)。
3.Assert(斷言)類中的方法實現自動化結果檢查
.assertEquals(expected,actual)判斷期望值與實際值是否相同
.assertNull(object)判斷是否為空白
.assertNotNull(object)判斷是否非空
.assertTrue(condition)判斷布爾值是否為真
.assertFalse(condition)判斷布爾值是否為假
四、具體的樣本
待測試的Calculator類代碼:(實現加減乘除功能)
public class Calculator { public int add(int a,int b){ return a+b; } public int sub(int a,int b){ return a-b; } public int mul(int a,int b){ return a*b; } public int div(int a,int b){ if(b==0){ throw new RuntimeException("除數不能為0"); } return a/b; }}
1.測試add方法(CalculatorTest類中)
/** * Method: add(int a, int b) */ @Testpublic void testAdd() throws Exception { int a = 5; int b = 7; int exp = 12; Assert.assertEquals(exp, new Calculator().add(a,b));}
選中testAdd方法名後滑鼠右鍵選擇Run’testAdd()’即可運行此方法,運行結果如下圖:(期望值與實際值相同,測試通過顯示為綠色;若測試不通過則顯示為紅色)
2.測試多個方法
public class CalculatorTest {@BeforeClasspublic static void beforeClass() throws Exception{ System.out.println("BeforeClass");}@AfterClasspublic static void afterClass() throws Exception{ System.out.println("AfterClass");}@Beforepublic void before() throws Exception { System.out.println("Before");}@Afterpublic void after() throws Exception { System.out.println("After");}/** * Method: add(int a, int b) */ @Testpublic void testAdd() throws Exception { //TODO: Test goes here... int a = 5; int b = 7; int exp = 12; Assert.assertEquals(exp, new Calculator().add(a,b));} /** * Method: sub(int a, int b) */ @Testpublic void testSub() throws Exception { //TODO: Test goes here... int a = 15; int b = 7; int exp = 8; Assert.assertEquals(exp, new Calculator().sub(a,b));} /** * Method: mul(int a, int b) */ @Testpublic void testMul() throws Exception { //TODO: Test goes here... int a = 5; int b = 7; int exp = 35; Assert.assertEquals(exp, new Calculator().mul(a,b));} /** * Method: div(int a, int b) */ @Testpublic void testDiv() throws Exception { //TODO: Test goes here... int a = 5; int b = 1; int exp = 5; Assert.assertEquals(exp, new Calculator().div(a,b));} }
運行測試類別結果
由結果可見進行測試的四個方法全部通過,且被BeforeClass註解的方法在最開始執行,被AfterClass註解的方法在所有測試結束時執行,被Before註解的方法在每個測試開始前執行,被After註解的方法在每個測試結束時執行。
4.測試非法資料
將testDiv方法中除數b設為非法資料0,運行結果如下
顯示testDiv未通過,拋出RuntimeException。(亂碼原因為此處選擇的編碼是GBK,使用UTF-8即可解決)
將預期異常添加到註解參數中測試:
@Test(expected = java.lang.RuntimeException.class)public void testDiv() throws Exception { //TODO: Test goes here... int a = 5; int b = 0; int exp = 5; Assert.assertEquals(exp, new Calculator().div(a,b));}
此處將預期拋出的異常添加到註解@Test的參數中,再次運行結果如下
因為錯誤資料引起的異常為預期出現的異常,故測試通過。