[구름톤 유니브 3기 스터디] 테스트에 대한 개요와 개발자가 해야할 고민

이재혁·2024년 11월 1일
0

테스트란?

  1. 사람이 직접 사용해 보면서 준비된 체크리스트를 체크하는 인수 테스트
  2. 테스트 코드로 결과값과 예상값을 비교하는 자동 테스트

TDD

테스트 주도 개발

  • RED : 깨지는 테스트를 먼저 작성한다.
  • GREEN: 깨지는 테스트를 성공시킨다.
  • BLUE: 리팩토링한다.

red 단계

image.png

image.png

image.png

Green 단계

image.png

image.png

image.png

Blue 단계(리팩토링)

  • 중복 제거
  • 가독성 향상
  • 메서드 추출
  • 조건문 단순화
  • 구조 개선(for문 → 스트림)
  • 상수 사용
  • 성능 최적화
  • 테스트 코드 유지

TDD는 이 과정을 모든 개발 단계에서 무한히 반복하는 것을 의미

언제 테스트 코드를 작성해야하나?

  • 최소한의 필요한 필드나 레포지토리 등을 정의 해두고 바로 실패하는 (RED) 테스트를 작성해야 한다.

TDD에서 코드 작성 흐름

예를들어, 게시판 프로젝트에서 게시글을 작성한다고 했을 때,

  1. Red 단계: 실패하는 테스트 작성
@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());
}

2. Green 단계: 테스트를 통과하는 최소한의 코드 작성

💡

테스트를 통과할 수 있도록 필요한 최소한의 코드만 작성한다.

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);
    }
}

3. Refactor 단계: 코드 리팩토링(Green)

  • 생성자 구조 리팩토링
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);
}

테스트 주도 개발의 장점

  • 깨지는 테스트를 먼저 작성해야하기 때문에, 인터페이스를 먼저 만드는 것이 강제된다.
    • → 인터페이스에 집중하겠다는 것은 객체지향의 핵심 원리 중 하나인 ‘행동에 집중’하겠다는 말과 같기 때문
  • 책임-주도 설계의 핵심과정인 what/who 사이클
    • what/who 사이클이라는 용어가 의미하는 것은 객체 사이의 협력 관계를 설계하기 위해서 먼저 ‘어떤 행위(what)’를 수행할 것인지를 결정해야 한다는 것이다.’ 여기서 ‘어떤 행위’가 메시지이다.
  • 장기적인 관점에서 개발 비용 감소

image.png

💡

테스트와 아키텍처가 비례한다.

‘행동’이 메서드나 함수를 의미하는게 아니다.

모든 메서드를 테스트하기보다는 중요한 로직을 잘 구분해서 그 코드에 테스트를 넣는 것이 낫다.

고민을 통한 개선

  • 무의미한 테스트
  • 느리고 쉽게 깨지는 테스트
  • 테스트가 불가능한 코드

→ 테스트는 좋은 설계를 유도합니다.

profile
서비스기업 가고 싶은 대학생

0개의 댓글

관련 채용 정보