세션6. TDD 주기 첫 번째 경험
1. 명령 메시지 형식 작성
판매자 생성 명령
성공적으로 처리되면 시스템의 상태에 변경이 발생하는 메시지를 명령(command) 이라고 부른다.
판매자 회원 가입 API 요청의 본문 데이터는 시스템 상태에 새로운 판매자 정보를 생성하라는 명령으로 해석할 수도 있다.
판매자 생성 명령 설계가 완료되었기 때문에 테스트를 작성하기 전에 먼저 명령 코드를 작성할 수 있다.
Java 언어에서 명령 메시지는
record
클래스 형식으로 쉽게 구현할 수 있다.
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