2010년 11월 9일 화요일

JUnit 4.x의 어노테이션

JUnit4의 주요 어노테이션을 정리해 보았습니다. 별것 아닌것 같아도 막상 사용해 보면 헛갈리기 쉬운것 같습니다. Junit4의 주요 어노테이션은 다음과 같습니다.

Junit 4 테스트 클래스 작성

JUnit4에서는 POJO 형태로 단위 테스트 클래스가 정의 됩니다. 단위 테스트 대상 메소드는 @Test를 통해서 정의 됩니다. 또한 단위 테스트 앞뒤에 초기화와 정리를 수행하는 메소드를 지정할 수 있습니다. 추가적으로 클래스 실행 앞뒤에 초기화와 정리를 수행하는 메서드를 정의 할 수 있습니다.

@Test 어노테이션은 timeout과 expected 속성을 갖습니다. timeout은 실행 시간은 지정된 단위 시간(밀리세컨드)를 초과하면 않된다는 것이며 expected는 지정한 클래스의 exception이 단위 테스트 메서드에서 발생할 것을 의미합니다.

  • @Test 어노테이션으로 단위 테스트 클래스정의
  • @After, @Before 어네테이션을 사용하여 각 단위 테스트 메서드의 실행 앞뒤에서 초기화와 자원 정리 작업을 수행
  • @AfterClass, @BeoreClass 어노테이션을 사용하여 각 단위 테스트 클래스 수행 전후에 초기화와 자원 정리 작업을 수행

package devtainer.demo.unitTest.junit4;

import junit.framework.Assert;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class JunitTest {
  static final Logger logger = 
    LoggerFactory.getLogger(JunitTest.class);
 
  @Before
  public void setup(){
    logger.info("@Before 메서드 실행");
  }
 
  @After
  public void tearDown(){
    logger.info("@After 메서드 실행");
  }
 
  @BeforeClass
  public static void setupForClass(){
    logger.info("@BeforeClass 메서드 실행");
  }
  
  @AfterClass
  public static void tearDownForClass(){
    logger.info("@AfterClass 메서드 실행");
  }

 
  @Test(expected=RuntimeException.class) //예외 발생을 예상
  public void test1(){
    logger.info("@Test 단위 테스트 메서드  메서드 실행");
    throw new RuntimeException();
  }
 
  @Test(timeout=100) //100 millisecond 초과시 에러
  public void test2(){
    logger.info("@Test 단위 테스트 메서드  메서드 실행");
 
    int a = 5;
    int b = 5;
  
    Assert.assertEquals("add 메서드 테스트", a+b, Calculator.add(a, b));
    Assert.assertEquals("minus 메서드 테스트", a-b, Calculator.minus(a, b));
    Assert.assertEquals("multiply 메서드 테스트", a*b, Calculator.multiply(a, b));
    Assert.assertEquals("divide 메서드 테스트", (double)a/b, Calculator.divide(a, b));
    // fail(String)
    // assertTrue(true);
    // assertsEquals([String message], expected, actual)
    // assertsEquals([String message], expected, actual, tolerance)
    // assertNull([message], object) 
    // assertNotNull([message], object) 
    // assertSame([String], expected, actual) 
    // assertNotSame([String], expected, actual) 
    // assertTrue([message], boolean condition)

  }
} 

단위테스트 클래스 수행 결과

앞의 단위 테스트 수행 결과는 다음과 같습니다.

INFO - JunitTest  :  setupForClass  @BeforeClass 메서드 실행 
INFO - JunitTest  :  setup  @Before 메서드 실행 
INFO - JunitTest  :  test1  @Test 단위 테스트 메서드  메서드 실행 
INFO - JunitTest  :  tearDown  @After 메서드 실행 
INFO - JunitTest  :  setup  @Before 메서드 실행 
INFO - JunitTest  :  test2  @Test 단위 테스트 메서드  메서드 실행 
INFO - JunitTest  :  tearDown  @After 메서드 실행 
INFO - JunitTest  :  tearDownForClass  @AfterClass 메서드 실행 

Suite 설정

앞에 예제와 같이 단위 테스트 클래스를 독자적으로 정리하고 실행할 수 있습니다. 그러나 때로는 몇개의 단위 테스트를 하나의 단위로 묶어서 수행해야 하는 경우가 있습니다. 이러한 경우에 Suite의 개념을 사용할 수 있습니다. JUnit4에서 Suite을 위한 어노테이션은 다음과 같습니다.

package devtainer.demo.unitTest.junit4;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses( { JunitTest.class, Junit2Test.class })
public class SuiteTest {

}

  • @RunWith로 Suite.class 지정
  • @Suite.SuiteClass 지정

이클립스 단위테스트 등록 이미지


일반 단위 테스트 클래스와 Suite 클래스는 이클립스 상에서 다음과 같이 표현된다. Suite 클래스는 다른 단위 클래스를 포함하는 것을 확인 할 수 있다.


Suite 클래스 실행 결과

INFO - JunitTest  :  setupForClass  @BeforeClass 메서드 실행 
INFO - JunitTest  :  setup  @Before 메서드 실행 
INFO - JunitTest  :  test1  @Test 단위 테스트 메서드  메서드 실행 
INFO - JunitTest  :  tearDown  @After 메서드 실행 
INFO - JunitTest  :  setup  @Before 메서드 실행 
INFO - JunitTest  :  test2  @Test 단위 테스트 메서드  메서드 실행 
INFO - JunitTest  :  tearDown  @After 메서드 실행 
INFO - JunitTest  :  tearDownForClass  @AfterClass 메서드 실행 
INFO - Junit2Test  :  setupForClass  @BeforeClass 메서드 실행 
INFO - Junit2Test  :  setup  @Before 메서드 실행 
INFO - Junit2Test  :  test1  @Test 단위 테스트 메서드  메서드 실행 
INFO - Junit2Test  :  tearDown  @After 메서드 실행 
INFO - Junit2Test  :  setup  @Before 메서드 실행 
INFO - Junit2Test  :  test2  @Test 단위 테스트 메서드  메서드 실행 
INFO - Junit2Test  :  tearDown  @After 메서드 실행 
INFO - Junit2Test  :  tearDownForClass  @AfterClass 메서드 실행 

예제

예제는 다음 URL에서 SVN으로 받으실 수 있습니다.
  • SVN URL: http://devtainer-demo.googlecode.com/svn/trunk/junit4
  • 프로젝트는 Maven 형태로 구성 
    • maven 2.2.x 설치가 필수
    • 실행방법
      • 위치: 프로젝트 root
      • command: mvn clean test

C:\test-cloud\workspace\archetype\junit4>mvn clean test
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building junit4
[INFO]    task-segment: [clean, test]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean {execution: default-clean}]
[INFO] Deleting directory C:\test-cloud\workspace\archetype\junit4\target
[INFO] [resources:resources {execution: default-resources}]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Compiling 1 source file to C:\test-cloud\workspace\archetype\junit4\targe
t\classes
[INFO] [resources:testResources {execution: default-testResources}]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] [compiler:testCompile {execution: default-testCompile}]
[INFO] Compiling 3 source files to C:\test-cloud\workspace\archetype\junit4\targ
et\test-classes
[INFO] [surefire:test {execution: default-test}]
[INFO] Surefire report directory: C:\test-cloud\workspace\archetype\junit4\targe
t\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running devtainer.demo.unitTest.junit4.JunitTest
INFO - JunitTest  :  setupForClass  @BeforeClass 메서드 실행
INFO - JunitTest  :  setup  @Before 메서드 실행
INFO - JunitTest  :  test1  @Test 단위 테스트 메서드  메서드 실행
INFO - JunitTest  :  tearDown  @After 메서드 실행
INFO - JunitTest  :  setup  @Before 메서드 실행
INFO - JunitTest  :  test2  @Test 단위 테스트 메서드  메서드 실행
INFO - JunitTest  :  tearDown  @After 메서드 실행
INFO - JunitTest  :  tearDownForClass  @AfterClass 메서드 실행
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.172 sec
Running devtainer.demo.unitTest.junit4.SuiteTest
INFO - JunitTest  :  setupForClass  @BeforeClass 메서드 실행
INFO - JunitTest  :  setup  @Before 메서드 실행
INFO - JunitTest  :  test1  @Test 단위 테스트 메서드  메서드 실행
INFO - JunitTest  :  tearDown  @After 메서드 실행
INFO - JunitTest  :  setup  @Before 메서드 실행
INFO - JunitTest  :  test2  @Test 단위 테스트 메서드  메서드 실행
INFO - JunitTest  :  tearDown  @After 메서드 실행
INFO - JunitTest  :  tearDownForClass  @AfterClass 메서드 실행
INFO - Junit2Test  :  setupForClass  @BeforeClass 메서드 실행
INFO - Junit2Test  :  setup  @Before 메서드 실행
INFO - Junit2Test  :  test1  @Test 단위 테스트 메서드  메서드 실행
INFO - Junit2Test  :  tearDown  @After 메서드 실행
INFO - Junit2Test  :  setup  @Before 메서드 실행
INFO - Junit2Test  :  test2  @Test 단위 테스트 메서드  메서드 실행
INFO - Junit2Test  :  tearDown  @After 메서드 실행
INFO - Junit2Test  :  tearDownForClass  @AfterClass 메서드 실행
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.062 sec
Running devtainer.demo.unitTest.junit4.Junit2Test
INFO - Junit2Test  :  setupForClass  @BeforeClass 메서드 실행
INFO - Junit2Test  :  setup  @Before 메서드 실행
INFO - Junit2Test  :  test1  @Test 단위 테스트 메서드  메서드 실행
INFO - Junit2Test  :  tearDown  @After 메서드 실행
INFO - Junit2Test  :  setup  @Before 메서드 실행
INFO - Junit2Test  :  test2  @Test 단위 테스트 메서드  메서드 실행
INFO - Junit2Test  :  tearDown  @After 메서드 실행
INFO - Junit2Test  :  tearDownForClass  @AfterClass 메서드 실행
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec

Results :

Tests run: 8, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4 seconds
[INFO] Finished at: Tue Nov 09 11:25:15 VET 2010
[INFO] Final Memory: 13M/32M
[INFO] ------------------------------------------------------------------------
C:\test-cloud\workspace\archetype\junit4>

0 개의 댓글:

댓글 쓰기