Android Test - 2) 무엇을 테스트해야 하나요?

ENAN·2021년 7월 13일
0

Android Test

목록 보기
2/2

지난 포스팅에서 테스트 코드를 작성해야 하는지 에 대해 짚어보았다. 이제 어떻게 테스트코드를 작성하는지 알아볼 차례지만, 그 전에 안드로이드에서는 과연 어떤 내용을 테스트해야 하는지를 짚고 넘어가면 좋을 것 같다.

안드로이드에서는 무엇을 테스트하나요?

🤔 안드로이드는 API 서버 개발과 다르게 뷰와 로직도 섞여있을 수 있고, 다양한 사용자의 행동이 입력으로 주어질텐데 다 테스트할 수 있는건가?

나는 스프링으로 REST API 서버 개발만 해 본 적이 있다. 그리고 그 때만 테스트 코드를 작성해봤기 때문에, 안드로이드에 테스트 코드를 적용하려 할 때 위와 같은 의문이 들었다.

이에 대한 해결책은, 당연한 말일 수 있지만 섞여 있는 뷰와 로직을 분리하는 것이다.
안드로이드의 테스트는 크게 로직을 테스트하는 Unit Test, 뷰와 인터랙션 등을 테스트하는 UI Test로 나누어 진행된다. UI Test에서는 뷰에서 일어나는 사용자의 다양한 인터랙션들을 테스트할 수 있도록 훌륭한 도구들이 준비되어 있다. 대강 아웃라인을 잡았으니, 이제 각자 어떤 역할과 특징을 갖는지 자세히 알아보자.

안드로이드 테스트의 종류

  1. Unit Test
  • 일반적으로 코드의 유닛 단위(메소드, 클래스, 컴포넌트)의 기능을 실행하는 방식으로, 비즈니스 로직이나 데이터 접근 등 Android Component가 필요하지 않은 부분을 테스트
  • 앱을 빌드하고 실행시키는 과정이 필요하지 않아 JVM에서 바로 실행됨 → 빠름
  • 관련 툴: JUnitMockitoPowerMock
  1. UI Test (Instrumentation Test)
  • 사용자 인터랙션(버튼 클릭, 텍스트 입력 등)에 따른 결과를 평가하며 Android 프레임워크에 의존성이 있는 코드를 테스트
  • 실제로 앱을 빌드하고 실행시키는 과정이 포함되어 속도가 느림
  • Robolectric 같은 Integration test 도구를 사용하면 Instrument API를 shadow로 바꿔 처리해서, Android 프레임워크에 의존성이 있는 코드를 Unit test로 작성할 수 있음 (자세한 내용은 다음에 따로 포스팅할 예정!)
  • 관련 툴: EspressoUIAutomatorRobotiumAppiumCalabashRobolectric

뷰와 로직이 섞여 있는 경우는?

우선 그럴 일이 없게 하자

→ 이전 포스트에서도 얘기했지만, 테스트 코드를 작성하려면 코드의 관심사를 최대한 분리해야 한다. 모듈 간 결합도가 낮아지도록 하는 의존성 주입이나 디자인 패턴 등을 잘 적용해서 테스트가 쉽게 이루어질 수 있도록 하자!

그럼에도 불구하고 섞여있다면

뱅크샐러드에서 테스트 코드 작성법에 대해 작성해준 좋은 글이 있어 가져왔다. 뱅크샐러드는 View에 대한 테스트가 필수적이지는 않다고 생각하며, View에 어쩔 수 없이 로직이 포함되는 경우 Instrumented test를 작성하거나 View로부터 로직을 분리하는 리팩토링을 수행하여 분리된 로직에 대한 테스트 코드를 작성하는 식으로 진행한다고 한다.

MVVM 패턴에서 테스트코드 작성하기

MVVM 패턴에서 동작하는 경로는 크게 두 가지로, 다음과 같다.

  1. view 사용자 이벤트 → viewModel의 함수 실행 → repository에 데이터 요청
  • 여기서, view는 이벤트 발생이 감지되면 단순히 viewModel의 함수를 호출하기만 한다.
  1. repository에서 데이터가 넘어오면 viewModel은 자신의 상태 변경
  • 여기서, view가 갱신되는 것은 viewModel의 역할이 아니다! view는 알아서 viewModel의 데이터를 관찰하고, 변경되면 최신 데이터로 갱신할 테니 viewModel은 view가 처음 시킨 대로 repository와 통신하고 자신의 상태만 변경하면 되는 것!

유닛 테스트를 통해 우리가 테스트할 관심 객체는 ViewModel이고, 우리가 검증할 것은 ViewModel의 동작이 된다. 따라서 테스트 코드에는 다음 두 가지 내용의 검증이 필요하게 된다.

  • 관심 객체(ViewModel)의 상태 변화
  • 외부 객체(Repository)의 함수 호출 여부

예시를 들면, NewsViewModel과 NewsRepository가 있다고 하고, NewsViewmodel은 recentNews 데이터와 onClickReadRecentNews() 함수를 갖고 있다고 하자. 이 때, onClick~ 함수는 newsRepository.getRecentNews()함수를 호출해서 데이터를 가져와 NewsViewModel의 recentNews를 갱신한다.

여기서 우리는,

  1. viewModel의 onClickReadRecentNews() 함수가 실행되었을 때, recentNews의 값이 변하는지
  2. viewModel의 onClickReadRecentNews() 함수가 실행되었을 때, newsRepository.getRecentNews()함수가 실행되는지

를 테스트해야 한다.

중요한 것은, 여기서 view는 viewModel의 함수를 호출하기만 하고, viewModel의 데이터를 관찰하는 역할만 수행하기 때문에 테스트 코드에서 view에 접근할 필요가 없다!

정리

지금까지 안드로이드에서, 특히 MVVM 패턴으로 개발할 때 어떤 내용을 테스트해야 하는지 알아보았다.

주요 내용을 다시 한 번 정리해보면,

  1. 안드로이드 테스트는 크게 Unit Test와 UI Test로 나뉜다.
  2. UI Test는 정책에 따라 필수적이지는 않더라도, Unit Test는 모든 기능에 대해 필수로 작성해야 한다.
  3. 뷰와 로직이 섞여 있다면 최대한 분리해 따로 테스트하자.
  4. MVVM 패턴에서 Unit Test 시, viewModel의 역할에 따라 viewModel의 상태 변화와 repository의 함수 호출 여부를 테스트하자.

다음 포스트에서는 안드로이드에서는 어떻게 테스트코드를 작성하는지, 그 방법을 알아보자!

참고

https://blog.banksalad.com/tech/test-in-banksalad-android/
https://academy.realm.io/kr/posts/aw212-android-unit-ui-test-recorder-data-binding-include/?w=1
https://meetup.toast.com/posts/184
https://meetup.toast.com/posts/187
https://greedy0110.tistory.com/56

profile
여정이 곧 보상

1개의 댓글

항상 잘보고 잇으요 ^^

답글 달기