테스트 주도 개발
red 단계
Green 단계
Blue 단계(리팩토링)
TDD는 이 과정을 모든 개발 단계에서 무한히 반복하는 것을 의미
예를들어, 게시판 프로젝트에서 게시글을 작성한다고 했을 때,
@Test
public void 게시글을_저장하면_게시글이_조회되어야한다() {
// Given
String title = "테스트 제목";
String content = "테스트 내용";
// When
Post savedPost = postService.savePost(title, content);
// Then
assertNotNull(savedPost.getId());
assertEquals(title, savedPost.getTitle());
assertEquals(content, savedPost.getContent());
}
테스트를 통과할 수 있도록 필요한 최소한의 코드만 작성한다.
Post 엔티티 작성
@Entity
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String content;
// 기본 생성자, 생성자, getter, setter 생략
}
PostRepository 인터페이스 작성
public interface PostRepository extends JpaRepository<Post, Long> {
}
PostService 작성
@Service
public class PostService {
private final PostRepository postRepository;
public PostService(PostRepository postRepository) {
this.postRepository = postRepository;
}
public Post savePost(String title, String content) {
Post post = new Post(title, content);
return postRepository.save(post);
}
}
public Post(String title, String content) {
this.title = title;
this.content = content;
}
public Post savePost(PostDto postDto) {
Post post = new Post(postDto.getTitle(), postDto.getContent());
return postRepository.save(post);
}
테스트와 아키텍처가 비례한다.
‘행동’이 메서드나 함수를 의미하는게 아니다.
모든 메서드를 테스트하기보다는 중요한 로직을 잘 구분해서 그 코드에 테스트를 넣는 것이 낫다.
→ 테스트는 좋은 설계를 유도합니다.