금번에 신규 업데이트를 준비하면서 이전부터 해보고 싶던 유닛 테스트를 도입해보고자 했고, 팀원들에게 적극 추천해보기로 했다.
우선 추천을 하기 전에 테스팅이 무엇인가, 왜 테스팅을 해야하는가에서 출발하기 위해 자료를 열심히 찾았고
찾아낸 테스트 피라미드를 기점으로 출발점을 가져가기로 했다.
안드로이드 공식 문서에서도 테스팅에 관해 다양한 항목을 통해 심층적으로 다루고 있으니, 이미 테스트 피라미드를 보신 분들은
구글 문서를 통해 더 깊게 배워보는 것이 좋겠다.
https://developer.android.com/training/testing/?hl=ko
테스트 피라미드
테스트 피라미드는 애자일 프로그래밍의 대가 마틴 파울러가 2009년 처음 언급한 피라미드 형태의 표로, 테스팅을 크게 세 개의 부류로 나누어 설명하고 있다.
아래에서부터 Unit Test, Integration Test, UI Test로 올라가는데 아래에 위치할수록 적용이 쉽고 비용이 적은데 비해
위로 올라갈수록 적용이 어렵고 비용이 많이 들게 된다.
그럼 첫번째 계단부터 살펴보자.
Unit Test
유닛 테스트는 가장 쉽고 빠르게 적용이 가능한 테스트이다. 주로 어플리케이션의 로직들을 최대한 테스트 하는 것이 중요하며,
테스트 커버리지라는 지표를 통해 전체 코드 대비 얼마만큼 테스트가 되었는지를 정량화 할 수 있다.
안드로이드 및 iOS 둘 다 자체 개발툴에서 측정이 가능하다.
다음 피라미드는 Integration Test이다.
Integration Test
Integration 테스트는 코드가 시스템과 어떻게 상호작용하는지 확인한다. 가상기기를 거치지 않고 수행하는 것이 특징이다.
Roboletic을 사용하면 안드로이드의 생명주기나 리소스등의 환경을 제공받아 테스트를 수행할 수 있다고 한다.
다음은 UI Test이다.
UI Test
많은 이들에게 이미 익숙할 테스트로, 직접 실행되고 있는 어플리케이션에서 거치는 전반적인 UI/UX 테스트를 말한다.
실제 구동되는 디바이스가 있어야 한다는 것과 수행자가 있어야 한다는 점에서 타 테스트에 비해서 비용이 크다고 할 수 있다.
다만, 자동화 테스트가 대중화되고, 구글이 Firebase Test Lab을 제공하면서 UI 테스트가 이전보다 훨씬 쉽고 편리하게 되었다.
이렇게 테스트 피라미드의 세가지 요소를 짚어보았는데, 이것들이 개발자에게 주는 이득은 무엇인지 정리해보았다.
1. 개발자로써 앱을 다르게 접근할 수 있는 기회가 된다.
혹 손으로 적어내린뒤 손과 마음에서 떠나보낸 코드들이 있었다면, 이들을 테스트를 통해 다시 돌아볼 수 있게 되는 계기가 될 것이다. 실제로 Unit 테스트를 시작하게 되면서 기존 로직들의 input, output을 좀 더 신경쓰게 되었고, 테스트할 로직의 커버리지를 생각하다 보니 여기저기에 흩어져 있던 로직들을 한데 정리하게 되어 전반적인 코드가 더 깔끔해지게 되는 이점까지 가져갈 수 있었다. 👍
2. 전통적이고 추상적인 테스트 방식과 결별한다.
이전에 자동화 테스트나 유닛 테스트 등을 수행하지 않고 있었다면, 많게는 수십번씩 빌드한 앱을 다시 수십번 손으로 건드려도 보고, 팀원들에게 테스트를 맡기는 등의 번거로운 일들이 일상처럼 자리잡아 있었을 것이다. 자동화 테스트나 이런 테스트 솔루션들이 기존의 비효율적인 요소들을 전부 치워낼 수는 없겠지만, 적어도 이전보다는 훨신 논리적이고 쳬계적으로, 그리고 경제적으로 앱을 테스트 할 수 있게 해 줄 것이다.
3. 테스트 코드와 테스트 커버리지, 통과율은 어플리케이션의 품질을 정량화 할 수 있는 척도가 된다.
매일 책상에 앉아 있으면서 업데이트와 리팩토링을 수행해나간다 치지만, 본인의 업무에 있어 어떤 점에 있어 얼마만큼을 개선하였는지를 증명하는 일은 생각보다 골치아픈 일일 수 있다. (특히 비개발 직군에게 말해야 하는 일이라면..)
유닛 테스트나 자동화 테스트를 수행하면 테스트의 결과물을 통해 어플리케이션의 안정성, 그리고 검증된 버전이라는 점을 어필할 수 있고, 높여가는 테스트 커버리지를 통해 앱이 실제로 얼마만큼이나 테스트 되었는지에 대한 내용 증명이 되기 때문에, 어떻게 보면 양날의 검이 될 수도 있겠으나🤔 결론적으로 보면 앱의 품질과 개인의 전문성에 대해 증명할 수 있는 좋은 수단이 될 것이다.
4. QA에 대한 리소스를 감축할 수 있다.
혹 스타트업이나 개발 조직이 작은 곳이라면, QA에 대해서 다양한 고민들을 하고 있을 것이다. 새로 해야 할 일들을 계속 생기는데, 앱의 품질을 초기부터 계속 유지해나가는 일은 쉬운 일이 아니다. Unit 테스트나 자동화 테스트의 테스트 스크립트 등을 짜는 일은 물론 별개의 공수가 될 수 있겠으나, 한번 틀을 잡고만 나면 개발자에게는 현재 프로젝트의 안정성에 대한 자신감을 가지는 건 물론, 업데이트 이후 마음을 덜 졸이게 끔 하는 든든한 아군이 되어줄 것이다.
마치면서
유닛 테스트나 자동화 테스트, Testable한 코드들에 대해서 개발 컨퍼런스나 포스트 등을 통해서만 접할 수 있었는데, 직접 공부하고 적용할 수 있는 기회를 갖게 되어 흥미롭게 공부를 진행중에 있다.
앞으로 테스트 커버리지를 높여가면서 Mocking 해야 할 요소들, 적재적소에 써야 하는 assert문 등과 겨뤄야 하는 것은 물론, 이 테스트라는 것을 적용할 만큼의 서비스이냐 하는 배와 배꼽의 문제에 봉착하게 될 수도 있을 것이다.
하지만 테스트 커버리지를 높여가는 과정을 거치다 보면 어느새 프로젝트의 로직들이 깔끔하게 정리되어 나가는 모습과 함께 뿌듯해하는 본인의 모습을 마주할 수 있을 것이다!
< 참조 >
https://martinfowler.com/bliki/TestPyramid.html
https://www.agilecoachjournal.com/2014-01-28/the-agile-testing-pyramid
https://brunch.co.kr/@oemilk/76
https://academy.realm.io/kr/posts/aw212-android-unit-ui-test-recorder-data-binding-include/
'ANDROID > Testing' 카테고리의 다른 글
[Testing/Unit-test] Context를 포함하는 ViewModel의 Unit Test (0) | 2022.01.14 |
---|---|
[Kotlin/UnitTesting] LiveData Mocking하기 (0) | 2022.01.06 |
[안드로이드] 람다 Function을 파라미터로 가지는 로직의 Unit Testing! (0) | 2021.01.11 |
[안드로이드/Firebase] adb를 Android studio 터미널에 설정하기, adb 이용해 Firebase event 디버깅하기 (0) | 2020.12.14 |
[Jacoco] Jacoco와 gradle로 프로젝트 코드 커버리지 확인하기(Gradle 3.6 버전 이상의 경우) (0) | 2020.03.23 |