레이블이 annotation인 게시물을 표시합니다. 모든 게시물 표시
레이블이 annotation인 게시물을 표시합니다. 모든 게시물 표시

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>