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

한국 developerWorks  >  자바  >

JUnit 4로 뛰어들기

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

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

문서 옵션

토론


제안 및 의견
피드백

튜토리얼 평가

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


테스트 실행: JUnit 4에서 테스트

새롭게 향상된 JUnit 4에서 가장 놀라운 특징 중 하나는 테스트를 논리적으로 그룹화하고 이를 단일 유닛으로 실행하는 데 사용되는 메커니즘인 스위트가 없다는 점이다. 이 섹션에서는 스위트를 대신하는 효율적인 새로운 주석 기능에 대해 소개하고 이클립스 및 앤트에서 JUnit 4 테스트를 실행하는 방법을 보여준다.

이전 방식의 스위트

차이점을 비교해 볼 수 있도록 Listing 12에 표시된 이전 방식의 JUnit 스위트를 확인해 보자(이 스위트는 두 개의 논리적 테스트 클래스를 그룹화하고 이를 단일 유닛으로 실행한다).


Listing 12. 이전 방식의 JUnit 스위트
                    
import junit.framework.Test;
import junit.framework.TestSuite;

public class JUnit3Suite {

 public static Test suite() {
  TestSuite suite = new TestSuite();
  suite.addTest(OneTimeRegularExpressionTest.suite());
  suite.addTestSuite(RegularExpressionTest.class);		
  return suite;
 }
}




위로


두 가지 뛰어난 새로운 주석 기능

JUnit 4에서 스위트는 새로운 주석 두 가지로 대체되었다. 첫 번째로 @RunWith는 프레임워크에 내장된 러너(runner)가 아닌 다른 러너를 통해 특정 테스트 클래스를 손쉽게 실행할 수 있게 해준다. JUnit 4는 @RunWith 주석에서 지정해야 하는 Suite라는 이름의 스위트 러너를 번들로 포함한다. 또한 테스트 스위트를 나타내기 위한 클래스 목록을 매개변수로 취하는 @SuiteClasses라는 주석을 제공해야 한다.


Listing 13. 편리한 기능의 주석
                    
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({ParametricRegularExpressionTest.class,
      RegularExpressionTest.class,
      TimedRegularExpressionTest.class})
public class JUnit4Suite {

}

새로운 JUnit 4 주석이 어렵게 보이더라도 걱정할 필요는 없다. JUnit 4를 고안한 개발자들도 비슷한 생각을 갖고 있다. Javadocs에서 JUnit 개발자들은 "사람들이 실제로 사용하는 방식대로" 러너 API가 변화될 것으로 예상한다고 설명한다. 최소한 이들은 이점에서 솔직하다.

이클립스에서 JUnit 4 테스트 실행

이클립스와 같은 IDE에서 또는 명령행을 통해 JUnit 4 테스트 클래스를 실행할 수 있다. Run As JUnit 테스트 옵션을 선택하면 이클립스 버전 3.2 이상에서 JUnit 테스트를 실행할 수 있다. 명령행을 통해 테스트를 실행하려면 org.junit.runner.JUnitCore 클래스를 실행하고 테스트의 정규화된 이름을 인수로 전달해야 한다.

예를 들어 이클립스에서 번들로 제공되는 JUnit 러너를 사용하지 않고자 하는 경우 새로운 실행 구성을 정의하고 그림 2와 같이 JUnitCore 클래스를 지정하면 된다.


그림 2. 이클립스에서 JUnit 4 명령행 테스트를 실행하기 위한 첫 번째 단계

테스트 지정

그런 다음 그림 3과 같이 Arguments 탭의 "Program arguments" 텍스트 상자에 테스트의 정규화된 이름을 추가하여 실행할 테스트를 지정해야 한다.


그림 3. 이클립스에서 JUnit 명령행 테스트를 실행하기 위한 두 번째 단계




위로


앤트와 JUnit 4

앤트와 JUnit은 지금까지 훌륭한 팀으로 존재해 왔으며 많은 개발자들은 이러한 관계로 인해 뛰어난 JUnit 4를 얻게 될 것이라고 기대했다. 그리고 결과적으로도 이러한 사실은 실제로 나타났다. 1.7 이전의 앤트 버전을 실행 중인 경우 JUnit 4 테스트를 즉시 실행할 수 없다. 하지만 그렇더라도 테스트 자체를 실행할 수 없는 것은 아니며 단지 즉시 실행할 수 없을 뿐이다.

잘못 맞춰진 짝

1.7 이전의 앤트 버전에서 JUnit 4 테스트(Listing 14 참조)를 실행하면 흥미로운 결과가 발생한다.


Listing 14. 간단한 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.assertTrue;

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 verifyGoodZipCode() throws Exception{		
  Matcher mtcher = this.pattern.matcher("22101");
  boolean isValid = mtcher.matches();		
  assertTrue("Pattern did not validate zip code", isValid);
 }
}

여러 번의 테스트 실패

앤트에서 오래된 junit 작업을 사용하면 Listing 15와 같은 에러가 발생한다.


Listing 15. 여러 가지 에러
                    
[junit] Running test.com.acme.RegularExpressionTest
[junit] Tests run: 1, Failures: 1, Errors: 0, Time elapsed: 0.047 sec
[junit] Testsuite: test.com.acme.RegularExpressionTest
[junit] Tests run: 1, Failures: 1, Errors: 0, Time elapsed: 0.047 sec

[junit] Testcase: warning took 0.016 sec
[junit]     FAILED
[junit] No tests found in test.com.acme.RegularExpressionTest
[junit] junit.framework.AssertionFailedError: No tests found in
  test.com.acme.RegularExpressionTest
[junit] Test test.com.acme.RegularExpressionTest FAILED

해결 방법

1.7 이전의 앤트 버전에서 JUnit 4 테스트를 실행하려면 Listing 16에서와 같이 JUnit4TestAdapter의 인스턴스를 반환하는 suite() 메서드를 사용하여 테스트 케이스를 수정해야 한다.


Listing 16. 이전 메서드를 새롭게 활용
                    
public static junit.framework.Test suite(){
 return new JUnit4TestAdapter(RegularExpressionTest.class);
}

이 인스턴스에서는 이름이 비슷한 @Test 주석으로 인해 Test의 반환 유형을 정규화해야 한다. 하지만 suite() 메서드를 배치하면 어떤 버전의 앤트에서도 JUnit 4 테스트가 문제없이 실행된다.




위로



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