程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中的異常測試框架JUnit應用上手指南

Java中的異常測試框架JUnit應用上手指南

編輯:關於JAVA

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 是甚麼。有了這,你一看到就曉得怎樣去修補你的法式。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved