Android Unit Test

소개



Android 앱 개발로 Unit Test를 작성하고 있습니까?
드디어 Unit Test를 작성하기 시작했습니다.
그때 얻은 지식을 정리합니다.
  • Kotlin 1.3.31
  • Mockito-Kotlin 2.1.0
  • Assertj 3.11.1
  • Robolectric 4.2

  • app/build.gradle
    // ...
    
    dependencies {
        // ...
    
        // Mockito-Kotlin
        testImplementation 'com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0'
    
        // Assertj
        testImplementation 'org.assertj:assertj-core:3.11.1'
    
        // Robolectric
        testImplementation 'org.robolectric:robolectric:4.2'
    
        // AndroidX
        androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    }
    

    Unit Test 작성 방법 및 실행



    만드는 방법


  • Android Studio에서 테스트를 만들려는 클래스에서 Command+Shift+T
  • Create New Test... 누르기
  • 필요에 따라서, 테스트 실행전에 실행하는 메소드 setUp/@Before 와 테스트 실행 후에 실행하는 메소드 tearDown/@After 에 체크
  • 테스트 할 방법을 확인하십시오 (위의 이미지)
  • /app/src/test 선택
    (이번에는 Unit Test이므로 /app/src/test를 선택했지만 UI Test의 경우 /app/src/androidTest를 선택합니다.)

    실행



    녹색 재생 버튼을 누르면 클래스 단위 또는 메소드 단위로 테스트를 실행할 수 있습니다.


    Robolectric을 이용한 Unit Test



    Android 프레임 워크에 의존하는 코드를 테스트 할 때 Robolectric을 사용하여 JVM에서 시뮬레이션하여 테스트합니다.
    구현 예 (클립 보드에 문자열을 복사하는 메서드 테스트)가 여기입니다.
    이 예제에서는 AndroidX의 InstrumentationRegistry를 사용하여 context의 인스턴스를 만듭니다.

    UtilTest.kt
    @RunWith(RobolectricTestRunner::class)
    class UtilTest {
    
        @Test
        fun clipBoardCopy() {
            val context = InstrumentationRegistry.getInstrumentation().context
            Util.clipBoardCopy(context, "clip_test")
            val clipboardManager: ClipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
            val clipText = clipboardManager.text
            assertThat(clipText).isEqualTo("clip_test")
        }
    }
    

    또한 Config 어노테이션을 사용하여 에뮬레이트하는 SDK 버전을 지정할 수 있으므로 자세한 내용은 Robolectric을 참조하십시오.

    Assertj의 어설션



    Assertj를 사용하여 어설션을 작성하면 메소드 체인으로 작성할 수 있습니다.
    문자열이나 수치 등, 여러 종류의 어설션이 준비되어 있으므로 편리합니다.
    구현 예가 여기입니다.
    assertThat("Kotlin")
        .isNotBlank()
        .contains("ot")
        .isEqualTo("Kotlin")
    

    Mockito-Kotlin에서 모의 ​​만들기



    모의를 사용하여 테스트를 작성할 때 Mockito라는 라이브러리를 사용하여 작성했습니다.
    Kotlin 사양으로 확장된 Mockito-Kotlin를 사용합니다.
    구현 예가 여기입니다.

    UtilTest.kt
    @RunWith(RobolectricTestRunner::class)
    class UtilTest {
    
        @Test
        fun isNetConnection() {
            val networkInfo: NetworkInfo = mock(name = "NetworkInfo")
            whenever(networkInfo.isConnected).thenReturn(true)
    
            val connectivityManager: ConnectivityManager = mock(name = "ConnectivityManager")
            whenever(connectivityManager.activeNetworkInfo).thenReturn(networkInfo)
    
            val context: Context = mock(name = "Context")
            whenever(context.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(connectivityManager)
    
            assertThat(Util.isNetConnection(context)).isTrue()
        }
    }
    

    마지막으로



    이번에는 Unit Test에 대한 지식을 정리했습니다.
    CI/CD에서의 테스트 실행까지를 목표로 하고 있습니다.
    지금은 UI Test를 쓰고 있는 중이므로 다시 정리하려고 합니다.
  • 좋은 웹페이지 즐겨찾기