Android Unit Test
소개
Android 앱 개발로 Unit Test를 작성하고 있습니까?
드디어 Unit Test를 작성하기 시작했습니다.
그때 얻은 지식을 정리합니다.
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 작성 방법 및 실행
만드는 방법
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를 쓰고 있는 중이므로 다시 정리하려고 합니다.
@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")
}
}
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를 쓰고 있는 중이므로 다시 정리하려고 합니다.
@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를 쓰고 있는 중이므로 다시 정리하려고 합니다.
Reference
이 문제에 관하여(Android Unit Test), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yoppie_x/items/74a9d8fcc4c3004f11cc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)