Post

Android Test Code 도입기 2편 - 느낀점

사전 조사를 마치고 본격적으로 테스트 코드를 작성하면서 겪은 시행착오와 개인적으로 느낀점을 공유합니다. 순수 개인 의견이니 참고 바랍니다.

테스트 코드가 어렵게 느껴진 이유

테스트 시나리오가 앱의 상황에 따라 다양해지기 때문에 명확한 가이드라인이나 자료가 없습니다. 다양한 회사에서 테스트 코드 도입을 시도한 자료는 있지만, 앱 구조와 기술 스택이 다르기 때문에 스스로 답을 찾아야 하는 부분이 있습니다. 예를 들어 xml로 작성된 앱과 compose로 작성된 앱에서 UI를 테스트할 때 두 앱에서 테스트 코드를 작성하는데 한계의 차이는 분명 존재한다고 생각합니다. 이러한 상황에 따라 테스트 케이스에 대해 고민할 부분도 다르기 때문에 더욱더 어렵게 느껴졌습니다.

뭐 부터 해야하지?

본격적으로 테스트 코드 시나리오를 작성하려고 보니, 무엇부터 스터디해야 하며 어떤 방식으로 코드를 작성해야 할지 막막했습니다. 피겨스케이팅을 배우는데 처음부터 김연아처럼 트리플 악셀을 할 필요는 없다는 마음으로 일단 눈앞에 보이는 것부터 시작하기로 했습니다. 처음 생각난 테스트 케이스는 로그인 화면에서 비밀번호 유효성 체크에 관련된 시나리오였고, 저는 바로 이 부분에 대해서 작성을 시작했습니다. 일단 테스트 코드 작성하는 방법에 대해서 알아야 하니까 공식 문서에서 제공하는 code lab을 천천히 읽어가면서 공부를 했습니다. 에듀윌 합격앱에서는 Hilt를 적용하고 있기 때문에 테스트 코드에 Hilt를 적용하는 방법에 대해 공식 문서를 읽어 봤습니다. 이렇게 시나리오를 하나 정하고 한걸음씩 나아갈 때 마다 필요한 것들을 찾으면서 테스트 코드를 작성해 나아가니 어떤것을 공부해야하고 어떤 부분을 배워야할지 눈에 보이기 시작했습니다. 테스트 코드를 작성하면서 처음 안드로이드 스튜디오를 키고 Activity를 만드는 마음가짐으로 돌아간 느낌이였습니다.

좋은 테스트 코드에 대한 고민

테스트 코드 작성하면서 어떤 테스트 코드가 좋은 코드일까?라는 고민을하게 됐습니다. 정답은 없겠지만 제가 생각한 좋은 테스트 코드는 다음과 같습니다.

CS나 버그가 발생했을 때 즉각 확인이 가능해야 합니다.

테스트 코드를 통해서 즉각 원인을 빠르게 파악이 가능하다면, 이는 제가 생각한 테스트 코드의 취지에 딱 맞다고 생각합니다. 이를 통해 좀 더 빠르고 정확하게 CS 처리와 버그 수정이 가능하다면 비즈니스적인 측면에서도 많은 기여를 하게 됩니다.

다양한 케이스에 대해서 테스트가 가능해야 합니다.

좋은 코드의 조건 중에 확장성이 있듯이, 테스트 코드에서도 테스트 케이스에 대한 확장성을 고려해야 한다고 생각합니다. 테스트 코드 함수 안에서 쉽게 변수명만 변경한다 했을 때 케이스가 다양하게 나옴으로써 다양한 시나리오를 테스트할 수 있다면 이 또한 좋은 테스트 코드라고 생각합니다.

테스트 코드를 작성하면서 깨달은 점

UI 테스트는 mock 데이터를 만들어서 하는게 좋습니다.

만약 앱이 View, ViewModel, Data 영역이 분리됐다면, View 테스트 코드는 mock 데이터를 직접 만들어서 작성하는 것이 좋다는 결론을 내렸습니다. 앱은 서버의 데이터를 받아와서 UI를 구현하는 것이 기본 동작이므로 처음 UI 관련 테스트 코드를 작성할 때 API를 찔러서 UI를 구성하여 테스트를 한다면, Test 함수의 코드 길이는 길어지고 예외 처리 등 고려할 사항이 많아져 복잡해집니다. API 테스트 및 검증은 ViewModel 또는 Repository 모듈을 테스트할 때 하면 됨으로 중복해서 테스트할 이유가 없으며 mock 데이터로 UI 테스트 시 임의로 데이터를 수정하여 테스트가 가능하다는 장점이 있습니다.

앱 구조가 공식 가이드에 맞춰져 있어서 테스트 코드 작성이 편했습니다.

android_app_structure

에듀윌 합격앱 개편 때 앱 구조를 Android Developer 가이드에 맞게 위 그림과 같이 리팩토링 작업을 진행한 뒤에 테스트 코드를 작성했습니다. View, ViewModel, UseCase, Repository, Datasource 모듈이 분리가 되니 함수 또한 목적이 분명하여 테스트 코드 작성하는데 큰 어려움이 없었습니다.

테스트 코드 도입기를 마치며

테스트 코드 도입은 분명 쉽지 않은 여정입니다. 회사 앱 하나에 정말 수 많은 기능들이 있으며 시나리오 또한 매우 다양함으로 이미 만들어진 앱을 처음부터 전체 시나리오에 대해 테스트 코드 작성한다면 현실적으로 불가능에 가깝다고 생각합니다. 만약 이상적으로 테스트 코드까지 도입한다 하면, 앱 전체적인 리팩토링 혹은 신규 앱 개발 프로젝트에서 기능 개발과 동시에 테스트 코드 작성이 이루어져야 한다고 생각합니다. 하지만 현실적으로 생각하면 대부분의 회사에서는 개발 일정을 줄이려는 노력을 많이 하고 있기 때문에 추가적인 작업을 요구하는 테스트 코드 도입이 매우 어려울 가능성이 있는 것도 사실입니다. 그럼에도 테스트 코드는 개발자, 더 나아가 비즈니스 측면에서도 우리에게 큰 도움이 된다고 생각함으로 기회가 된다면 테스트 코드 도입은 필요하다고 느낍니다. 아직 가야 할 길이 많고 배울 것도 많지만, 어제보다 더 나은 테스트 코드를 작성하기 위해 더 정진할 예정입니다.

읽어주셔서 감사합니다!

참고 할만한 샘플 코드

nowinandroid
testing-samples

This post is licensed under CC BY 4.0 by the author.