註釋@Test, @Before, @After, @BeforeClass, @AfterClass
Junit 4 不用繼承TestCase類,要測試的方法也不用命名爲testxxx(),而是以@Test註解來指定測試方法。如果Junit 4使用繼承,那麼@註解會失效。不集成TestCase類,要使用assertEquals方法得引入 import static org.junit.Assert.assertEquals;
Junit 3 用setup(), testxxx(), tearDown(). Junit 4 用在方法上一行加註釋 @Before, @Test, @After.
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@BeforeClass @AfterClass 在一個類中只執行一次,一個類裏只有一個方法。public static void classSetup()
@Before @After 在每個測試方法之前或之後都執行一次,可以有多個方法加此標籤,執行順序不確定。public void methodSetup()
當一個類裏有多個測試方法,在所有測試方法之前需要setup的環境可以用BeforeClass,如果只有一個測試方法,那麼@Before也可以。
@Ignore 用於暫時忽略某個測試方法, 加在原有的@Test的上一行。
Junit 測試用例設計方法
如果一個類裏有多個方法要測,比如各種條件下被測試方法能否正確處理,每個條件可以寫一個test 方法,這些test方法都放在一個test類裏。 執行後,看哪個方法執行失敗。
Junit 的測試結果有3種:成功,失敗(failure),錯誤(error). 成功和失敗是assertxxx()方法執行的結果,錯誤error則是代碼異常引起的。
Junit TestSuite
批量執行測試用例
1. 創建一個空類作爲測試套件的入口
2. 使用@RunWith和@SuiteClasses修飾這個空類。
3. Suite.class作爲RunWith的參數,提示Junit用測試套件運行器來執行此類。
4. 要測試的類逗號隔開作爲SuiteClasses的參數,也可以將其他的suite作爲參數。
5. 這個空類用public修飾,而且存在公開的不帶有任何參數的構造函數。
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@SuiteClasses({Package.test1.class, Package.test2.class, gui.TestesTodos.class})
public class TodosOsTests(){}
在自己的類中批量執行Junit
如果測試用例太多,寫在SuiteClasses裏面也不方便,而且如果要加一些額外的邏輯和代碼,比如log,report,不同模式(ut,longrun)之類的,單用suite就不能滿足了。
Junit4提供了JunitCore類,可以靈活地調用測試用例。
1. 建一個case.txt, 裏面每一行是一個要執行的ut test case,如下所示:
com.ibm.docs.integration.ut.cases.AAAATest
com.ibm.docs.integration.ut.cases.CCCCTest
com.ibm.docs.integration.ut.cases.XXXXTest
2. 調用
2.1 先用ClassName.class.getClassLoader().getResourceAsStream(“cases.txt“)來取得case文件內容到InputStream.
注:InputStream是一個一個字節地讀,BufferStream是一行一行地讀。
2.2 然後將InputStream轉成BufferStream,然後一行一行讀內容,將case名字轉成List對象。
2.3 然後循環List對象,用JunitCore的run方法執行每個case。
InputStream fileStream = PackageUtil.class.getClassLoader().getResourceAsStream("cases.txt");
try
{
List<String> classList = new ArrayList<String>();
BufferedReader br = new BufferedReader(new InputStreamReader(fileStream));
String testcase = "";
while ((testcase = br.readLine()) != null)
{
if (packagename == "" || testcase.contains(packagename))
classList.add(testcase);
}
return classList;
}
catch (IOException e)
{
e.printStackTrace();
}
return Collections.EMPTY_LIST;
for (String clazzname : clazzes)
{
Class<?> clazz = Class.forName(clazzname);
JUnitCore core = new JUnitCore();
RunListener listener = new Listener(cases, reportFile);
core.addListener(listener);
Result result = core.run(clazz);
}
異常處理
當程序拋出異常是期望的結果時,Junit4 可以用@Test (expected = xxxException.class) 實現。
例如,如下代碼片段的測試場景是在用戶logout之後,再publish會報錯。
@Test (expected = NullPointerException.class)
public void testSessionTimeOut() {
......
scene.login(name, password);
scene.logout();
scene.publish(fileId);
......
}
References:
http://www.ibm.com/developerworks/cn/java/j-lo-junit4/