테스트의 중요성이 대두되고 있다. 개발자들의 발목을 잡기도 하지만 사전에 문제를 예방할 수 있도록 하여 개발하는 데 큰 도움을 주기도 하는 테스트에 대한 이야기를 해보겠다.
테스트란 의도된 대로 정확히 작동하는지 검증하는 절차이다.
테스트는 테스트 대상 범위나 성격에 따라 크게 3가지로 구분한다.
UI Test, Integration Test(통합 테스트), Unit Test(단위 테스트) 등으로 구분한다.
테스트 피라미드 수준 https://developer.android.com/training/testing/fundamentals?hl=ko
테스트에 관심이 있는 사람이라면 한 번쯤은 봤을 테스트 피라미드이다.
피라미드 형태로 표현된 이유는 테스트 코드를 작성하는 데 필요한 비용이 때문이다.
구글 공식 문서에서는 각 테스트 비율을 단위는 70%, 통합은 20%, UI은 10%로 구성하는 것이 좋다고 한다.
그럼 한 단계씩 살펴보면서 각 구성에 대해서 알아보자.
단위 테스트(Unit Test)는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다.
여기서 모듈은 애플리케이션에서 작동하는 하나의 기능 또는 메소드로 이해할 수 있다. 예를 들어 웹 애플리케이션에서 로그인 메소드에 대한 독립적인 테스트가 1개의 단위 테스트가 될 수 있다.
즉, 단위 테스트는 애플리케이션을 구성하는 하나의 기능, 하나의 함수가 올바르게 동작하는지를 독립적으로 테스트 하는 것으로, 각각의 조건에 대한 유효성을 검증한다.
“어떤 기능이 실행되면 어떤 결과가 나온다” 정도로 테스트를 진행한다.
중형 테스트에 속하는 통합 테스트(Integration Test)는 모듈을 통합하는 과정에서 서로 다른 모듈 혹은 클래스 간 상호작용의 유효성을 검증하는 테스트이다.
웹 페이지로부터 API를 호출하여 올바르게 동작하는 지를 확인하는 것이다.
일반적으로 애플리케이션은 여러 개의 모듈들로 구성되고, 모듈들끼리 메세지를 주고 받으면서(함수 호출) 기능을 수행한다. 그렇기에 통합된 모듈들이 올바르게 연계되어 동작하는지 검증이 필요한데, 이러한 목적으로 진행되는 테스트가 통합 테스트이다.
또한 통합 테스트는 각 모듈에 대한 설정 또는 테스트를 하기 위해 사전 조건이 필요한 경우가 있기 때문에 단위 테스트보다 테스트 코드를 작성하기가 복잡하다. 하지만 단위 테스트보다 더 넓은 범위의 종속성까지 테스트함으로써 단위 테스트보다 좀 더 유의미한 테스트가 되는 경우도 많다.
대형 테스트로 분류되는 UI 테스트는 실제 사용자들이 사용하는 화면에 대한 테스트를 하여 서비스의 기능이 정상적으로 작동하는지 검증하는 테스트이다.
UI 테스트는 실제 앱을 사용하는 사용자의 흐름에 대해 테스트 함으로써 UI 변경 사항으로 인해 발생할 수 있는 문제를 사전에 차단하여 앱의 신뢰도를 높일 수 있다.
하지만 화면과 직접적으로 연관되어있는 테스트이다 보니 실행 시간도 오래 걸리고, 디자인이 변경될 때마다 테스트 코드의 수정이 필요하므로 유지 보수 비용도 큰 편이다.
일반적으로 테스트를 작성하다고 하면 단위 테스트를 의미한다.
통합 테스트는 실제 여러 모듈 간의 상호작용을 테스트하기 때문에 모든 모듈들이 준비가 된 상태에서 테스트를 하게 된다. 그렇기에 통합 테스트를 위해서는 캐시나 데이터베이스 등 다른 컴포넌트들과 실제 연결을 해야 하고, 시스템을 구성하는 컴포넌트들이 많아질수록 테스트를 위한 비용과 시간이 상당히 커진다.
반면에 단위 테스트는 해당 기능과 메소드만 독립적으로 테스트하기 때문에 어떤 코드를 리팩토링하여도 빠르게 문제 여부를 확인할 수 있고 기능이 똑같이 동작하는지 확인할 수 있다.
좋은 테스트를 작성해야 그 이점을 누릴 수 있는데, 좋은 테스트의 특징은 CleanCode에서 정의한 FIRST라는 5가지 규칙을 따라야 한다.
즉, 좋은 테스트는 빠르게 독립적으로 어느 환경에서든 실행이 가능하고 검증할 수 있어야 한다는 것이다.
테스트 코드를 찾아보며 대충 하는 방법만 알고 있었던 거 같아 본격적으로 테스트를 공부하기에 앞서 테스트의 개념에 대해서 알아보았다.
테스트 코드를 작성하기 위해서는 개발자뿐만 아니라 같이 일하는 다른 동료들 모두가 테스트 코드의 중요성에 대해 공감하고 필요성을 느껴야 비로소 테스트 코드를 잘 활용할 수 있다고 생각한다.