JUnit是用于編寫可重復(fù)測試的單元測試框架苫昌,可實(shí)現(xiàn)自動(dòng)化測試。
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中的包c(diǎn)om.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));
}
}
使用測試類
運(yùn)行測試類
測試失敗
測試失敗包括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));
失敗時(shí)诈乒,JUnit測試工具顯示紅色條罩扇,F(xiàn)ailure Trace顯示原因和位置。
注解Annotation
@Test
將普通方法注釋為測試方法怕磨,方法內(nèi)部使用斷言喂饥,斷言失敗時(shí)測試失敗。
- @Test(expected = ExceptionName.class)
表示預(yù)期會(huì)拋出的異常肠鲫,如拋出聲明類型的異常測試仍然顯示成功员帮。 - @Test(timeout = milliseconds)
表示超出時(shí)間測試程序自動(dòng)結(jié)束并顯示為失敗,時(shí)間單位為毫秒导饲。
@BeforeClass, @AfterClass, @Before, @After
- @BeforeClass
該方法在所有的方法運(yùn)行前被執(zhí)行捞高,必須為static氯材。當(dāng)測試類被加載后接著就會(huì)被運(yùn)行,且在內(nèi)存中只會(huì)存在一份實(shí)例棠枉∨ㄌ澹可用于加載配置文件泡挺。 - @AfterClass
該方法在所有的方法運(yùn)行結(jié)束后被執(zhí)行辈讶,必須為static。通常用來對(duì)資源的清理娄猫,如關(guān)閉數(shù)據(jù)庫的連接贱除。 - @Before, @After
分別在每一個(gè)測試方法運(yùn)行前媳溺、后被執(zhí)行一次月幌。可用于初始化變量或重置變量等悬蔽。
@Ignore
被注釋的測試方法會(huì)被測試運(yùn)行器忽略扯躺,測試時(shí)不執(zhí)行。
@RunWith
可以更改測試運(yùn)行器蝎困,運(yùn)行器需繼承org.junit.runner.Runner录语。
測試套件
可用于多個(gè)測試類的同時(shí)測試。測試套件基本結(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禾乘,作為測試套件的入口類澎埠,這個(gè)類不包含任何方法。
- @RunWith(Suite.class) 更改測試運(yùn)行器始藕,避免使用JUnit默認(rèn)測試運(yù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)測試運(yù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));
}
}