Akashic Records

JUnitParams 본문

오래된글/Java

JUnitParams

Andrew's Akashic Records 2018. 4. 9. 13:01
728x90


예전에 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!

앞으로 많이 발전이 있으면 좋겠습니다.



728x90

'오래된글 > Java' 카테고리의 다른 글

Nail 이미지 생성 클래스  (0) 2018.04.09
Lessons learned from getting .NET to REST with Java  (0) 2018.04.09
JNI Hello World Program  (0) 2018.04.09
JMX-Communication with Notifications  (0) 2018.04.09
JMS - 기초  (0) 2018.04.09
Comments