Junit



註釋@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/





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章