1. 程式人生 > >Java測試用例簡介

Java測試用例簡介

 最近需要向組內其他成員普及一下關於Java測試用例的相關知識,特在此進行一下簡單的學習和總結。

JUnit簡介

JUnit是一個開源的Java單元測試框架,JUnit4對原有的JUnit框架進行了大幅度的改進,主要目標便是利用了Java中的Annotation,來代替以前必須要繼承AbstractTestCase,以及要測試的方法名稱必須test為字首。

JUnit4中提供了三個Annotation,用來控制整個測試的生命週期:

  • @Before

相當與測試用例的初始化工作,在執行每個測試用例方法時,都會先執行該方法。

  • @After

測試用例的清理工作在該方法中編寫,在每個方法執行完成後,都會進行清理。

@Before和@After可以保證一些測試用例中的資源在這些方法執行,不會受到@Test方法執行順序的影響。

  • @Test

這個是實際的測試方法,會根據該方法中的斷言語句(Assert)來進行測試用例的執行結果顯示輸出。

在@Test中,還有一些屬性,這些屬性都是非常有用的:

  • expect=xxxx.class(extends Throwable)

如果我們在測試方法中能夠預料到一些錯誤的發生,就使用該方法進行處理。有時候,一個函式丟擲異常也許是你希望得到的結果。

  • timeout=xxxx(一個毫秒值)

如果測試方法沒有在指定的timeout時間內執行完成,該測試失敗,這對於單元測試效率非常有幫助。

如果正在實踐測試驅動開發,@Ignore可以暫時忽略掉一些已經定義但並沒有實現的方法。

JUnit中有引數化測試的概念,只需要寫一個測試函式,把若干種情況當成是引數傳進去,進行測試即可。

 類似下面的程式碼,就可以引數化的方式進行批量測試工作:

@RunWith(Parameterized.class)
public class BelongToRegionFunctionTestCase {
 
    private BelongToRegionFunction function;
 
    private boolean expected;
    private int regionId;
    private int parentRegionId;
 
    @Before
    public void setUp() {
        function = new BelongToRegionFunction();
    }
 
    @After
    public void tearDown() {
        function = null;
    }
 
    @Parameterized.Parameters
    public static Collection prepareData() {
        return Arrays.asList(
                new Object[]{true, 15, 8},
                new Object[]{true, 105, 8},
                new Object[]{false, 2, 8}
        );
    }
 
    public BelongToRegionFunctionTestCase(boolean expected, int regionId, int parentRegionId) {
        this.expected = expected;
        this.regionId = regionId;
        this.parentRegionId = parentRegionId;
    }
 
    @Test
    public void testOldRegion() throws IOException {
        String filePath = this.getClass().getClassLoader().getResource("Region-000000000000000000000008-top100-new").getFile();
        Assert.assertEquals(expected, function.evaluate(regionId,parentRegionId, filePath));
    }
 
    @Test
    public void testNewRegion() throws IOException {
        String filePath = this.getClass().getClassLoader().getResource("Region-000000000000000000000008-top100-top100-top100-merge").getFile();
        Assert.assertEquals(expected, function.evaluate(regionId,parentRegionId, filePath));
    }
 
}
 

Maven中執行JUnit

Maven本身不是一個單元測試框架,只是在構建執行到特定生命週期的時候,通過外掛來執行JUnit的測試用例。這個外掛就是maven-surefire-plugin,也成為Test Runner。

預設情況下,maven-surefire-plugin會執行測試原始碼路徑中的所有TestCase,路徑為:src/test/java。maven中的test階段是預設包含在一些階段之前,也就是說package和install階段都會預設先執行test,如果想要在package前跳過這個階段,可以使用類似下面的命令:

maven package –DskipTests
  

如果不僅想要跳過測試執行,還需要跳過測試編譯:

maven package –Dmaven.test.skip=true
  

如果在執行時某個測試用例執行失敗,想要重新執行一次的時候,沒有必要將所有的測試用例都跑一遍,僅需要執行部分的測試用例,maven-surefire-plugin提供了一個test引數可以讓maven使用者能夠在命令列指定要執行的測試用例,可以使用萬用字元,以及加入多個Test類:

maven test –Dtest=Class*Test,Class2*Test
 

 在idea中可以設定工程的Test Resources Folder,這樣就可以在程式中用ClassLoader的getResource得到對應資源的路徑和輸入流,建議不要將測試使用的資源強行防至到對應的開發資源包中。

maven中可以定義測試資源的路徑:

    <build>
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
            </testResource>
        </testResources>
    </build>