IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
메인 컨텐츠로 가기

한국 developerWorks  >  자바  >

JUnit 4로 뛰어들기

자바 5 주석을 사용한 효율적인 테스트

developerWorks
Go to the previous page11 페이지 중 3 페이지Go to the next page

문서 옵션

토론


제안 및 의견
피드백

튜토리얼 평가

이 컨텐츠를 개선하기 위한 도움을 주십시오.


주석을 사용한 테스트

자바 5 주석으로 인해 JUnit 4는 이전 버전과는 크게 다른 프레임워크가 되었다. 이 섹션에서는 테스트 선언과 예외 테스트 같은 핵심 영역뿐만 아니라 제한 시간 테스트 영역에서 주석을 사용하는 방법과 원치 않는 또는 사용할 수 없는 테스트를 무시하는 방법에 대해 설명한다.

테스트 선언

JUnit 4에서 테스트를 선언하기 위해서는 단순히 테스트 메서드에 @Test 주석만 덧붙이면 된다. Listing 3에서와 같이 특정 클래스에서 확장할 필요가 없다.


Listing 3. JUnit 4에서 테스트 선언
                    
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertFalse;

public class RegularExpressionTest {
 private static String zipRegEx = "^\\d{5}([\\-]\\d{4})?$";
 private static Pattern pattern;
  
 @BeforeClass
 public static void setUpBeforeClass() throws Exception {
  pattern = Pattern.compile(zipRegEx);
 }

 @Test
 public void verifyZipCodeNoMatch() throws Exception{		 
  Matcher mtcher = this.pattern.matcher("2211");
  boolean notValid = mtcher.matches();		
  assertFalse("Pattern did validate zip code", notValid);
 }
}

정적 가져오기에 대해 알아야 할 것

필자는 Listing 3에서 Assert 클래스의 assertFalse() 메서드를 가져오기 위해 자바 5의 정적 가져오기 기능을 사용했다. 이는 테스트 클래스가 이전 버전의 JUnit에서와 같이 TestCase에서 확장되지 않기 때문이다.




위로


예외 테스트

이전 버전의 JUnit에서와 같이 일반적으로 테스트가 Exception을 throw하는 경우를 지정하는 것이 좋다. 이 규칙을 무시해야 하는 유일한 경우는 특정 예외에 대한 테스트를 시도하려는 경우다. 테스트가 예외를 throw하면 프레임워크가 실패를 보고한다.

특정 예외에 대한 테스트를 수행하고자 할 때 JUnit 4의 @Test 주석은 테스트가 예외시 throw해야 하는 예외 유형을 나타내는 expected 매개변수를 지원한다.

간단한 비교로 새로운 매개변수의 차이점을 이해할 수 있다.

JUnit 3.8에서 예외 테스트

testZipCodeGroupException()으로 명명된 Listing 4의 JUnit 3.8 테스트는 선언한 정규식의 세 번째 그룹을 얻으려고 시도할 경우 IndexOutOfBoundsException이 발생하는 것으로 확인된다.


Listing 4. JUnit 3.8에서 예외 테스트
                    
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import junit.framework.TestCase;

public class RegularExpressionTest extends TestCase {

 private String zipRegEx = "^\\d{5}([\\-]\\d{4})?$";
 private Pattern pattern;

 protected void setUp() throws Exception {
  this.pattern = Pattern.compile(this.zipRegEx);
 }

 public void testZipCodeGroupException() throws Exception{		 
  Matcher mtcher = this.pattern.matcher("22101-5051");
  boolean isValid = mtcher.matches();			
  try{
   mtcher.group(2);
   fail("No exception was thrown");
  }catch(IndexOutOfBoundsException e){
  }
 }
}

이전 버전의 JUnit에서는 try/catch를 작성하여 예외가 발생하지 않으면 실패하는 이러한 간단한 테스트를 위해서도 상당히 많은 양의 코드를 작성해야 한다.

JUnit 4에서 예외 테스트

Listing 5의 예외 테스트는 Listing 4와 동일하지만 새로운 expected 매개변수를 사용한다는 점이 다르다(Listing 4에서 @Test 주석에 IndexOutOfBoundsException 예외를 전달하여 테스트를 수정할 수 있었다).


Listing 5. 'expected' 매개변수를 사용한 예외 테스트
                    
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.BeforeClass;
import org.junit.Test;

public class RegularExpressionJUnit4Test {
 private static String zipRegEx = "^\\d{5}([\\-]\\d{4})?$";
 private static Pattern pattern;

 @BeforeClass
 public static void setUpBeforeClass() throws Exception {
  pattern = Pattern.compile(zipRegEx);
 }

 @Test(expected=IndexOutOfBoundsException.class)
 public void verifyZipCodeGroupException() throws Exception{		
  Matcher mtcher = this.pattern.matcher("22101-5051");
  boolean isValid = mtcher.matches();			
  mtcher.group(2);		
 }
}




위로


제한 시간 테스트

JUnit 4의 테스트 케이스에서는 제한 시간 값을 매개변수로 사용할 수 있다. Listing 6에서와 같이 timeout 값은 테스트가 실행하는 데 걸리는 최대 시간을 나타낸다. 시간이 초과되면 테스트가 실패한다.


Listing 6. timeout 값을 사용한 테스트
                    
@Test(timeout=1)
public void verifyFastZipCodeMatch() throws Exception{		
 Pattern pattern = Pattern.compile("^\\d{5}([\\-]\\d{4})?$"); 
 Matcher mtcher = pattern.matcher("22011");
 boolean isValid = mtcher.matches();		
 assertTrue("Pattern did not validate zip code", isValid);
}

제한 시간을 사용한 테스트는 쉽게 작성할 수 있다. 메서드에서 단순히 @Test 다음에 timeout 값을 삽입하면 자동화된 제한 시간 테스트를 구현할 수 있다.




위로


테스트 무시

JUnit 4 버전이 나오기 전에는 깨져 있거나 불완전한 테스트를 무시하기가 어려웠다. 프레임워크에서 특정 테스트를 무시하도록 하려면 테스트 명칭을 따르지 않도록 테스트 이름을 바꾸어야 했다. 예를 들어 필자도 테스트가 실행되지 않도록 표시하기 위해 테스트 메서드 앞에 "_"를 붙이는 습관이 있었다.

JUnit 4에서는 @Ignore를 붙인 주석을 통해 프레임워크에서 특정 테스트 메서드를 무시하도록 할 수 있다. 또한 다른 개발자가 무시된 테스트를 이상하게 여기지 않도록 메시지 설명을 전달할 수도 있다.

@Ignore 주석

Listing 7은 정규식이 아직 작동하지 않는 테스트를 쉽게 무시하는 방법을 보여준다.


Listing 7. 테스트 무시
                    
@Ignore("this regular expression isn't working yet")
@Test
public void verifyZipCodeMatch() throws Exception{		
 Pattern pattern = Pattern.compile("^\\d{5}([\\-]\\d{4})"); 
 Matcher mtcher = pattern.matcher("22011");
 boolean isValid = mtcher.matches();		
 assertTrue("Pattern did not validate zip code", isValid);
}

테스트 무시에 대한 알림 메시지

예를 들어 이클립스에서 이 테스트를 실행하면 그림 1과 같이 테스트가 무시되었다는 알림이 보고된다.


Figure 1. 그림 1. 무시된 테스트가 이클립스에서 표시되는 모습
무시한 테스트는 이클립스에서 문서화된다



위로



Go to the previous page11 페이지 중 3 페이지Go to the next page
    IBM 소개 개인정보 보호정책 문의