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 통합 테스트
- 테스트 상황
통합 테스트
는 상황을 준비하거나 결과 확인이 어렵거나 불가능할 때가 있다. 외부 시스템과 연동해야 하는 기능이 특히 그렇다. 이런 경우에는 단위 테스트
와 대역을 조합해서 상황을 만들고 결과를 확인해야 한다.
- 테스트 구성
통합 테스트
를 실행하려면 DB와 같은 연동 대상을 구성해야 한다. 즉, 통합 테스트
는 테스트 상황을 만들어내기 위해 많은 노력이 필요하다. 반면에 단위 테스트
는 테스트 코드를 빼면 따로 준비할 것이 없다.
- 테스트 속도
통합 테스트
는 DB 연결, 스프링 컨테이너 초기화와 같이 테스트 실행 속도를 느리게 만드는 요인이 많다. 반면에, 단위 테스트
는 서버를 구동하거나 DB를 준비할 필요가 없다. 테스트 대상이 의존하는 기능을 대역으로 처리하면 되므로 테스트 실행 속도가 빠르다.
- TDD를 하는지 여부에 상관없이 개발자는
단위 테스트
와 통합 테스트
를 섞어서 작성한다. 어떤 테스트를 더 많이 작성해야 한다는 절대적인 규칙은 없지만, 위와 같은 차이로 통합 테스트
보다는 단위 테스트
를 더 많이 작성한다.
통합 테스트
는 단위 테스트
에 비해 준비할 것이 많고 실행 시간도 길지만, 그래도 통합 테스트
는 필요하다. 아무리 단위 테스트
를 많이 만든다고 해도 결국은 각 구성 요소가 올바르게 연동되는 것을 확인해야 하기 때문이다.
테스트 범위에 따른 테스트 코드 개수와 시간
E2E 테스트
를 수행하려면 클라이언트부터 DB까지 모든 환경이 갖춰져야 하기 때문에 자동화하거나 다양한 상황별로 테스트하기 가장 어렵다. 또한, E2E 테스트
를 수행하기 위한 알맞은 도구가 없으면 E2E 테스트 코드를 작성하기 힘들 수도 있다.
- 이런 이유로 정기적으로 수행하는
E2E 테스트
에서는 정상적인 경우와 몇 가지 특수한 상황만 테스트한다.
통합 테스트
는 E2E 테스트
에 비해 제약이 덜하며, 상대적으로 실행 시간이 짧고 상황을 보다 유연하게 구성할 수 있다.
- 이런 이유로 보통
E2E 테스트
보다 통합 테스트
를 더 많이 작성한다.
단위 테스트
는 통합 테스트
로도 만들기 힘든 상황을 쉽게 구성할 수 있고, 더 작은 단위를 대상으로 테스트 코드를 만들 수 있다.
- 이런 이유로 보통
통합 테스트
보다 단위 테스트
를 더 많이 작성한다.
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