본문 바로가기

ANDROID/Testing

[Testing] 테스트 피라미드를 통해 테스팅의 세가지 범주 살펴보기

금번에 신규 업데이트를 준비하면서 이전부터 해보고 싶던 유닛 테스트를 도입해보고자 했고, 팀원들에게 적극 추천해보기로 했다.

 

 

우선 추천을 하기 전에 테스팅이 무엇인가, 왜 테스팅을 해야하는가에서 출발하기 위해 자료를 열심히 찾았고

 

찾아낸 테스트 피라미드를 기점으로 출발점을 가져가기로 했다.

 

안드로이드 공식 문서에서도 테스팅에 관해 다양한 항목을 통해 심층적으로 다루고 있으니, 이미 테스트 피라미드를 보신 분들은

 

구글 문서를 통해 더 깊게 배워보는 것이 좋겠다.

 

https://developer.android.com/training/testing/?hl=ko

 

Android에서 앱 테스트  |  Android 개발자  |  Android Developers

Android에서 앱 테스트   Android Jetpack의 일부 앱 테스트는 앱 개발 과정에서 핵심적인 부분입니다. 앱 테스트를 일관되게 실행하여 앱을 공개적으로 출시하기 전에 앱의 정확성, 기능 동작 및 사용성을 확인할 수 있습니다. 또한 테스트는 다음과 같은 장점을 제공합니다. 장애에 관한 신속한 피드백 개발 주기에서 조기 장애 감지 회귀에 신경 쓸 필요 없이 코드를 최적화할 수 있도록 하는 더 안전한 코드 리팩터링 기술적 문제를 최소화하는 안정적

developer.android.com


테스트 피라미드

 

Test pyramid - 2009 Martin Fowler

테스트 피라미드는 애자일 프로그래밍의 대가 마틴 파울러가 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

 

bliki: TestPyramid

Write most of your tests at a low level (unit tests) with a few broad-stack tests, eg via UI. UI tests tend to be fragile and slow.

martinfowler.com

 

https://www.agilecoachjournal.com/2014-01-28/the-agile-testing-pyramid

 

The Agile Testing Pyramid

The Agile Testing Pyramid is a handy way of describing the difference between traditional software testing and testing for iterative development. The differences are important for Agile success and…

www.agilecoachjournal.com

https://brunch.co.kr/@oemilk/76

 

MVP unit test

Junit & Mockito | Unit test 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다. 단위 테스트를 적용하기 위해서는 러닝 커브도 필요하고, 무엇보다도 직접적인 기능 개발 이외에도 공수가 들어가기 때문에 꺼리는 부분이 있는데 단위 테스트를 하면 아래와 같이 여러 장점이 있습니다. 잘못된 부분을 빠르게 확인할 수 있게 해준다.

brunch.co.kr

https://academy.realm.io/kr/posts/aw212-android-unit-ui-test-recorder-data-binding-include/

 

AW212: 안드로이드 테스트 개요 및 사례, 데이터 바인딩

UI, Unit테스트 구분 등 테스트 상세 설명, Unit 테스트 recorder 가능성 탐색, 데이터 바인딩과 등

academy.realm.io