RIEN😚
이상한 나라의 개발자
RIEN😚
전체 방문자
오늘
어제
  • 분류 전체보기 (124)
    • Algorithm (68)
      • 알고리즘 (0)
      • Baekjoon (8)
      • 프로그래머스 (55)
      • HackerRank (5)
    • Android (30)
      • Project (1)
      • Error (2)
      • Studio (1)
      • Android (26)
    • Kotlin (6)
    • CS (4)
      • 네트워크 (2)
      • 데이터베이스 (2)
    • Front End (5)
      • React (1)
      • VUE (3)
      • Project (0)
      • 기타 (1)
    • 기록 (10)
      • 회고록 (5)
      • TIL (5)

블로그 메뉴

  • Github🔥
  • 포트폴리오🌹

공지사항

인기 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
RIEN😚

이상한 나라의 개발자

Android/Android

[Android:Codelab] Dependency Injection and Test Doubles - 1

2023. 1. 24. 13:41
728x90
반응형
 

Advanced Android in Kotlin 05.2: Introduction to Test Doubles and Dependency Injection  |  Android Developers

In this codelab you’ll learn to set up manual dependency injection, a service locator, and how to use fakes and mocks in your Android Kotlin apps. In doing so, you’ll learn how to test a repository and write fragment integration tests.

developer.android.com

안드로이드 독학하기!

테스트 Codelab을 이어서 진행하고 있습니다.😆

이전에는 viewModel에 제한된 간단한 기능만 테스트 해보았다면 이번에는 test Double를 이용하는 방법으로 테스트하는 방법을 학습해보고자 합니다.🤗

 

1. 이번 Codelab에서는

- test double를 안드로이드에서 사용하는 방법

- Service Locator pattern의 DI와 라이브러리를 사용하여 test double를 구현하는 방법

- Repository unit tests

- Fragment와 ViewModel의 integration tests

- Fragment navigation tests

 

2. Codelab 프로젝트

이번 Codelab에서 활용할 프로젝트는 Testing Basics 포스트에서도 활용한 TO-DO Notes App입니다.

 

GitHub - googlecodelabs/android-testing: Android Testing Codelab

Android Testing Codelab. Contribute to googlecodelabs/android-testing development by creating an account on GitHub.

github.com

 

3. 테스트 전략 세우기

테스트를 작성하는 방법에 대해 공부하기 전에 무엇을 테스트할지, 어떻게 테스트를 작성할지 기획하는 단계에 대해서 먼저 알아보도록 하겠습니다.

 

3.1 용어

3.1.1 Scope(범위)

- 테스트와 관련된 코드가 얼마나 되는가?

- 하나의 메서드만을 테스트할 수도 있고, 앱 전체를 통틀어 테스트할 수도 있습니다.

 

3.1.2 Speed(속도)

- 테스트가 얼마나 빠르게 수행되는가?

 

3.1.3 Fidelity(정확도)

- 테스트가 얼마나 실제 상황을 반영하는가?

- 네트워크 요청을 테스트할 때, 실제 서버로부터 데이터를 받아와 테스트를 하는지(높은 정확도), fake 데이터를 사용하는지 구분할 수 있습니다.

🌹 높은 정확도는 낮은 속도의 원인이 될 수 있고, 이와 반대로 높은 속도로 수행되는 테스트는 낮은 정확도를 제공할 수 있습니다.

 

3.2 테스트 피라미드

일반적으로 자동 테스트는 Unit test, Integration test, End-to-end test 이 3가지로 분류됩니다.

이러한 분류 방법은 대게 피라미드로 표현되는데, Unit test가 가장 아래단으로 많은 부분을 차지하는 것을 알 수 있습니다.

3.2.1 Unit test

- Unit test는 하나의 클래스, 특히 해당 클래스 내의 하나의 메서드에 대한 테스트를 의미합니다.

- 매우 작은 단위의 코드를 테스트하기 때문에 만약 Unit test에서 실패한다면 코드 내 어디서 문제가 발생하고 있는지 정확히 알 수 있다는 장점이 있습니다.

- 하지만 실제 앱을 사용할 때는 하나의 클래스(또는 하나의 메서드)만을 사용하지 않기 때문에 실제 상황을 완벽히 반영하지 못한다는 단점이 있습니다.

- 대부분의 테스트가 실제 기기가 아닌 로컬 테스트로 이루어집니다.

예를 들어, viewModel과 Repository의 한 메서드를 테스트하는 것은 Unit test입니다.

🌹 높은 속도, 낮은 정확도

 

3.2.2 Integration test

- 여러 클래스가 함께 사용되었을 때 정상적으로 작동하는지 확인하는 테스트를 의미합니다.

- 주로 하나의 기능을 단위로 테스트 코드를 작성합니다.

- Unit test보다 높은 정확도를 제공하지만 Unit test만큼 빠르게 수행됩니다.

- 로컬 환경과 실제 기기 둘 모두에서 테스트를 수행할 수 있습니다.

예를 들어, 하나의 fragment(화면)과 해당 fragment에서 사용되는 viewModel의 모든 기능을 테스트하는 것이 Integration test에 속합니다.

 

3.2.3 End-to-end test(E2e)

- 여러 기능이 함께 동작하였을 때 정상적으로 작동하는지 확인하는 테스트를 의미합니다.

- 다른 두 테스트보다 실제 앱을 사용하는 상황이 반영된 테스트입니다. 이 때문에 테스트를 수행하는데 많은 시간이 필요하기는 하지만 높은 정확도를 가지고 있습니다.

- 실제 기기에서 테스트가 이루어집니다.

🌹 낮은 속도, 높은 정확도

 

3.3 테스트와 앱 아키텍처

위에서 본 테스트 피라미드로 나뉘어진 각 테스트들을 수행할 수 있는지 여부는 앱을 얼마나 잘 설계하였는지와 긴밀한 관련이 있습니다.

 

예를 들어, 잘 설계되지 않은 어플리케이션은 하나의 메서드의 모든 로직을 넣을 수도 있습니다.

이런 경우에는 하나의 메서드를 나누어 테스트하는 Unit test나 하나의 기능만을 테스트하는 Integration test는 아무런 의미가 없는 것을 알 수 있습니다. 따라서 End-to-end test로 앱의 큰 부분을 한번에 테스트하는 수 밖에 없습니다.

 

이를 해결하기 위한 가장 좋은 방법은 앱의 로직을 여러 메서드와 클래스로 세분화하여, 각 조각(부분)들을 독립적으로 테스트할 수 있도록 하는 것입니다.

Unit 테스트와 Integration 테스트를 쉽게 작성하기 위해 어떻게 코드를 세분화하고 구성하는지에 대한 방법을 정리한 것이 바로 아키텍처입니다.

 

👇🏻 TO-DO Notes App의 아키텍처

 

이 코드랩에서는 위 아키텍처의 각 부분들을 어떻게 독립적으로 테스트할 수 있는지에 대해서 학습해 보겠습니다.

  1. Repository Unit test
  2. test double을 이용한 ViewModel Unit test & Integration test
  3. fragment와 관련된 viewModel들의 Integration test
  4. Navigation Component의 Integration test

 


테스트와 관련된 두 번째 코드랩 Dependency Injection and Test Doubles의 첫 번째 포스트였습니다.🤗

간단한 테스트 방법에 대해서 천천히 알아가고 있다는 느낌(?)이 드네요.

 

코드랩이 완료되면 직접 앱을 개발해보면서 테스트 코드를 작성해보면서 다시 한번 더 복습해보는 시간을

가져볼 필요가 있을거 같습니다.😭

 

홧팅!!🔥

감사합니다.😌

반응형

'Android > Android' 카테고리의 다른 글

[Android:Codelab] Dependency Injection and Test Doubles - 3  (0) 2023.01.25
[Android:Codelab] Dependency Injection and Test Doubles - 2  (0) 2023.01.24
[Android:Codelab] Testing Basic-4  (0) 2023.01.24
[Android:Codelab] Testing Basic-3  (0) 2023.01.21
[Android:Codelab] Testing Basic-2  (0) 2023.01.20
    'Android/Android' 카테고리의 다른 글
    • [Android:Codelab] Dependency Injection and Test Doubles - 3
    • [Android:Codelab] Dependency Injection and Test Doubles - 2
    • [Android:Codelab] Testing Basic-4
    • [Android:Codelab] Testing Basic-3
    RIEN😚
    RIEN😚
    안드로이드 / 코틀린 독학으로 취업하자!

    티스토리툴바