반응형
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
반응형
'Applied > Unit Test' 카테고리의 다른 글
[JUnit] hamcrest를 이용한 test code 만들기 (0) | 2020.02.08 |
---|---|
[JUnit] Suite annotation을 이용한 집합 테스트 (0) | 2020.02.07 |
[Espresso] Espresso architecture and workflow (0) | 2020.02.05 |
[JUnit] Espresso를 위한 JUnit 기초 (0) | 2020.02.03 |
[Espresso] Espresso 개념 및 환경 구성 (0) | 2020.01.30 |