JUnit是用于編寫可重復(fù)測試的單元測試框架,可實現(xiàn)自動化測試。
JUnit官方API文檔:http://junit.org/junit4/javadoc/latest/index.html
創(chuàng)建測試類
以下內(nèi)容使用Eclipse
添加JUnit library
Build Path - Add Libraries - JUnit
新建測試類
右鍵待測試類 - New - Other (Ctrl + N) - JUnit Test Case - Next - Select methods - Finished
命名規(guī)范
被測試類名為MyClass,位于默認(rèn)source folder中的包com.mydemo.util。
package com.mydemo.util;
public class MyClass {
public static int add(int a, int b) {
return a + b;
}
}
新建source folder (可命名為test) 存放測試代碼,在該folder下創(chuàng)建與被測試類同名包。測試類命名為MyClassTest,方法命名為testMethodName。測試方法前需加@Test,測試方法不能帶參數(shù),且必須為public void。
package com.mydemo.util;
import static org.junit.Assert.*;
import org.junit.Test;
import com.mydemo.util.MyClass;
public class MyClassTest {
@Test
public void testAdd() {
assertEquals(6, MyClass.add(3, 3));
}
}
使用測試類
運行測試類
測試失敗
測試失敗包括failure和error兩種情況:
- Failure是斷言內(nèi)容不匹配,如
assertEquals(5, MyClass.add(3, 3)); - Error是程序存在Error或未處理的Exception,如
assertEquals(6, MyClass.add(3, a));
assertEquals(6, MyClass.divide(3, 0));
失敗時,JUnit測試工具顯示紅色條,F(xiàn)ailure Trace顯示原因和位置。
注解Annotation
@Test
將普通方法注釋為測試方法,方法內(nèi)部使用斷言,斷言失敗時測試失敗。
- @Test(expected = ExceptionName.class)
表示預(yù)期會拋出的異常,如拋出聲明類型的異常測試仍然顯示成功。 - @Test(timeout = milliseconds)
表示超出時間測試程序自動結(jié)束并顯示為失敗,時間單位為毫秒。
@BeforeClass, @AfterClass, @Before, @After
- @BeforeClass
該方法在所有的方法運行前被執(zhí)行,必須為static。當(dāng)測試類被加載后接著就會被運行,且在內(nèi)存中只會存在一份實例??捎糜诩虞d配置文件。 - @AfterClass
該方法在所有的方法運行結(jié)束后被執(zhí)行,必須為static。通常用來對資源的清理,如關(guān)閉數(shù)據(jù)庫的連接。 - @Before, @After
分別在每一個測試方法運行前、后被執(zhí)行一次??捎糜诔跏蓟兞炕蛑刂米兞康?。
@Ignore
被注釋的測試方法會被測試運行器忽略,測試時不執(zhí)行。
@RunWith
可以更改測試運行器,運行器需繼承org.junit.runner.Runner。
測試套件
可用于多個測試類的同時測試。測試套件基本結(jié)構(gòu)如下:
package com.mydemo.util;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({Test1.class,Test2.class,Test3.class, Suite1.class})
public class SuiteTest {
}
- 創(chuàng)建測試套件類SuiteTest.class,作為測試套件的入口類,這個類不包含任何方法。
- @RunWith(Suite.class) 更改測試運行器,避免使用JUnit默認(rèn)測試運行器。
- @Suite.SuiteClasses({}) 添加測試類到測試套件中,參數(shù)為數(shù)組形式的測試類或測試套件類。
參數(shù)化測試
package com.mydemo.util;
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;
// 更改默認(rèn)測試運行器
@RunWith(Parameterized.class)
public class ParameterTest {
// 聲明變量存放預(yù)期值和測試數(shù)據(jù)
int expected =0;
int input1 = 0;
int input2 = 0;
// public構(gòu)造函數(shù)給預(yù)期值和測試數(shù)據(jù)賦值
public ParameterTest(int expected,int input1,int input2) {
this.expected = expected;
this.input1 = input1;
this.input2 = input2;
}
// 返回值為Collection的public static方法,返回測試數(shù)據(jù)集合,用@Parameters修飾
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{3,1,2},
{4,2,2}
}) ;
}
@Test
public void testAdd() {
assertEquals(expected, MyClass.add(input1, input2));
}
}