Android/Study
[Android] JUnit4으로 테스트 코드 작성하기
Tenacity_Dev
2024. 3. 12. 15:44
728x90
오늘은 테스트에 대해서 공부를 해보자.
Junit4란
JUnit은 Java 프로그래밍 언어용 단위 테스트 프레임워크 중 하나이며, 안드로이드 앱의 테스트에도 널리 사용된다. 안드로이드에서는 JUnit 4가 주로 사용되며, 이를 활용하여 단위 테스트 및 통합 테스트를 작성할 수 있다.
테스트 코드를 작성하는 이유
- 자동화된 테스트 실행: JUnit4를 사용하면 테스트를 자동으로 실행할 수 있다. 안드로이드 스튜디오나 빌드 도구를 통해 테스트를 쉽게 실행하고 결과를 확인할 수 있다. 이는 반복적인 테스트를 통해 개발자가 신속하게 피드백을 받을 수 있게 해주며, 코드 변경 사항에 대한 신뢰성을 높일 수 있다.
- 안정성 및 신뢰성 확보: JUnit4를 사용하면 안드로이드 앱의 여러 부분에 대한 단위 테스트를 작성할 수 있다. 단위 테스트는 각각의 기능이나 메소드가 기대한 대로 동작하는지 확인함으로써 안정성과 신뢰성을 확보하는 데 도움을 준다.
- 리팩토링 및 변경 관리: 테스트 코드를 작성하면 코드를 변경하거나 리팩토링할 때 기존 동작에 영향을 주는지 빠르게 확인할 수 있다. 이는 코드의 유지보수성을 향상시키고 변경 사항이 기대대로 동작하는지 확인할 수 있게 해준다.
- 버그 예방과 디버깅 용이성: 테스트 코드는 버그를 예방하는 데 도움이 되며, 어떤 부분에서 문제가 발생했는지 빠르게 찾아내는 데에도 유용하다. 특히 복잡한 로직이나 특정 조건에서 발생하는 예외 상황을 테스트 코드로 미리 확인할 수 있다.
- 지속적 통합 (CI) 및 배포 지원: JUnit4를 사용하면 지속적 통합 시스템에서 자동으로 테스트를 실행하고, 테스트가 성공적으로 통과되었을 때만 빌드를 진행할 수 있다. 이는 안전한 배포를 위해 중요한 단계이다.
- 앱의 전반적인 품질 향상: 단위 테스트, 통합 테스트, UI 테스트 등을 통합하여 다양한 수준에서 테스트를 수행함으로써 안드로이드 앱의 전반적인 품질을 향상시킬 수 있다.
실제 Android에서 JUnit4 사용기
interface GitHubApi {
@GET("users/{username}")
suspend fun getUser(@Path("username") username: String): Response<User>
}
data class User(val login: String, val name: String, val publicRepos: Int)
class GitHubService(private val gitHubApi: GitHubApi) {
suspend fun getUser(username: String): User? {
return try {
val response = gitHubApi.getUser(username)
if (response.isSuccessful) {
response.body()
} else {
null
}
} catch (e: Exception) {
null
}
}
}
위는 안드로이드에서 Retrofit을 사용해 네트워크 호출을 수행하는 클래스를 테스트하는 코드를 작성하였다.
이 코드를 기반으로 Test코드를 작성해보자.
import io.mockk.coEvery
import io.mockk.mockk
import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Before
import org.junit.Test
import retrofit2.Response
class GitHubServiceTest {
private lateinit var gitHubService: GitHubService
private lateinit var gitHubApi: GitHubApi
@Before
fun setUp() {
gitHubApi = mockk()
gitHubService = GitHubService(gitHubApi)
}
@Test
fun testGetUserSuccess() = runBlocking {
// Arrange
coEvery { gitHubApi.getUser(any()) } returns Response.success(User("testUser", "Test User", 10))
// Act
val result = gitHubService.getUser("testUser")
// Assert
assertEquals("testUser", result?.login)
assertEquals("Test User", result?.name)
assertEquals(10, result?.publicRepos)
}
@Test
fun testGetUserFailure() = runBlocking {
// Arrange
coEvery { gitHubApi.getUser(any()) } returns Response.error(404, mockk())
// Act
val result = gitHubService.getUser("nonExistingUser")
// Assert
assertNull(result)
}
}
위와같이 JUnit4를 이용하여 테스트를 진행할 수 있다.
JUnit4에는 많은 함수들이 존재함으로 함수에 대한 학습이 필요할 것 같다. 시간이 된다면 추후 또 공부를 해보면서 작성을 해보겠다.
참고
https://youngest-programming.tistory.com/492
https://rkdrkd-history.tistory.com/66
728x90