세션6. TDD 주기 첫 번째 경험

1. 명령 메시지 형식 작성

판매자 생성 명령

  • 성공적으로 처리되면 시스템의 상태에 변경이 발생하는 메시지를 명령(command) 이라고 부른다.

  • 판매자 회원 가입 API 요청의 본문 데이터는 시스템 상태에 새로운 판매자 정보를 생성하라는 명령으로 해석할 수도 있다.

  • 판매자 생성 명령 설계가 완료되었기 때문에 테스트를 작성하기 전에 먼저 명령 코드를 작성할 수 있다.

  • Java 언어에서 명령 메시지는 record 클래스 형식으로 쉽게 구현할 수 있다.

package commerce.command;

public record CreateSellerCommand(
    String email,
    String username,
    String password
) {
}

2. 테스트 작성 준비

AAA(Arrange-Act-Assert) 패턴

  • Arrange-Act-Assert(AAA) 패턴은 테스트 코드를 순차적인 세 단계로 구분하는 기법이다.

    • Given-When-Then 패턴과 동일하다.

  • Arrange 단계는 테스트에 필요한 데이터를 생성하고 시스템의 사전 조건을 준비합니다.

  • Act 단계는 테스트 대상 기능을 실행합니다.

  • Assert 단계는 실행 결과가 기대와 일치하는지 확인합니다.

  • 테스트의 준비, 실행, 검증 단계가 명확히 구분되어 테스트 작성 시 각 단계에 집중할 수 있고 테스트 가독성을 높입니다.

  • 각 단계를 작성하는 순서는 다양합니다.

테스트 클래스 패키지와 이름

  • test.commerce.api.{API 경로}.{HTTP 메서드}_specs

    • 테스트 코드가 운영 코드의 공개된 형식에만 접근할 수 있도록 패키지를 test로 시작합니다.

  • HTTP API 경로를 테스트 클래스 패키지에 반영한다.

  • 패키지에 표현된 경로로 전송되는 특정 HTTP 메서드를 사용한 요청 명세라는 뜻으로 클래스 이름에 HTTP 메서드와 _specs 접미어를 사용한다.

  • 예를 들어, 판매자 회원 가입 API 대상 테스트 클래스의 전체 이름은 다음과 같다. test.commerce.api.seller.signup.POST_specs

@SpringBootTest 애노테이션

  • 테스트 클래스가 Spring Boot 기반의 테스트 메서드를 실행하도록 지정합니다.

  • classes 요소에 Spring Boot 구성 클래스 형식을 지정합니다.

    • 본 강의 실습 프로젝트의 경우 commerce.CommerceApiApp 클래스입니다.

  • 테스트 대상 응용프로그램이 웹 서버에서 구동되도록 webEnvironment 요소를 지정합니다.

    • 본 강의 실습에서는 임의의 포트를 사용해 테스트 서버를 구동합니다.

@DisplayName 애노테이션

  • 테스트 결과가 출력될 때 테스트 클래스가 다루는 기능을 잘 표현해 주도록 사용한다.

  • 예를 들어, 판매자 회원 가입 API 대상 테스트 클래스에는 다음과 같이 적용한다. @DisplayName("POST /seller/signUp")

@Test 애노테이션

  • 메서드가 테스트 메서드임을 표현합니다.

  • @Test 애노테이션을 가진 메서드는 JUnit과 IntelliJ IDEA에서 실행할 수 있습니다.

테스트 메서드 이름

  • 테스트 시나리오 문구의 내용을 그대로 반영합니다.

  • Java 언어 문법은 메서드 이름에 공백 문자를 허용하지 않기 때문에 공백 문자를 밑줄 문자(_)로 교체합니다.

TestRestTemplate 형식 매개변수

  • 테스트 메서드가 대상 Spring Boot 기반 HTTP 응용프로그램에 접근할 수 있도록 Spring Boot Test가 제공하는 TestRestTemplate 형식의 매개변수를 사용할 수 있습니다.

    • TestRestTemplate 는 인터페이스를 호출하는 Client 역할을 한다.

  • 이 매개변수에 @Autowired 애노테이션을 추가하면 Spring Boot Test가 이 매개변수의 인자를 제공해 줍니다.

  • TestRestTemplate 클래스는 아주 다양한 기능을 제공하는데, 예를 들어, POST 요청을 보낼 때 postForEntity 메서드를 사용할 수 있습니다.

Assertions.assertThat 정적 메서드

  • Spring Boot Test가 설치해주는 AssertJ 라이브러리가 제공해주는 검증 도구입니다.

  • 예를 들어 HTTP 응답을 담는 response 변수가 있을 때 상태코드가 204인지 검사하는 코드는 다음과 같습니다. assertThat(response.getStatusCode().value()).isEqualTo(204);

3. 첫 번째 테스트 작성

첫 번째 테스트 시나리오

  • 올바르게 요청하면 204 No Content 상태코드를 반환한다.

첫 번째 테스트 작성

현재 해당 테스트에 해당하는 서비스 코드가 없기 때문에 테스트는 실패한다.

4. 첫 번째 TDD 주기 완료

테스트를 통과하기 위한 코드

  • "올바르게_요청하면_204_No_Content_상태코드를_반환한다" 테스트는 하나의 단언(assert)문을 가집니다.

    • assertThat(response.getStatusCode().value()).isEqualTo(204);

  • 이 단언문을 통과하기 위한 최소한의 코드는 HTTP 요청에 대응되고 반환값이 204 No Content 상태코드인 메서드와 이 메서드를 정의하는 컨트롤러 형식입니다.

  • 처음으로 경험한 TDD 주기는 다소 낯설고 어색하게 느껴질 수 있다.

  • 테스트 시나리오가 충분히 준비됐다면 시나리오를 구현해 나가는 과정에서 필요한 코드가 점진적으로 추가된다.

Last updated