Java의 이상 테스트 프레임워크 JUnit 사용 설명서

5682 단어 Java이상
JUnit은 Erich Gamma와 Kent Beck이 작성한 회귀 테스트 프레임워크(regression testing framework)입니다.Junit 테스트는 프로그래머 테스트, 즉 화이트박스 테스트입니다.이 항목 홈 페이지:http://www.junit.org/
JUnit을 사용할 때 주로 TestCase 클래스를 계승하여 테스트 용례를 작성하고testXX() 이름을 사용하여 단원 테스트를 작성합니다.
JUnit으로 테스트를 하는데 정말 필요한 건 세 가지입니다.
1. 하나의 import 문장이 모든 junit를 도입한다.framework.*하류
2. extends 문장 하나로 당신의 클래스를 Test Case에서 계승합니다.
3. 슈퍼(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. 잘못된 클래스 유형 내보내기
  3. 이상한 구체적인 형식을 던져서 일반적인 이상한 메시지 속성에 포함된 문자열의 단정을 검사합니다
그래서 자주 사용하는 코드는 다음과 같이 쓸 수 있다.

    @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 () 방법이 상응하는 이상을 던졌는지 주의하십시오.
  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)는 이상 유형만 판단할 수 있을 뿐 이상에 대한 더 구체적인 정보는 단언할 수 없다. 즉, 이상 메시지 속성을 판정할 수 없다.
그러면 때때로 우리는 한 방법에서 여러 차례 유형의 이상을 던지지만 원인이 다르다. 즉, 이상한 메시지 정보가 다르다. 예를 들어 BizException이 나타날 때 다음과 같은 두 가지 이상이 있다.

  new BizException(“Password must contains at least 6 letters.”)
  new BizException(“Password length less than 15 letters”)
이것은 이상한 메시지를 단언할 방법이 있어야 한다. 이를 겨냥하여 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.expectXx() 메서드는 병존할 수 없습니다.
  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)
이상 유형이 잘못되었거나 잘못된 메시지가 잘못되었을 때:

  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 Expected Exception 방법을 테스트할 때 왜 실패했는지 명확하게 알 수 있습니다.어떤 이상을 원하는지, 이상 메시지에 어떤 문자열을 포함하는지, 실제로 어떤 종류의 이상을 얻었는지, 이상 메시지는 무엇인지.여기가 있으니, 너는 보기만 하면 너의 프로그램을 어떻게 수리해야 하는지 안다.

좋은 웹페이지 즐겨찾기