2011년 6월 14일 화요일

JUnitParams

예전에 TestNG을 사용하면서 JUnit보다 발전된 단위 테스트 도구라고 생각했었습니다. 2가지 큰 차이가 있었는데
1. Test Annotation 지원(JUnit에서 지원하기 전부터)
2. Test Parameter 지원(Test을 위한 Data Set을 정해두고 Parameter로 전달 할수 있었음.)

1. 번은 현재 JUnit에서 지원하고 있지만 2 번은 아직 미지원되고 있습니다. 하지만 여기 “JunitParams” Project가 있군요. JUnit 4.5 이상부터 지원된다고 합니다.

Maven Dependency
<dependency>
 <groupId>pl.pragmatists</groupId>
 <artifactId>JUnitParams</artifactId>
 <version>0.3.0</version>
 <scope>test</scope>
</dependency>

Sample Code
1. 가장 간단한 구성
package test.junitparams;

public class Person {
private int age;

public Person(int age) {
this.age = age;
}

public boolean isAdult() {
return age >= 18;
}

@Override
public String toString() {
return "Person of age: " + age;
}
}

package test.junitparams;

import junitparams.JUnitParamsRunner;
import junitparams.Parameters;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(JUnitParamsRunner.class)
public class PersonTest {
   @Test
   @Parameters({
           "17, false",
           "22, true" })
   public void personIsAdult(int age, boolean valid) throws Exception {
Assert.assertEquals(new Person(age).isAdult(), valid);
   }
}

“@RunWith(JUnitParamsRunner.class)” Annotation으로 JUnitParams을 사용할수 있게 지정
Test Method에 “@Parameters” Annotation에 Test Parameter을 지정해 줍니다.

2. Test Parameters 외부 Method에 지정
   @Test
   @Parameters(method = "adultValues")
   public void personIsAdult2(int age, boolean valid) throws Exception {
Assert.assertEquals(valid, new Person(age).isAdult());
   }

   private Object[] adultValues() {
       return $(
                    $(13, false),
                    $(17, false),
                    $(18, true),
                    $(22, true)
               );
   }

 public static Object[] $(Object... params) { return params; }

Test Date을 생성하는 adultValues Method을 만들고 “@Parameters”에서 Method를 지정합니다.

3. Test Parameters 외부 Method 자동 지정
   @Test
   @Parameters
   public void isAdult(Person person, boolean valid) throws Exception {
    Assert.assertEquals(person.isAdult(),valid);
   }

   private Object[] parametersForIsAdult() {
       return $(
                    $(new Person(13), false),
                    $(new Person(17), false),
                    $(new Person(18), true),
                    $(new Person(22), true)
               );
   }

   public static Object[] $(Object... params) { return params; }

Test Data을 생성하는 Method를 “parametersFor+[Test Method 이름]”으로 지정하면 Runtime시에 자동 지정됩니다.

4. 외부 Class에 있는 Test Parameters
   @Test
   @Parameters(source = PersonProvider.class)
   public void personIsAdult3(Person person, boolean valid) {
    Assert.assertEquals(person.isAdult(),valid);
   }

package test.junitparams;

public class PersonProvider {
   public static Object[] provideAdults() {
       return $(
                   $(new Person(25), true),
                   $(new Person(32), true)
              );
   }

   public static Object[] provideTeens() {
       return $(
                   $(new Person(12), false),
                   $(new Person(17), false)
              );
  
   }
   public static Object[] $(Object... params) { return params; }
}

Test Data을 외부 Class에 정의해두고 Test Method에서 지정하여 사용할수 있습니다.

Conclusion
JUnit을 사용하다보면 Test Data을 정의하는데 잔 손이 많이 갑니다. 하지만 아주 적당한 Plug-in이 나온 것 같습니다.
지금까지의 수준의 TestNG을 넘어서지 못하였지만 아직 버전은 0.3!
앞으로 많이 발전이 있으면 좋겠습니다.

댓글 1개:

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...