티스토리 뷰

dev_공부일지/JAVA TDD

TDD 시작

dev_0hoon 2024. 5. 23. 22:15

1. 만들 기능에 대해 설계를 고민한다.

 

2. 과정1 을 수행하며 구현에 대해 고민한다.

 

3. 기능에 대한 구현을 완료한 것 같으면 기능을 테스트한다. 이 과정에서 원하는대로 동작하지 않거나 문제가 발생하면 과정2에서 작성한 코드를 디버깅하면서 원인을 찾는다.

 

Maven

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.5.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

위 상황의 문제점

- 과정2에서 한 번에 작성한 코드가 많으면 디버깅 시간이 길어진다. 디버깅, 로그 메시지 추가 등 코드를 한줄씩 따라가며 원인을 찾아야했다.

- A가 공통을 만들면 B가 가져다 쓰면서 테스트하는 경우도 있다(B가 잘못된 코드를 발견하면 A에게 말해주는 식).

- 테스트도 오래 걸린다. 문제를 찾아서 고치면 톰캣을 재시작 해야한다. 데이터를 확인하려고 DB에서 SELECT문을 날리는 등 시간이 걸린다. 

 

TDD란?

TDD는 테스트부터 시작한다. 구현을 먼저하고 테스트하는게 아니다. 테스트를 하고 구현을 한다. 기능을 검증하는 테스트 코드를 먼저 작성하고 테스트를 통과 시키기 위해 개발을 진행한다.

 

package chap02;

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

public class CalculatorTest {
    
    @Test
    void plus(){
        int result = Calculator.plus(1,2);
        Assertions.assertEquals(3,rsult);
    }
}

일단 Calculator가 없이 코드를 작성해본다. 여기서 책의 저자는 먼저 이렇게 작성한 후에 여러고민을 한다고 한다.

- Calculator의 메서드는 plus가 좋을까 sum이 좋을까?

- 덧셈기능을 제공하는 메서드는 파라미터가 몇개여야 할까? 반환 타입은?

- 정적 메서드로 구혀낳ㄹ까 인스턴스 메서드로 구현할까?

- 메서드를 제공할 클래스 이름은 뭐가좋을까?

 

처음에는 메서드 이름을 sum을 생각했다고 한다. 하지만 수학에서 더하기 부호를 의미하는 이름이 더 어울리는 것 같아서 plus를 메서드로 정했다.

 

세 번째 고민의 답은 현재는 덧셈기능을 구현하기 위해 새로운 객체를 만들필요가 없다. 나중에 어떤 기능이 추가될지 모르지만 지금 당장은 정적메서드로도 충분하다. (static)

 

마지막으로 plus 메서드를 제공할 클래스 이름은 단순히 계산기를 의미하는 Calculator로 한다.

 

package chap02;

public class Calculator {

    public static int plus(int a, int b){
        return 3;
    }
}

이 코드를 보면 장난하냐고 생각 할 수 있다. 반환값이 3? 저자는 처음에 0도 넣었었다. 이렇게 값을 바꿔가며 차근차근 테스트를 밣아 가야한다.

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

public class CalculatorTest {

    @Test
    void plus(){
        int result = Calculator.plus(1,2);
        Assertions.assertEquals(3,result);
        Assertions.assertEquals(5,Calculator.plus(4,1));
    }
}

 

이렇게 경우의 수를 하나 더 두어 확실히 테스트한다. 리턴 값은 3이기에 당연히 통과되지 못한다.

리턴 값을 a + b로 변경하면 그재야 테스트에 성공한다.

현재의 폴더구조는 이러하다. main/java는 배포 대상이므로 테스트는 test폴더에 있어야한다.

 

폴더를 옮기고도 잘 작동하는지 확인하면 테스트가 끝이난다.

 

정리하자면

1. 테스트코드를 먼저적는다.

2. 코드를 작성하며 클래스 이름, 메서드 이름, 파라미터 개수, 리턴 타입을 고민함

3. new로 새로 불러올지, 정적 메서드로 구현할지 등을 고민했다.

4. 이 고민은 사실 코드 작성할 때 하는 고민과 똑같다.

5. 실패하는 테스트를 진행하고, 성공값으로 만드는 테스트를 진행한 후에 코드를 추가해서 기능을 완성해나간다.

 

 

'dev_공부일지 > JAVA TDD' 카테고리의 다른 글

실제 테스트의 순서 정리  (0) 2024.06.08
TDD 테스트 코드 작성 순서  (0) 2024.05.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함