반응형

JUnit Parameterized이란?

 

TDD 방식으로 코딩을 만들다 보면 단위 테스트를 하게 되어있다.

 

이때 단위테스트를 진행하다 보면 여러가지 입력 값에 대한 테스트를 한 번에 수행해야할 때가 있다.

 

이때 각 테스트마다 서로 다른 조건문에 들어가게 되는 경우 즉, 경계조건을 테스트해야 하는 경우가 있다.

 

즉, Parameterized는 경계조건을 테스트할 때, 여러가지 값을 검증할 시에도 유용하다.

 

 

 

예제 코드

 

package com.example.myapplication;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

// Parameterized class를 JUnit에서 추가적으로 사용할 수 있도록 설정
@RunWith(Parameterized.class)
public class ScoreUnitTest {

    // 파라미터를 제공해주는 메서드
    // 이 메서드는 static이면서 Collection으로 리턴해야한다.
    @Parameterized.Parameters
    public static Collection<Object[]> positiveTestData(){
        List<Object[]> scores = Arrays.asList(new Object[][]{
                {"A",100},
                {"B",80},
                {"C",60},
                {"F",20},
                {"E", 150}
        });

        return scores;
    }

    // 순서대로 grade, score가 위의 Collection 순서와 같게 들어간다.
    // 순서를 변경하고 싶다면 @Parameter()을 찾아보자.
    private String grade;
    private int score;

    public ScoreUnitTest(String grade, int score) {
        this.grade = grade;
        this.score = score;
    }

    @Test
    public void testScoreClassify(){
        assertThat(getGrade(score), is(grade));
    }

    private String getGrade(int score){
        if(score > 100 || score < 0){
            return "ERROR";
        }

        if(score == 100){
            return "A";
        } else if(score >= 80){
            return "B";
        } else if (score >= 60) {
            return "C";
        } else {
            return "F";
        }
    }

}

 

위의 코드를 실행시키면 5개의 테스트 케이스를 수행하는 과정을 확인 할 수 있다.

이는 아래 결과를 얻을 수 있고 150이라는 값이 Error인데 E로 출력했기에 Fail이 나면서 끝나는 것을 보여준다.

"C:\Program Files\Android\Android Studio\jre\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Program Files\Android\Android Studio\lib\idea_rt.jar=62003:C:\Program Files\Android\Android Studio\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Android\Android Studio\lib\idea_rt.jar;C:\Program Files\Android\Android Studio\plugins\junit\lib\junit-rt.jar;C:\Program Files\Android\Android Studio\plugins\junit\lib\junit5-rt.jar;C:\Users\kkw\AppData\Local\Android\Sdk\platforms\android-29\data\res;C:\Users\kkw\AndroidStudioProjects\MyApplication2\app\build\intermediates\javac\debugUnitTest\classes;C:\Users\kkw\AndroidStudioProjects\MyApplication2\app\build\intermediates\javac\debug\classes;C:\Users\kkw\AndroidStudioProjects\MyApplication2\app\build\generated\res\resValues\androidTest\debug;C:\Users\kkw\AndroidStudioProjects\MyApplication2\app\build\generated\res\resValues\debug;C:\Users\kkw\.gradle\caches\modules-2\files-2.1\junit\junit\4.12\2973d150c0dc1fefe998f834810d68f278ea58ec\junit-4.12.jar;C:\Users\kkw\.gradle\caches\modules-2\files-2.1\org.hamcrest\hamcrest-core\1.3\42a25dc3219429f0e5d060061f71acb49bf010a0\hamcrest-core-1.3.jar;C:\Users\kkw\.gradle\caches\modules-2\files-2.1\androidx.collection\collection\1.1.0\1f27220b47669781457de0d600849a5de0e89909\collection-1.1.0.jar;C:\Users\kkw\.gradle\caches\modules-2\files-2.1\androidx.lifecycle\lifecycle-common\2.1.0\c67e7807d9cd6c329b9d0218b2ec4e505dd340b7\lifecycle-common-2.1.0.jar;C:\Users\kkw\.gradle\caches\modules-2\files-2.1\androidx.arch.core\core-common\2.1.0\b3152fc64428c9354344bd89848ecddc09b6f07e\core-common-2.1.0.jar;C:\Users\kkw\.gradle\caches\modules-2\files-2.1\androidx.annotation\annotation\1.1.0\e3a6fb2f40e3a3842e6b7472628ba4ce416ea4c8\annotation-1.1.0.jar;C:\Users\kkw\.gradle\caches\modules-2\files-2.1\androidx.constraintlayout\constraintlayout-solver\1.1.3\54abe9ffb22cc9019b0b6fcc10f185cc4e67b34e\constraintlayout-solver-1.1.3.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\6119d746697059b7e1b74aab4d181f56\appcompat-1.1.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\6119d746697059b7e1b74aab4d181f56\appcompat-1.1.0\res;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\0362ff4d8672321347a402c32368f192\fragment-1.1.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\ddf6a25e6e3e5e2af441269b48288beb\appcompat-resources-1.1.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\ddf6a25e6e3e5e2af441269b48288beb\appcompat-resources-1.1.0\res;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\00bc847ce5b9e3ce7b40d465bffbf9e9\drawerlayout-1.0.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\4932f7e67b26f042b51fa62f1aa4816d\viewpager-1.0.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\5276819c062a92c029464122749254f1\loader-1.0.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\dbbcc99072b5616db9e0106b8ed65934\activity-1.0.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\d1ca7cd3905794bed09cb92934ccd6c2\vectordrawable-animated-1.1.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\4276267baf989d651cf25177c247ad49\vectordrawable-1.1.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\a3c457ded457b98b207b4f227d629399\customview-1.0.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\e9dab9c67c1ee3668e0bbf86c6d8cbd8\core-1.1.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\e9dab9c67c1ee3668e0bbf86c6d8cbd8\core-1.1.0\res;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\fb2fbe77879a57ea0c5dfd6fe59ba874\cursoradapter-1.0.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\78be57497ca2a8dd090798c529f3e53d\versionedparcelable-1.1.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\64ed055c454b36433d45a77285ee24d6\lifecycle-viewmodel-2.1.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\ffa46f3d6480310395b7b525cf59ccde\lifecycle-runtime-2.1.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\3819fb4fef2e012192b32762458ba145\savedstate-1.0.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\63647da4654da12a6f2785cfbbad8123\lifecycle-livedata-2.0.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\733fc1d306cee2c05d3e1fb0b7527020\lifecycle-livedata-core-2.0.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\3a992d8307f21a8f15eb649383ba6a6a\interpolator-1.0.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\fdd65d8b6066fd289a68b42931dc03a2\core-runtime-2.0.0\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\3ec6fa8458ddbe732478393a9f9e6c77\constraintlayout-1.1.3\jars\classes.jar;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\3ec6fa8458ddbe732478393a9f9e6c77\constraintlayout-1.1.3\res;C:\Users\kkw\AndroidStudioProjects\MyApplication2\app\build\intermediates\sourceFolderJavaResources\test\debug;C:\Users\kkw\AndroidStudioProjects\MyApplication2\app\build\intermediates\sourceFolderJavaResources\debug;C:\Users\kkw\.gradle\caches\transforms-2\files-2.1\28bcf5b0d931ee26c79115f1c01bcae6\android.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.example.myapplication.ScoreUnitTest

java.lang.AssertionError: 
Expected: is "E"
     but: was "ERROR"
Expected :E
Actual   :ERROR
<Click to see difference>


	at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
	at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
	at com.example.myapplication.ScoreUnitTest.testScoreClassify(ScoreUnitTest.java:40)
    ...
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)


Process finished with exit code -1

 

반응형