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>