[Android] 안드로이드 integration test 어떻게 하죠?

윤호이·2023년 11월 22일
1

Test

목록 보기
11/13
post-thumbnail

서론

제가 테스트에 대해 다루면서 Unit 과 UI 테스트를 많이 다뤄봤습니다.

하지만 Integration, 즉 통합 테스트에 대해 다룬 적이 없더군요

혹은 다룬 적이 있는데도 잘 모르는 것일 수 도 있고요,

오늘은 통합 테스트에 대해 제대로 알아보고자 합니다.

안드로이드 테스트의 종류

Unit test

가장 많이 다루는 테스트입니다.
코드의 유닛(단위)을 테스트합니다.
메소드, 클래스, 컴포넌트등 한가지 기능을 간단하게 테스트합니다.

Integration test

모듈간에 이뤄지는 테스트 입니다.
단위 테스트가 끝난 모듈을 합쳐서 잘 동작하는지 테스트합니다.

UI test

사용자가 UI를 사용하는 경우를 테스트 합니다.
버튼 클릭, 입력, UI 표시등 상호 작용을 확인합니다.

그래서 Integration test 왜 필요한데?

각각의 기능은 잘 동작할지 몰라도 막상 모듈을 합쳐보면 엉뚱하게 동작 할 수도

있기 때문입니다.


https://twitter.com/codejobs/status/813056723271450624

상황이 웃기지 않나요? ㅋㅋ

이런 상황을 방지 하기위해 모듈간 통합테스트가 필요합니다.

Integration Test

ModuleA

class ModuleA {
    fun performAction(data: String) = data + "_performed!"
}

class ModuleATest {

    @Test
    fun performActionTest(){
        val moduleA = ModuleA()

        val result = moduleA.performAction("some action")

        assert(result == "some action_performed!")
    }
}

ModuleB


class ModuleB {
    fun processData(data: String) = "process: $data"
}

class ModuleBTest {

    @Test
    fun processDataTest(){
        val moduleB = ModuleB()

        val result = moduleB.processData("test")

        assert(result == "process: test")
    }
}

Some Module using Module A and B

아주 아주 간단한 상황을 예시로 들어봤습니다.

모듈 A와 모듈 B가 각각 유닛테스트를 성공하고

A와 B를 모두 사용하는 한 모듈에서 A 와 B 의 통합테스트를 한다고 해봅시다.

의존성 그래프는 이렇게 될겁니다.


class IntegrationTest {

    @Test
    fun test_interaction_between_modules() {
        val moduleA = ModuleA()
        val moduleB = ModuleB()

        val data = moduleA.performAction("some_action")
        val result = moduleB.processData(data)

        assertEquals("process: some_action_performed!",result)
    }
}

해당 코드를 보시면 모듈 A B를 동시에 사용해서
모듈 A의 결과를 모듈 B에 넘겨서 테스트 하는 것을 볼 수 있습니다.

이렇게 모듈 A 와 B 의 상호 작용을 테스트 하는 것이 통합테스트 입니다.

안드로이드에서 어떤 상황에 통합테스트를 할까?

방금전 상황을 떠올려 보겠습니다. 모듈 A와 B를 동시에 사용하는 모듈에서 통합 테스트를 진행했었죠?

Network 모듈과 DataBase 모듈에 의존성을 가지는 Core 모듈이 있다고 해봅시다.

Feature 모듈을 만들 때 사용하는 공통 모듈인 Core 모듈에서는 각각의 모듈간에 상호작용이

일어납니다.

  • Network : Api 호출을 테스트
  • Database : Entity 저장과 불러오기를 테스트

예시 상황

API 호출을 할경우 데이터 베이스를 확인하고 캐시된 정보가 있으면 API 호출을 하지않고
데이터 베이스값을 불러온다.

해당 상황을 테스트 하려면 Network 와 Database 둘에 의존성을 가진 Core 모듈에서

통합적으로 테스트 해주는게 맞겠죠?

class CoreTest {

    @Test
    fun loadDataTest() {
        val network = NetworkModule()
        val database = DatabaseModule()

        val data = if (database.getData().isEmpty()) {
            val newData = network.fetchData()
            database.saveData(newData)
            newData
        } else {
            database.loadData()
        }

        assert(data.isNotEmpty())
    }
}

대충 이런 느낌이겠죠?

코드는 느낌만 내기 위에 작성한 더미 코드입니다.

하고 싶은 말

Integration Test 도 소홀히 하지말고 잘 작성해줍시다.

모듈 단위 Unit test도 중요하지만 작성된 모듈간 상호작용이 잘 일어나는지

체크하는 것도 중요합니다.

참조

https://medium.com/android-testing-daily/unit-test-vs-integration-tes-fba13b92fbf6

profile
열정은 내 삶의 방식, 꾸준함은 내 삶의 증명

0개의 댓글