해결된 질문
작성
·
120
0
안녕하세요! 강사님. 저번에 상세하게 답변해주셔서 너무 감사했습니다!
말씀해주신 인수 테스트에 대해서 알아보고, RestAssured를 사용해서 테스트 적용해보았고, 테스트 무사히 성공 했습니다. 감사합니다! 다만, 적용해보면서 또 여러가지 궁금점이 생겼어요.
질문은 총 5가지 입니다!
1. RestAssured를 사용해서 API 테스트를 할 때 DB까지 테스트 하는 테스트를 보통 통합테스트라고 하는건가요? 그렇다면 E2E 테스트는 실무에서 보통 어떻게 수행하는지 궁금합니다.
2.통합 테스트라고 하면 모듈간의 통합을 검증하기 위함이라고 하던데, 개발 환경에서 실행되는 테스트일까요? 아니면 실제 운영환경과 동일한 환경에서 테스트를 수행해야 되는걸까요?
3. 인수테스트도 통합테스트에 속하는 개념인걸까요?
4. 통합테스트(인수테스트)에서 실패 케이스도 작성해야 하는 걸까요?
5. 다들 RestAssured, MockMvc를 사용해서 인수테스트를 하던데, 그럼 통합테스트는 어떤걸 사용하는지 궁금합니다. (찾아보니 @SpringBootTest가 통합 테스트는 아니라고 해서요!)
답변 2
1
안녕하세요, Jinyoung Choi 님!
하나씩 답변 드리겠습니다.
1. RestAssured를 사용해서 API 테스트를 할 때 DB까지 테스트 하는 테스트를 보통 통합테스트라고 하는건가요? 그렇다면 E2E 테스트는 실무에서 보통 어떻게 수행하는지 궁금합니다.
음 아뇨 조금 다릅니다.
먼저 E2E 테스트, 인수 테스트, 통합 테스트 에 대해서 제가 생각하는 개념을 설명드릴게요.
E2E 테스트
셋 중에서 가장 범위가 넓은 테스트입니다.
사용자가 경험할 수 있는 전체 프로세스 흐름을 검증합니다. 사용자 관점이기 때문에, UI를 포함하는 경우도 많은 것 같아요.
인수 테스트와 일부 개념이나 상황이 겹칠 수 있습니다.
인수 테스트
마찬가지로 클라이언트 입장에서 검증합니다. E2E 테스트보다는 범위가 작을 수 있지만, 여전히 넓은 범위를 검증합니다.
사용자가 접할 수 있는 특정 시나리오를 기반으로 여러 API를 순차적으로 테스트할 수 있습니다.
통합 테스트
강의에서 설명드린 것처럼, 둘 이상의 모듈이 통합되었을 때 정상 동작하는지를 검증합니다.
보통 인수 테스트보다 범위가 작습니다.
인수 테스트도 어떻게 보면 통합 테스트와 일부 개념이나 상황이 겹칠 수 있습니다.
단위 테스트만으로 커버하지 못하는 상황을 검증하고, 보장합니다.
각 개념이 명확히 분리되는 것은 아니고, 서로 교집합의 영역이 있다, 정도로 생각하시면 좋을 것 같아요.
중요한 것은 테스트하려는 범위가 넓을수록 들여야 하는 비용도 커진다는 점입니다.
RestAssured라는 도구를 사용해서는 보통 인수 테스트를 많이 작성합니다.
서버를 블랙박스 형태로 띄워놓고, 정말 사용자가 마주할 법한 시나리오를 작성하여 그에 맞게 API 를 호출하고, 검증할 수 있습니다. (ex. 회원 가입 후 로그인)
서버가 블랙박스이기 때문에, 서버 내에서 어떤 일이 일어나는지는 알 수 없고, 관심도 없습니다. 그저 요청 조건에 따른 응답이 잘 오는지를 확인합니다.
2.통합 테스트라고 하면 모듈간의 통합을 검증하기 위함이라고 하던데, 개발 환경에서 실행되는 테스트일까요? 아니면 실제 운영환경과 동일한 환경에서 테스트를 수행해야 되는걸까요?
엄밀히 말하면 개발 환경에서 실행되는 테스트입니다. 작성한 코드에 대하여 개발 단계에서 수시로 테스트하니까요. 강의 중에 보여드린 Service Layer 테스트 생각하시면 됩니다.
3. 인수테스트도 통합테스트에 속하는 개념인걸까요?
위쪽에 답변 드렸어요 :)
4. 통합테스트(인수테스트)에서 실패 케이스도 작성해야 하는 걸까요?
네, 물론 작성하면 좋죠. 테스트는 시간과 자원이 충분하다면, 다다익선에 가깝습니다. (꼭 필요한 테스트만 작성한다는 가정 하에)
자동화된 검증 케이스가 많으면 많을수록 소프트웨어가 견고해 지겠죠.
해피 케이스만 검증하는 테스트는 사실 반쪽에 가깝습니다.
5. 다들 RestAssured, MockMvc를 사용해서 인수테스트를 하던데, 그럼 통합테스트는 어떤걸 사용하는지 궁금합니다. (찾아보니 @SpringBootTest가 통합 테스트는 아니라고 해서요!)
"SpringBootTest가 통합 테스트다" 는 틀린 말이지만, "SpringBootTest를 주로 사용하여 통합 테스트를 수행한다"가 바른 말 같습니다.
SpringBootTest를 사용하여 인수 테스트도 구현할 수 있기 때문이죠.
도움이 되셨기를 바랍니다.
감사합니다. 🙂
1
안녕하세요, 인프런 AI 인턴입니다.
1. RestAssured를 사용한 API 테스트는 실제 애플리케이션 서버와 DB까지 포함해 전체적인 흐름을 테스트하는 경우, 통합 테스트 범주에 속합니다. E2E(End-To-End) 테스트는 사용자의 입장에서 실제 애플리케이션을 사용하는 시나리오를 모두 포함하여 시스템 전체의 동작을 검증합니다. E2E 테스트는 보통 자동화 툴(예: Selenium, Cypress)을 사용해 UI를 통한 상호작용까지 전체 흐름을 검증하는 방식으로 수행합니다.
2. 통합 테스트는 개발 환경에서 수행되기도 하고, 실제 운영 환경과 유사한 환경(Staging Environment)에서 수행되기도 합니다. 목적은 여러 모듈이나 시스템이 함께 잘 작동하는지 검증하는 것입니다. 실제 운영 환경과 동일한 환경에서 테스트하는 것이 좋긴 하지만, 실무에서는 리소스와 환경 구성의 복잡성 때문에 항상 가능한 것은 아닙니다.
3. 인수테스트는 통합테스트와 겹치는 부분이 있을 수 있으나, 좀 더 넓은 범주에서 사용자나 클라이언트의 요구사항을 만족하는지를 검증하는 테스트입니다. 인수테스트는 종종 비즈니스 요구사항이나 사용자 시나리오를 중심으로 진행되며, 시스템의 외부 인터페이스를 통해 이루어진다는 점에서 통합테스트와는 구분됩니다.
4. 네, 통합테스트(인수테스트 포함)에서도 실패 케이스를 작성하는 것이 중요합니다. 성공 케이스 뿐만 아니라 예외 상황이나 오류 처리가 올바르게 동작하는지를 검증함으로써, 더 견고한 소프트웨어를 개발할 수 있습니다.
5. 통합 테스트를 위해 @SpringBootTest
어노테이션은 실제로 널리 사용됩니다. @SpringBootTest
를 사용하면 Spring Boot 애플리케이션의 전체 컨텍스트를 로드하여 테스트하기 때문에, 이를 통합 테스트에 활용하는 것은 타당합니다. RestAssured나 MockMvc는 주로 웹 애플리케이션의 HTTP 요청과 응답을 테스트할 때 사용되며, 이들도 통합 테스트의 일부로 볼 수 있습니다. 특정 테스트 케이스에 따라 적절한 툴을 선택하여 사용하면 됩니다.
정말 친절하고 자세한 설명 감사드립니다! 설명이 너무 좋으셔서 이해가 쏙쏙 됐어요!
감사합니다!!