테스트 코드를 작성하는 이유는 잘 작동하는, 깔끔한 코드를 얻기 위함이다.
테스트를 쉽게 하기 위해서는 어플리케이션 코드를 테스트하기 쉽게 짜야하는데,
테스트하기 쉽게 코드를 짜려고 노력하다보면 결국 어플리케이션 코드가 깔끔해진다!
TDD란 Test Driven Development의 약자로 테스트 주도 개발이라고 한다.
메소드나 함수같은 프로그램 모듈을 작성할 때 작성 종료조건을 먼저 정해놓고 코딩을 시작한다는 의미로 받아들이면 편하다.
RED
: 항상 실패하는 테스트를 먼저 작성GREEN
: 테스트에 통과하는 프로덕션 코드 작성REFACTOR
: 테스트가 통과하면 프로덕션 코드를 리팩토링위의 레드 그린 사이클 처럼 우선 테스트를 작성하고 그걸 통과하는 코드를 만들고 해당 과정을 반복하면서
제대로 동작하는지에 대한 피드백을 적극적으로 받는 것이다.
✔️ TDD를 사용했을 때의 장점
✔️ 좋고 깨끗한 테스트 코드를 위한 FIRST 규칙
Fast
: 테스트는 빠르게 동작하여 자주 돌릴 수 있어야 한다.Independent
: 각각의 테스트는 독립적이며 서로 의존해서는 안된다.Repeatable
: 어느 환경에서도 반복 가능해야 한다.Self-Validating
: 테스트는 성공 또는 실패로 bool 값으로 결과를 내어 자체적으로 검증되어야 한다.Timely
: 테스트는 적시에 즉, 테스트하려는 실제 코드를 구현하기 직전에 구현해야 한다.모든 테스트 문장은 Given/When/Then
으로 나눠서 작성할 수 있어야 한다.
public class WhatIsGWT {
@Test
public void gwt_test() {
// given
// 테스트를 준비하는 과정
// 테스트에 사용하는 변수, 입력 값 등을 정의하거나, 객체를 정의하는 구문도 Given에 포함된다.
// when
// 실제로 테스트를 실행하는 과정
// then
// 테스트를 검증하는 과정
}
}
Given
When
Then
➡️ 어떤 상태에서 출발(given
) 하여 어떤 상태의 변화를 가했을 때(when
) 기대하는 어떠한 상태가 되어야 한다.(then
)
자바에는 테스트 코드 작성을 도와주는 JUnit
이라는 프레임워크가 있다.
예제에서는 JUnit4
를 사용했다.
package com.example.demo.web.dto;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public class HelloResponseDto {
private final String name;
private final int amount;
}
➡️ name
과 amount
를 멤버변수로 가지는 HelloResponseDto
클래스 생성
package com.example.demo.web.dto;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;
public class HelloResponseDtoTest {
@Test
public void 롬복_기능_테스트() {
//given
String name ="test";
int amount =1000;
//when
HelloResponseDto dto =new HelloResponseDto(name, amount);
//then
assertThat(dto.getName()).isEqualTo(name);
assertThat(dto.getAmount()).isEqualTo(amount);
}
}
➡️ HelloResponseDto
라는 클래스에 lombok이 잘 적용되었는지 테스트 하기 위해 HelloResponseDtoTest
라는 클래스를 만들었다.
@Test
@Test
어노테이션이 붙은 메서드가 테스트를 수행하는 메서드가 된다는 의미이다.
assertThat
assertJ
라는 테스트 검증 라이브러리의 검증 메소드이다.
HelloResponsedto
의 name
과 테스트하는 메소드에 있는 name
이 같은지 확인한다.