테스트는 개발자들이 소프트웨어를 개발하는 과정에서 매우 중요한 부분이다. 개발하는 소프트웨어가 출시되기 전에 치명적인 오류와 잠재적인 문제, 그리고 안전한 코드 작성을 위한 도구로 많이 사용된다. TDD(Test Driven Development, 테스트 주도 개발)은 많은 소프트웨어 회사에서 당연시 될 정도로 테스트는 중요하다.
하지만 아직 테스트는 검증팀에서 해야하는 것이라 생각하는 개발자도 많은 것 같다. 특히 소프트웨어를 모두 개발한 이후에 테스트를 작성하는 방법을 사용하는 개발자들도 많은 것으로 안다. 왜 소프트웨어를 개발하는 과정에서 테스트는 필수이며 안드로이드에서는 어떤 테스트를 주로 사용하는지 정리한다.
테스트란 무엇인가?
테스트는 소프트웨어의 품질을 조사하는 과정이라고 할 수 있다. 2006년 소프트웨어 테스팅 컨퍼런스에서 CemKaner가 발표한 내용에서 테스트에 대해 잘 정리가 되어 있다.
Software testing is an investigation conducted to provide stakeholders with
information about the quaility of the product or service under test.
'소프트웨어 테스트는 테스트 중인 제품 또는 서비스의 품질에 대한 정보를 이해관계자에게 제공하기 위해 수행되는 조사' 라고 정의한다.
왜 중요한가?
보통 소프트웨어의 오류는 85% 이상이 코드를 작성하는 개발단계에서 발생한다고 알려져 있다. 하지만 이러한 오류는 개발이 완료되고 테스트를 진행하면서 점차적으로 발견하게 된다. 위 그래프의 빨간 선을 보자. 선이 시간이 지남에 따라 발견된 문제를 수정하기 위한 비용이 기하급수적으로 증가하는 것을 확인할 수 있다.
개발 초기부터 테스트를 중요시 생각하지 않고 개발을 하게되면 단적으로 추후 발견된 문제를 수정하기 위해서는 엄청난 비용이 발생한다. 그 문제가 시스템에 주는 영향이 크든 작든 그것과 별개로 많은 개발자들과 검증자들의 시간과 노력, 고객의 불만 등 다양한 부채가 발생하게 된다.
만약 개발 초기 단계부터 테스트를 진행하면 어떻게 될까?
소프트웨어 개발 초기 단계부터 테스트를 진행 시 발견되는 문제의 수는 개발 단계에서 많이 발견되고 수정이 이뤄진다. 이때 발견되 문제의 수정 비용은 매우 낮음을 알 수 있다. 이슈의 발생이 가장 많은 시점에서 테스트가 잘 이루어지도록 하는 것이다.
개발 초기부터 테스트를 진행함으로써 제품이 릴리즈 된 이후의 발생할 문제를 최소화 함으로써 이슈 수정의 부채를 최소화 하도록 한다. 이 방법이 TDD를 진행하는 가장 큰 이유이다.
테스트를 초기부터 진행해야 하는 이유를 알았다면, 안드로이드 애플리케이션 개발 시에는 어떻게 테스트를 진행하는 간단히 정리한다.
테스트 분류
안드로이드 개발자 페이지에서는 테스트 피라미드라고 하는 그림으로 테스트 카테고리를 정리하여 보여준다. 각 분류는 Unit test, Integration test, UI test이다.
Unit Test
단위테스트는 안드로이드 테스팅 피라미드의 근간이 되는 테스트로, 단일 단위에 대한 테스트를 진행한다. 전체 테스트의 약 70% 정도를 차지한다. 여기서 단일 단위라 하면 클래스 내에 정의된 메소드 형태로 생각하면 편하다.
단위테스트는 매우 빠른 시간 내에 자동화된 시스템에 의하여 테스트가 가능하도록 많은 플랫폼에서 지원한다. 안드로이드 또한 단위테스트를 빠르게 수행할 수 있도록 지원한다.
이름에서 알 수 있듯이 단위테스트는 최소 단위에 대해 테스트하는 것으로 다른 컴포넌트와의 의존성이 존재해서는 안된다. 특히 외부 환경의 변화에 따른 테스트가 결과가 변경되는 등의 영향을 있어서는 안된다.
Integration Test
Integration Test는 어떻게 다른 컴포넌트가 함께 동작하는지에 대한 테스트이다. 전체 테스트 중 약 20% 의 비율을 차지한다. 단위테스트가 독립적으로 하나의 단위에 대한 테스트 였다면 Integration Test는 Fragment, ViewModel과 같이 함께 연결되어 동작하는 컴포넌트들을 테스트한다.
간혹 Integration Test 와 Instrumented Test를 혼동하는 개발자들이 있는데, 두 개의 테스트는 다른 테스트이다. 간단히 설명하면 Integration Test는 위에서 설명했듯이 컴포넌트 간의 테스팅이고, Instrumented Test 는 안드로이드 컴포넌트, 즉 프레임워크에 의존적인 테스트로, jvm 상에서 테스트가 어렵고, 디바이스 혹은 에뮬레이터에서 테스트가 수행되어야 한다.
UI Test
UI Test는 End-to-End Test 로도 많이 불린다. 테스트의 단위가 Unit, Integration 테스트와는 큰 차이가 있다. 애플리케이션을 구성하는 모든 컴포넌트나 특정 패키지를 구성하는 많은 컴포넌트를 한번에 테스트를 진행한다.
애플리케이션의 실행부터 로그인, 프레그먼트의 전환, 그래고 새로운 데이터의 추가, 삭제 동작과 사용자 인터페이스에 잘 반영되는지 등 다양한 테스트를 구성한다. 즉 UI와 관련된 예상되는 모든 상황을 테스트 하게 된다.
결론
테스트의 중요성과 안드로이드에서는 어떻게 테스트를 분류하고 추천하는지 정리하였다. 다음에는 테스트의 분류에 따라 어떤 테스트 프레임워크를 사용하고 어떻게 테스트 코드를 작성하는지 하나씩 정리한다.
참고
https://developer.android.com/training/testing?hl=ko
https://www.stickyminds.com/article/shift-left-approach-software-testing
'Android > Testing' 카테고리의 다른 글
[Android/Testing] #6. 테스트 시작 전에 테스트 더블(Test Double) 이해하기 (0) | 2022.10.08 |
---|---|
[Android/Testing] #5. 테스트를 위한 기반 프로젝트 생성하기 (0) | 2022.10.02 |
[Android/Testing] #4. Room Database 테스트 (0) | 2022.09.18 |
[Android/Testing] #3. Unit Testing 입문하기 (0) | 2022.09.15 |
[Android/Testing] #2. 좋은 테스트는 어떻게 작성해야 할까? (1) | 2022.09.12 |