2jigoo / BookStudy-StartTdd

'테스트 주도 개발 시작하기' 스터디
2 stars 0 forks source link

[6주차] 테스트 범위와 종류 - 2jigoo #25

Closed 2jigoo closed 1 year ago

2jigoo commented 1 year ago

Chapter 9. 테스트 범위와 종류

스터디 일시 2023.09.11

목표

2jigoo commented 1 year ago

Chapter 9. 테스트 범위와 종류

테스트 범위

기능 테스트와 E2E 테스트

기능 테스트 (Functional Test)

예) 회원 가입을 실행한 후, 개인 정보 조회 화면을 실행하거나 관리 도구의 회원 정보 조회 기능을 실행하여 데이터가 올바르게 들어갔는지 확인.
부득이한 경우를 제외하고 기능 테스트는 사용자와 동일한 방식으로 기능을 검증해야 한다.

통합 테스트 (Integration Testing)

단위 테스트 (Unit Testing)

테스트 범위 간 차이

  1. 테스트를 위한 준비
    • 통합 테스트: DB나 캐시 서버와 같은 연동 대상을 구성해야 함
    • 기능 테스트: 웹 서버를 구동하거나 모바일 앱 설치
    • 단위 테스트: 테스트 코드를 제외하면 따로 준비할 것이 없음
  2. 실행 속도
    • 통합 테스트: DB 연결, 소켓 통신, 스프링 컨테이너 초기화와 같이 테스트 실행 속도를 느리게 만드는 요인이 많음
    • 기능 테스트: 추가로 브라우저나 앱을 구동하고 화면의 흐름에 따라 알맞은 상호 작용을 해야 함
    • 단위 테스트: 서버를 구동하거나 DB를 준비할 필요가 없고, 의존 대상을 대역으로 처리하면 되므로 실행 속도가 빠름
  3. 상황 준비 및 결과 확인
    • 통합/기능 테스트로는 상황을 준비하거나 결과 확인이 어려울 때가 있음
      (특히 외부 시스템과 연동하는 기능)
    • 단위 테스트와 대역을 조합하여 상황을 만들고 결과를 확인해야 함

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

2jigoo commented 1 year ago

외부 연동이 필요한 테스트 예

스프링 부트와 DB 통합 테스트

WireMock을 이용한 REST 클라이언트 테스트

@BeforeEach
void setUp() {
   wireMockServer = new WireMockServer(options().port(8089));
   wireMockServer.start();
}

@AfterEach
void tearDown() {
   wireMockServer.stop();
}
wireMockServer.stubFor(post(urlEqualTo("/card"))
      .withRequestBody(equalTo("1234567890"))
      .willReturn(aResponse()
            .withHeader("Content-Type", "text/plain")
            .withBody("ok")
      ));
wireMockServer.stubFor(post(urlEqualTo("/card"))
      .willReturn(aResponse()
            .withFixedDelay(5000)
      ));

스프링 부트의 내장 서버를 이용한 API 기능 테스트

@SpringBootTest(
        webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
@Autowired
private TestRestTemplate restTemplate;