지난 포스팅에서 왜
테스트 코드를 작성해야 하는지 에 대해 짚어보았다. 이제 어떻게
테스트코드를 작성하는지 알아볼 차례지만, 그 전에 안드로이드에서는 과연 어떤 내용
을 테스트해야 하는지를 짚고 넘어가면 좋을 것 같다.
🤔 안드로이드는 API 서버 개발과 다르게 뷰와 로직도 섞여있을 수 있고, 다양한 사용자의 행동이 입력으로 주어질텐데 다 테스트할 수 있는건가?
나는 스프링으로 REST API 서버 개발만 해 본 적이 있다. 그리고 그 때만 테스트 코드를 작성해봤기 때문에, 안드로이드에 테스트 코드를 적용하려 할 때 위와 같은 의문이 들었다.
이에 대한 해결책은, 당연한 말일 수 있지만 섞여 있는 뷰와 로직을 분리하는 것이다.
안드로이드의 테스트는 크게 로직을 테스트하는 Unit Test, 뷰와 인터랙션 등을 테스트하는 UI Test로 나누어 진행된다. UI Test에서는 뷰에서 일어나는 사용자의 다양한 인터랙션들을 테스트할 수 있도록 훌륭한 도구들이 준비되어 있다. 대강 아웃라인을 잡았으니, 이제 각자 어떤 역할과 특징을 갖는지 자세히 알아보자.
우선 그럴 일이 없게 하자
→ 이전 포스트에서도 얘기했지만, 테스트 코드를 작성하려면 코드의 관심사를 최대한 분리해야 한다. 모듈 간 결합도가 낮아지도록 하는 의존성 주입이나 디자인 패턴 등을 잘 적용해서 테스트가 쉽게 이루어질 수 있도록 하자!
그럼에도 불구하고 섞여있다면
→ 뱅크샐러드에서 테스트 코드 작성법에 대해 작성해준 좋은 글이 있어 가져왔다. 뱅크샐러드는 View에 대한 테스트가 필수적이지는 않다고 생각하며, View에 어쩔 수 없이 로직이 포함되는 경우 Instrumented test를 작성하거나 View로부터 로직을 분리하는 리팩토링을 수행하여 분리된 로직에 대한 테스트 코드를 작성하는 식으로 진행한다고 한다.
MVVM 패턴에서 동작하는 경로는 크게 두 가지로, 다음과 같다.
- view 사용자 이벤트 → viewModel의 함수 실행 → repository에 데이터 요청
- repository에서 데이터가 넘어오면 viewModel은 자신의 상태 변경
유닛 테스트를 통해 우리가 테스트할 관심 객체는 ViewModel이고, 우리가 검증할 것은 ViewModel의 동작이 된다. 따라서 테스트 코드에는 다음 두 가지 내용의 검증이 필요하게 된다.
예시를 들면, NewsViewModel과 NewsRepository가 있다고 하고, NewsViewmodel은 recentNews 데이터와 onClickReadRecentNews() 함수를 갖고 있다고 하자. 이 때, onClick~ 함수는 newsRepository.getRecentNews()함수를 호출해서 데이터를 가져와 NewsViewModel의 recentNews를 갱신한다.
여기서 우리는,
를 테스트해야 한다.
중요한 것은, 여기서 view는 viewModel의 함수를 호출하기만 하고, viewModel의 데이터를 관찰하는 역할만 수행하기 때문에 테스트 코드에서 view에 접근할 필요가 없다!
지금까지 안드로이드에서, 특히 MVVM 패턴으로 개발할 때 어떤 내용을 테스트해야 하는지 알아보았다.
주요 내용을 다시 한 번 정리해보면,
- 안드로이드 테스트는 크게 Unit Test와 UI Test로 나뉜다.
- UI Test는 정책에 따라 필수적이지는 않더라도, Unit Test는 모든 기능에 대해 필수로 작성해야 한다.
- 뷰와 로직이 섞여 있다면 최대한 분리해 따로 테스트하자.
- 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
항상 잘보고 잇으요 ^^