Home > TDD(Test-Driven Development) > 테스트 범위와 종류

테스트 범위와 종류
java

테스트 범위에 따른 테스트 종류

  • 일반적인 웹 애플리케이션 구조에서, 테스트 종류는 테스트 범위에 따라 세 가지로 나눠볼 수 있다.
    • 단위 테스트(Unit Testing)
      • 단위 테스트는 개별 코드나 컴포넌트가 기대한대로 동작하는지 확인한다.
        • 일반적으로, 한 클래스나 한 메서드를 테스트한다.
        • 외부 의존성은 테스트 대역(Stub, Mock 등)으로 대체한다.
    • 통합 테스트(Integration Testing)
      • 통합 테스트는 시스템의 각 구성 요소가 올바르게 연동되는지 확인한다.
        • 일반적으로, 데이터베이스, 외부 API, 프레임워크, 라이브러리, 구현한 코드 간의 연동을 테스트한다.
    • E2E 테스트(End to end Testing)
      • E2E 테스트는 사용자 입장에서 시스템이 제공하는 기능이 올바르게 동작하는지 확인한다. QA 조직에서 수행하는 테스트가 주로 E2E 테스트이다.
        • 일반적으로, UI(웹 브라우저나 모바일 앱)을 통해 특정 사용자의 흐름이나 요구 사항을 테스트한다.
      • E2E 테스트를 자동화하기 위한 도구는 대표적으로 Selenium과 WebDriver가 있다.
        • 테스트를 자동화한다는 것 = 코드로 작성한 테스트를 실행한다는 것
      • REST API E2E 테스트
        -> 애플리케이션의 UI를 통해 테스트하는 것이 매우 어려운 경우 또는 UI가 아예 없고 대신 REST API를 제공하는 경우에는 REST API에 대한 테스트를 작성하는 것이 유용하다.
        (feat. https://martinfowler.com/articles/practical-test-pyramid.html)

테스트 작성 요령

단위 테스트 vs 통합 테스트

  1. 테스트 상황
    • 통합 테스트는 상황을 준비하거나 결과 확인이 어렵거나 불가능할 때가 있다. 외부 시스템과 연동해야 하는 기능이 특히 그렇다. 이런 경우에는 단위 테스트와 대역을 조합해서 상황을 만들고 결과를 확인해야 한다.
  2. 테스트 구성
    • 통합 테스트를 실행하려면 DB와 같은 연동 대상을 구성해야 한다. 즉, 통합 테스트는 테스트 상황을 만들어내기 위해 많은 노력이 필요하다. 반면에 단위 테스트는 테스트 코드를 빼면 따로 준비할 것이 없다.
  3. 테스트 속도
    • 통합 테스트는 DB 연결, 스프링 컨테이너 초기화와 같이 테스트 실행 속도를 느리게 만드는 요인이 많다. 반면에, 단위 테스트는 서버를 구동하거나 DB를 준비할 필요가 없다. 테스트 대상이 의존하는 기능을 대역으로 처리하면 되므로 테스트 실행 속도가 빠르다.
  • TDD를 하는지 여부에 상관없이 개발자는 단위 테스트통합 테스트를 섞어서 작성한다. 어떤 테스트를 더 많이 작성해야 한다는 절대적인 규칙은 없지만, 위와 같은 차이로 통합 테스트보다는 단위 테스트를 더 많이 작성한다.
    • 통합 테스트단위 테스트에 비해 준비할 것이 많고 실행 시간도 길지만, 그래도 통합 테스트는 필요하다. 아무리 단위 테스트를 많이 만든다고 해도 결국은 각 구성 요소가 올바르게 연동되는 것을 확인해야 하기 때문이다.

테스트 범위에 따른 테스트 코드 개수와 시간

  1. E2E 테스트를 수행하려면 클라이언트부터 DB까지 모든 환경이 갖춰져야 하기 때문에 자동화하거나 다양한 상황별로 테스트하기 가장 어렵다. 또한, E2E 테스트를 수행하기 위한 알맞은 도구가 없으면 E2E 테스트 코드를 작성하기 힘들 수도 있다.
    • 이런 이유로 정기적으로 수행하는 E2E 테스트에서는 정상적인 경우와 몇 가지 특수한 상황만 테스트한다.
  2. 통합 테스트E2E 테스트에 비해 제약이 덜하며, 상대적으로 실행 시간이 짧고 상황을 보다 유연하게 구성할 수 있다.
    • 이런 이유로 보통 E2E 테스트보다 통합 테스트를 더 많이 작성한다.
  3. 단위 테스트통합 테스트로도 만들기 힘든 상황을 쉽게 구성할 수 있고, 더 작은 단위를 대상으로 테스트 코드를 만들 수 있다.
    • 이런 이유로 보통 통합 테스트보다 단위 테스트를 더 많이 작성한다.
  • E2E 테스트통합 테스트에서 모든 예외 상황을 테스트하면 단위 테스트는 줄어든다. 왜냐하면 각 테스트가 다루는 내용이 중복되기 때문이다.
    • 그러나, 테스트 속도는 E2E 테스트통합 테스트보다 단위 테스트가 빠르기 때문에 가능하면 단위 테스트에서 다양한 상황을 다루고, E2E 테스트통합 테스트는 주요 상황에 초점을 맞춰야 한다. 그래야 테스트 실행 시간이 증가해 피드백이 느려지는 것을 방지할 수 있다.

  • 참고 자료
    테스트 주도 개발 시작하기(저자: 최범균)
    https://martinfowler.com/articles/practical-test-pyramid.html
    https://reflectoring.io/spring-boot-web-controller-test/
    https://dingdingmin-back-end-developer.tistory.com/entry/Springboot-Test-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1-1
    https://stackoverflow.com/questions/64541192/assertthatthrownby-check-field-on-custom-exception