본문으로 바로가기
반응형

간단한 예를 들어서 테스트 주도 개발(Test-Driven Development, TDD) 방법을 설명해보겠습니다.

예를 들어, 두 숫자를 더하는 간단한 Calculator 클래스를 작성한다고 가정해봅시다.

실패하는 테스트 케이스 작성

먼저, 아직 구현하지 않은 Calculator 클래스에 대한 테스트 케이스를 작성합니다.

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;

public class CalculatorTest {
    @Test
    public void testAdd() {
        Calculator calculator = new Calculator();
        int result = calculator.add(2, 3);
        assertEquals(5, result);
    }
}

이 테스트 케이스는 현재 실패합니다. 왜냐하면 Calculator 클래스와 add 메서드가 아직 구현되지 않았기 때문입니다.

테스트 통과를 위한 최소한의 코드 작성

다음으로, 위 테스트 케이스를 통과시키기 위한 최소한의 코드를 작성합니다.

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

이제 테스트를 실행하면, 테스트 케이스는 성공합니다.

리팩토링

마지막으로, 필요한 경우 코드를 리팩토링합니다. 현재 Calculator 클래스는 간단해서 리팩토링할 부분이 없지만, 더 복잡한 경우에는 이 단계에서 코드를 개선하거나 중복을 제거할 수 있습니다.

위 과정을 반복하면서 새로운 기능을 추가합니다. 예를 들어, Calculator 클래스에 뺄셈 기능을 추가하려면, 먼저 뺄셈에 대한 실패하는 테스트 케이스를 작성하고, 테스트를 통과시키기 위한 최소한의 코드를 작성한 다음, 필요한 경우 코드를 리팩토링하면 됩니다.

TDD의 주요 장점 중 하나는 코드의 정확성을 계속 확인하면서 개발할 수 있다는 것입니다. 즉, 새로운 기능을 추가하거나 기존 코드를 변경할 때마다, 이미 작성된 테스트 케이스를 실행하여 코드가 여전히 정상적으로 동작하는지 확인할 수 있습니다. 이를 통해 버그를 빠르게 찾고, 코드의 품질을 높이는 데 도움이 됩니다.


====너무 쉽다고? 뭔말인지 모르겠다고?

간단한 계산기 예제보다 좀 더 복잡한 예제로, 블로그 포스팅 시스템의 일부를 TDD 방식으로 개발하는 과정을 예로 들어보겠습니다.

이 예제에서는 다음 두 가지 기능을 구현하고자 합니다:

새로운 블로그 포스트를 추가할 수 있다.
특정 블로그 포스트를 제목으로 검색할 수 있다.
이제 TDD 절차에 따라 각 기능을 차례대로 구현해보겠습니다.

실패하는 테스트 케이스 작성

먼저, 새로운 블로그 포스트를 추가하는 기능에 대한 테스트 케이스를 작성합니다.

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;

public class BlogServiceTest {
    @Test
    public void testAddPost() {
        BlogService blogService = new BlogService();
        blogService.addPost("Hello, world!", "This is my first blog post.");

        Post post = blogService.findPostByTitle("Hello, world!");
        assertEquals("Hello, world!", post.getTitle());
        assertEquals("This is my first blog post.", post.getContent());
    }
}

이 테스트 케이스는 현재 실패합니다. 왜냐하면 BlogService, Post, addPost, findPostByTitle 등이 아직 구현되지 않았기 때문입니다.

테스트 통과를 위한 최소한의 코드 작성

다음으로, 위 테스트 케이스를 통과시키기 위한 최소한의 코드를 작성합니다.

import java.util.*;

public class Post {
    private String title;
    private String content;

    public Post(String title, String content) {
        this.title = title;
        this.content = content;
    }

    public String getTitle() {
        return title;
    }

    public String getContent() {
        return content;
    }
}

public class BlogService {
    private Map<String, Post> posts = new HashMap<>();

    public void addPost(String title, String content) {
        posts.put(title, new Post(title, content));
    }

    public Post findPostByTitle(String title) {
        return posts.get(title);
    }
}

이제 테스트를 실행하면, 테스트 케이스는 성공합니다.

리팩토링

마지막으로, 필요한 경우 코드를 리팩토링합니다. 현재 코드는 꽤 간결하므로 리팩토링할 필요가 없어 보입니다.

위와 같은 절차를 계속 반복하면서 필요한 기능을 차례대로 추가하면 됩니다. 예를 들어, 블로그 포스트를 날짜별로 검색하는 기능, 댓글을 추가하는 기능 등을 추가하려면, 각 기능에 대한 실패하는 테스트 케이스를 먼저 작성한 후, 테스트를 통과시키기 위한 코드를 작성하고, 필요한 경우 코드를 리팩토링하면 됩니다.

 

반응형

'Programing > JAVA' 카테고리의 다른 글

ByteBuffer를 활용하여 Protocol Data 파싱하기  (0) 2023.08.24
리팩토링...java...  (0) 2023.08.06
setup() 메서드  (0) 2023.07.28
SPRING의 DI를 나만 이해하기쉽게..  (0) 2023.07.28
java 파라미터 바인딩이란  (0) 2023.07.28