【Android】TestParameterInjector를 사용하여 Parameterized 테스트를 실시합시다

소개



Google이 내놓고 있는 TestParameterInjector 을 사용하면, 빠르고 쉽게 Parameterized 테스트(파라미터화 테스트)를 쓸 수 있었으므로, 샘플 코드등을 실면서 설명하고 싶습니다.

TestParameterInjector에 관하여



자세한 것은 ㅡㅡㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ 오 g b b g. 이 m/2021/03/인 t로즈신 g-하고 st 파라메 린지 c와 r. HTML의 블로그 기사를 참고해 주시면 좋겠습니다만, 간단하게 정리하면…
  • Google이 2021년 3월에 공개한 JUnit4 Test Runner
  • Google 코드베이스에서 새로운 테스트에 가장 많이 사용되는 프레임 워크

  • TestParameterInjector is now the most used framework for new tests in the Google codebase:

    라는 느낌입니다.

    사용하는 경우
    testImplementation 'com.google.testparameterinjector:test-parameter-injector:1.3'
    

    그리고 dependencies 에 추가하면 OK입니다. ( 1.3 는 쓰기시 버전)

    샘플 코드



    샘플 코드를 섞으면서 TestParameterInjector 를 사용하면 어떻게 될지 설명합니다.

    Piyo



    테스트 대상 코드로 Piyo 클래스를 준비했습니다.
    say 메서드가 있고 인수의 value
  • 2로 나눌 때 "piyopiyo"
  • 그렇지 않으면 "piyo"

  • 반환합니다.
    class Piyo {
        fun say(value: Int): String {
            return when {
                value % 2 == 0 -> "piyopiyo"
                else -> "piyo"
            }
        }
    }
    

    PiyoTest


    Piyo 에 대해 TestParameterInjector 를 사용하지 않고 소박한 테스트 코드를 작성하면 다음과 같이 될까요?
  • 2 때 "piyopiyo"인 것
  • 1, 3 일 때 "piyo"일 것
  • 0 일 때는 "piyopiyo"입니다

  • 보시면 알 수 있습니다만, 파라미터의 값( value )과 Assertion시의 값이 다른 이외는 거의 중복된 코드가 되어 버리고 있습니다.
    class PiyoTest {
    
        @Test
        fun piyo_say_piyopiyo_when_2() {
            val value = 2 // ここと
            val piyo = Piyo()
    
            val result = piyo.say(value)
    
            Assert.assertEquals("piyopiyo", result) // ここが違うだけ
        }
    
        @Test
        fun piyo_say_piyo_when_1() {
            val value = 1
            val piyo = Piyo()
    
            val result = piyo.say(value)
    
            Assert.assertEquals("piyo", result)
        }
    
        @Test
        fun piyo_say_piyo_when_3() {
            val value = 3
            val piyo = Piyo()
    
            val result = piyo.say(value)
    
            Assert.assertEquals("piyo", result)
        }
    
        @Test
        fun piyo_say_piyopiyo_when_0() {
            val value = 0
            val piyo = Piyo()
    
            val result = piyo.say(value)
    
            Assert.assertEquals("piyopiyo", result)
        }
    }
    

    TestParameterInjector를 사용해보기


    Piyo 에 대해 TestParameterInjector 를 사용해 파라미터화 테스트를 작성해 보면 다음과 같이 됩니다.
    @RunWith(TestParameterInjector::class) // ← ①
    class PiyoTest2 {
    
        // ↓ ②
        enum class PiyoTestCase(val value: Int, val expected: String) {
            CASE0(0, "piyopiyo"),
            CASE1(1, "piyo"),
            CASE2(2, "piyopiyo"),
            CASE3(3, "piyo"),
        }
    
        // ↓ ③
        @Test
        fun piyo_say(@TestParameter piyoTestCase: PiyoTestCase) {
            val value = piyoTestCase.value // valueを使う
            val piyo = Piyo()
    
            val result = piyo.say(value)
    
            Assert.assertEquals(piyoTestCase.expected, result) // expectedを使う
        }
    }
    
  • @RunWith 에서 TestParameterInjector 지정
  • PiyoTestCase 에서 인수( value )와 기대값( expected )의 조합 정의
  • 테스트의 인수에 @TestParameter 를 지정한 PiyoTestCase 를 지정한다

  • 이렇게하면

    테스트 코드 piyo_say의 인수가
    - CASE0의 경우
    - CASE1의 경우
    - CASE2의 경우
    - CASE3의 경우

    그리고 네 번 호출됩니다.

    ↓실행한 결과도 이와 같이, 테스트 메소드는 1인데, 4개의 테스트 결과가 출력됩니다.

    TestParameterInjector 의 적용 전·후에서 테스트 코드가 상당히 깨끗이 한 것을 알 수 있을까 생각합니다.

    기타 방법



    위의 샘플 코드는 테스트 케이스를 enum으로 정의하고 테스트 메소드의 인수에 전달하는 방법이었지만,
  • Boolean 또는 Int 사용
  • @TestParameter 주석으로 필드에 정의

  • 등도 가능합니다.
    필드에 정의하면 테스트 코드 전체에서 매개 변수화되고 실행됩니다.
    @RunWith(TestParameterInjector::class)
    class MyTest {
    
        @TestParameter
        var isDryRun = false
    
        @TestParameter("1", "2", "3")
        var i = 0
    
        @Test
        fun test1(@TestParameter enableFlag: Boolean) {
            // 12通りの組み合わせで呼ばれる
            // test1[isDryRun=false,i=1,false]
            // test1[isDryRun=false,i=1,true]
            // test1[isDryRun=false,i=2,false]
            // test1[isDryRun=false,i=2,true]
            // test1[isDryRun=false,i=3,false]
            // test1[isDryRun=false,i=3,true]
            // test1[isDryRun=true,i=1,false]
            // test1[isDryRun=true,i=1,true]
            // test1[isDryRun=true,i=2,false]
            // test1[isDryRun=true,i=2,true]
            // test1[isDryRun=true,i=3,false]
            // test1[isDryRun=true,i=3,true]
        }
    
        @Test
        fun test2() {
            // 6通りの組み合わせで呼ばれる
            // test2[isDryRun=false,i=1]
            // test2[isDryRun=false,i=2]
            // test2[isDryRun=false,i=3]
            // test2[isDryRun=true,i=1]
            // test2[isDryRun=true,i=2]
            // test2[isDryRun=true,i=3]
        }
    }
    

    또 Advanced usage 로서 동적인 @TestParameter 의 생성등도 할 수 있는 것 같기 때문에, 흥미가 있는 분은 봐도 좋을지도 모릅니다.
    htps : // 기주 b. 코 m / go g / st 파라메 린지 c와 r # 아 d

    끝에


    TestParameterInjector 에 대한 간단한 설명과 샘플 코드를 소개했습니다.
    테스트 코드가 놀라울 정도로 깨끗이 하기 때문에, 사용할 수 있는 곳에서는 적극적으로 사용해, 즐겁게 테스트 코드를 써 가고 싶은 곳입니다.

    좋은 웹페이지 즐겨찾기