[Back-end] 단위 테스트 작성 방법(feat.TDD)

 

✔️ 단위 테스트(Unit Test)란?

단위 테스트는 응용 프로그램에서 테스트 가능한 가장 작은 소프트웨어를 실행하여 예상대로 동작하는지 확인하는 테스트이다. 단위의 크기가 작을수록 단위의 복잡성이 낮아지므로 동작을 표현하기 더 쉬워진다. 단위테스트의 장점은 다음과 같다.

 

1. 제품의 안정성을 높여준다.

2. 기능의 추가 및 수정으로 인한 부작용을 줄일 수 있다.

3. 불안감 없이 코드 작성을 할 수 있도록 도와준다.

4. 디버깅을 쉽게 해준다.

5. 개발 과정에서 반복적인 작업들을 하지 않도록 도와준다.

6. 더 깔끔하고 재사용성이 좋은 코드 작성을 가능하게 해준다.

 

 


 

✔️ 단위 테스트 작성 방법

단위테스트를 작성하려면 먼저 테스트 코드를 작성하기 쉬운 메서드의 형태를 만들어야 한다. 단위 테스트를 구현하기 쉽게 하려면 메서드를 어떻게 구현을 해야할까? 

 

https://tecoble.techcourse.co.kr/post/2020-05-07-appropriate_method_for_test_by_parameter/

 

메서드 시그니처를 수정하여 테스트하기 좋은 메서드로 만들기

tecoble.techcourse.co.kr


다음 블로그를 통해 정답을 찾을 수 있었다. "메서드 시그니처를 수정하여 테스트하기 좋은 메서드로 만들기"
아래 코드는 블로그에서 예시로 작성된 코드이다.

public class Train {

    private static final int MOVABLE_LOWER_BOUND = 4;
    private static final int RANDOM_NUMBER_UPPER_BOUND = 10;

    private final String name;
    private int position;

    public Train(String name, int position) {
        this.name = name;
        this.position = position;
    }

    public void move() {
        final int number = random.nextInt(RANDOM_NUMBER_UPPER_BOUND);

        if (number >= MOVABLE_LOWER_BOUND) {
            position++;
        }
    }
}

 

아래 코드는 기존의 move 메서드에서 매개변수로 number를 받도록 수정한 코드이다. 이런식으로 코드를 수정하면 number를 외부에서 주입받기 때문에 여러 number의 값에 따라 move 메서드가 어떻게 동작하는지 테스트 코드를 통해 쉽게 확인할 수 있다.

public class Train {

    private static final int MOVABLE_LOWER_BOUND = 4;
    private static final int RANDOM_NUMBER_UPPER_BOUND = 10;

    private final String name;
    private int position;

    public Train(String name, int position) {
        this.name = name;
        this.position = position;
    }

    public void move(int number) {
    	if (number >= MOVABLE_LOWER_BOUND) {
			position++;
		}
	}
}

 

수정된 메서드를 이용해 다음과 같이 2가지 방법으로 테스트 코드를 작성할 수 있다.

public class TrainTest {

    @DisplayName("숫자가 4보다 작으면 위치를 그대로 유지")
    @Test
    public void move_NumberIsLessThanFour_KeepPosition() {
        // Given
        final Train train = new Train("test", 1);

        // When
        train.move(3);

        // Then
        assertThat(train).extracting("position").isEqualTo(1);
    }

    @DisplayName("숫자가 4보다 크거나 같으면 위치를 1 증가")
    @Test
    public void move_NumberIsEqualOrGreaterThanFour_IncreasePositionByOne() {
        // Given
        final Train train = new Train("test", 1);

        // When
        train.move(4);

        // Then
        assertThat(train).extracting("position").isEqualTo(2);
    }

}

 

 


 

✔️ 좋은 단위 테스트를 위한 FIRST 법칙

1. Fast

  • 단위테스트는 빨라야 한다.

2. Independent

  • 테스트는 독립적으로 동작해야 한다.
  • 이전 테스트에 영향을 받으면 실패 원인을 찾기 어렵다.

3. Repeatable

  • 어떤 상황에서든 예상한 대로 테스트 결과가 나와야한다.

4. Self-Validating

  • 출력 혹은 로그가 아닌 테스트 자체적으로 결과가 나와야한다.

5. Timely

  • 적시에 테스트를 철저하게 작성해야 한다.

 


 

✔️ TDD란?

 TDD란 테스트 주도 개발(Test-Driven Development)이다. 즉, 선 개발 후 테스트 방식이 아닌 선 테스트 후 개발 방식의 프로그래밍 방법이다. TDD의 장점은 다음과 같다.

 

1. 테스트 커버리지가 높아진다.

  • 테스트 커버리지 : 시스템 및 소프트웨어에 대해 충분히 테스트가 되었는지를 나타내는 정도

2. 오버 엔지니어링을 방지해준다.

3. 설계에 대한 피드백이 빠르다.

 

 


 

위 내용은 다음 블로그와 영상을 참고하였습니다.

https://tecoble.techcourse.co.kr/post/2021-05-25-unit-test-vs-integration-test-vs-acceptance-test/

 

단위 테스트 vs 통합 테스트 vs 인수 테스트

소프트웨어 테스트에는 여러 유형들이 있다. 각 테스트는 목적, 방법 등에 따라 차이점을 가진다. 이번 글에서는 그 중 단위 테스트, 통합 테스트, 인수 테스트에 대해 개념을 정리하려 한다.

tecoble.techcourse.co.kr

https://www.youtube.com/watch?v=3LMmPXoGI9Q

https://www.youtube.com/watch?v=mIO4Rbe_M74