Android/Study

[Android] JUnit4으로 테스트 코드 작성하기

Tenacity_Dev 2024. 3. 12. 15:44
728x90

오늘은 테스트에 대해서 공부를 해보자.

 

Junit4란

JUnit은 Java 프로그래밍 언어용 단위 테스트 프레임워크 중 하나이며, 안드로이드 앱의 테스트에도 널리 사용된다. 안드로이드에서는 JUnit 4가 주로 사용되며, 이를 활용하여 단위 테스트 및 통합 테스트를 작성할 수 있다.

 

테스트 코드를 작성하는 이유

  1. 자동화된 테스트 실행: JUnit4를 사용하면 테스트를 자동으로 실행할 수 있다. 안드로이드 스튜디오나 빌드 도구를 통해 테스트를 쉽게 실행하고 결과를 확인할 수 있다. 이는 반복적인 테스트를 통해 개발자가 신속하게 피드백을 받을 수 있게 해주며, 코드 변경 사항에 대한 신뢰성을 높일 수 있다.
  2. 안정성 및 신뢰성 확보: JUnit4를 사용하면 안드로이드 앱의 여러 부분에 대한 단위 테스트를 작성할 수 있다. 단위 테스트는 각각의 기능이나 메소드가 기대한 대로 동작하는지 확인함으로써 안정성과 신뢰성을 확보하는 데 도움을 준다.
  3. 리팩토링 및 변경 관리: 테스트 코드를 작성하면 코드를 변경하거나 리팩토링할 때 기존 동작에 영향을 주는지 빠르게 확인할 수 있다. 이는 코드의 유지보수성을 향상시키고 변경 사항이 기대대로 동작하는지 확인할 수 있게 해준다.
  4. 버그 예방과 디버깅 용이성: 테스트 코드는 버그를 예방하는 데 도움이 되며, 어떤 부분에서 문제가 발생했는지 빠르게 찾아내는 데에도 유용하다. 특히 복잡한 로직이나 특정 조건에서 발생하는 예외 상황을 테스트 코드로 미리 확인할 수 있다.
  5. 지속적 통합 (CI) 및 배포 지원: JUnit4를 사용하면 지속적 통합 시스템에서 자동으로 테스트를 실행하고, 테스트가 성공적으로 통과되었을 때만 빌드를 진행할 수 있다. 이는 안전한 배포를 위해 중요한 단계이다.
  6. 앱의 전반적인 품질 향상: 단위 테스트, 통합 테스트, 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

 

[안드로이드] Android UnitTest 정리

안드로이드 유닛테스트 기본기에 대해 정리하는 포스팅을 하려고 합니다. 안드로이드에는 계측테스트(androidTest)와 로컬단위테스트(test) 로 유닛테스트가 두 종류가 있습니다. 쉽게 설명하면 andr

youngest-programming.tistory.com

https://rkdrkd-history.tistory.com/66

 

[Android, Kotlin] android에서 Junit으로 테스트 코드 작성하기

이번에 정리할 내용은 테스트 코드이다. 다들 테스트 코드라는 말을 들어본 적은 있어도 사용법을 몰라서 사용하지 않았던 경우도 있었을 것이고, 장점에 대해서는 들었지만 확 와닿지 않았기

rkdrkd-history.tistory.com

 

728x90