Java中的異常測試框架JUnit應用上手指南。本站提示廣大學習愛好者:(Java中的異常測試框架JUnit應用上手指南)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中的異常測試框架JUnit應用上手指南正文
JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個回歸測試框架(regression testing framework)。Junit測試是法式員測試,即白盒測試。該項目主頁:http://www.junit.org/
應用JUnit時,重要都是經由過程繼續TestCase種別來撰寫測試用例,應用testXXX()稱號來撰寫單位測試。
用JUnit寫測試真正所須要的就三件事:
1. 一個import語句引入一切junit.framework.*下的類。
2. 一個extends語句讓你的類從TestCase繼續。
3. 一個挪用super(string)的結構函數。
功效類MathTool
package com.zj.c01; public class MathTool { public static int gcd(int num1, int num2) { int r = 0; while (num2 != 0) { r = num1 % num2; num1 = num2; num2 = r; } return num1; } }
測試類MathToolTest
package com.zj.c01; import junit.framework.TestCase; public class MathToolTest extends TestCase { public MathToolTest(String name) { super(name); } public void testGcd() { assertEquals(5, MathTool.gcd(10, 5)); } }
我們在用 JUnit 測試辦法異常的時刻,最輕易想到的方法就是用 try…catch 去捕捉異常,須要斷言以下幾個前提:
1. 確切拋出的異常
2. 拋出異常的 Class 類型
3. 拋出異常的詳細類型,普通檢討異常的 message 屬性中包括的字符串的判斷
所以經常使用的代碼你能夠會這麼寫:
@Test public void testBizException() { try{ Password.validate( "123" ); fail( "No exception thrown." ); }catch ( Exception ex ) { assertTrue( ex instanceof BizException ); assertTrue( ex.getMessage().contains( "error" ) ); } }
這裡被測試的辦法是 Password.validate() 辦法能否拋出了響應的異常,留意這裡別漏 try 中的
fail(“No Exception thrown.”)
代碼行,否則假如被測試的辦法假如沒有拋出異常的話,這個用例是經由過程的,而你預期的是要拋出異常的。
在 JUnit 4 中,年夜可不用如斯這般的去測試辦法異常。固然如許也能測定出能否履行出預期的異常來,但它仍有弊病,接上去會一比較就曉得了,try…catch 的辦法,JUnit 沒法為你提醒出具體的斷言掉敗緣由。
那末來看看自從 JUnit 4 後可以怎樣去測試異常呢?用 @Test(execpted=Exception.class) 注解就行,參考以下代碼:
@Test( expected = BizException.class ) public void testBizException() { Password.validate( null ); }
假如被測試的辦法有拋出 BizException類型就是斷言勝利,對了 @Test(expected = BizException.class) 只能斷定出異常的類型,並沒有響應的注解能斷言出異常的更詳細的信息,即沒法剖斷拋出異常的 message 屬性。
那末,有時刻我們會在一個辦法中屢次拋出一品種型的異常,但緣由分歧,即異常的 message 信息分歧,好比湧現 BizException 時會有以下兩種異常:
new BizException(“Password must contains at least 6 letters.”) new BizException(“Password length less than 15 letters”)
這就要有方法去斷言異常的 message 了,針關於此,自 JUnit 4.7 以後又給了我們更完善的選擇,就是上面的代碼:
@Rule public ExpectedException expectedEx = ExpectedException.none(); @Test public void testBizException() throws InvalidPasswordException { expectedEx.expect( BizException.class ); expectedEx.expectMessage( "required" ); Password.validate( "" ); }
下面代碼需重點存眷幾個:
1. @Rule 注解的 ExpectedException 變量聲明,它必需為 public
2. @Test 處,不克不及寫成 @Test(expected=BizException.class),不然不克不及准確測試,也就是
@Test(expected=BizException.class) 和測試辦法中的 expectedEx.expectXxx() 辦法是不克不及同時並存的
3. expectedEx.expectMessage() 中的參數是 Matcher 或 subString,就是說可用正則表達式剖斷,或斷定能否包括某個子字符串
4. 再就是有一點很重,把被測試辦法寫在 expectedEx.expectXxx() 辦法前面,否則也不克不及准確測試的異常
5. 最初一個是,只需測試辦法直接拋出被測試辦法的異常便可,其實不影響你所關懷的異常
後面說到用 try…catch 的方法也能准確測試到異常,@Test(expected=…) 或 @Rule 與 try…catch 的辦法比較有甚麼利益呢,明顯用 JUnit 4 推舉的辦法簡練清楚明了。再來看測試掉敗時 JUnit 會為你提醒甚麼呢?
try…catch 測試異常掉敗時,獲得的提醒:
無異常時:
java.lang.AssertionError: No exception thrown. at org.junit.Assert.fail(Assert.java:91) at cc.unmi.PasswordTest.passwordLengthLessThan6LettersThrowsException(PasswordTest.java:20)
異常類型纰謬或異常的 message 纰謬時:
java.lang.AssertionError: at org.junit.Assert.fail(Assert.java:91) at org.junit.Assert.assertTrue(Assert.java:43) at org.junit.Assert.assertTrue(Assert.java:54) at cc.unmi.PasswordTest.passwordLengthLessThan6LettersThrowsException(PasswordTest.java:22)
下面能供給給我們的定位毛病的贊助不是特殊年夜
再看 @Test(expected=BizException.class) 時測試掉敗時的提醒:
java.lang.AssertionError: Expected exception: cc.test.BizException at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:32) at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:110)
用 @Rules ExpectedException方法來測試異常,掉敗時的提醒:
java.lang.AssertionError: Expected: (exception with message a string containing “YES. required” and an instance of java.lang.NullPointerException) got: at org.junit.Assert.assertThat(Assert.java:778) at org.junit.Assert.assertThat(Assert.java:736) at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:114)
特殊是 @Rules ExpectedException 辦法時為什麼測試掉敗提醒的清清晰楚。希冀甚麼異常,異常 message 中含何字符串,現實上確獲得甚麼類型的異常,異常中 message 是甚麼。有了這,你一看到就曉得怎樣去修補你的法式。