테스트 코드

SeokHwan An·2022년 11월 10일
0

📕테스트 코드란?

소프트웨어가 동작을 잘하는지 혹은 버그가 있는지 발견하기 위해 작성하는 코드를 의미하며 목적은 소프트웨어가 예상대로 동작되는지 파악하는 것입니다.

✏️테스트 코드를 작성해야하는 이유는?

  1. 소프트웨어 내 기능들이 잘 작동하는지 확인할 수 있다는 점
  2. 사전에 문제를 발견할 수 있다는 점
  3. 소프트웨어를 실행시키지 않고도 문제를 발견할 수 있는 점

📋테스트 코드의 종류

테스트 코드의 종류로는 단위 테스트, 통합 테스트, 인수 테스트가 있습니다.

단위 테스트는 응용 프로그램에서 테스트가 가능한 가장 작은 소프트웨어를 실행하여 예상대로 동작하는지 확인하는 테스트입니다.

통합 테스트는 단위 테스트보다 더 큰 동작을 달성하기 위해 여러 모듈들을 모아 이들이 의도대로 협력하는지 확인하는 테스트입니다.

인수 테스트는 사용자 스토리(시나리오)에 맞춰 수행하는 테스트입니다.

이번 포스트에서는 단위 테스트에 초점을 맞추겠습니다.

📚단위 테스트

단위 테스트는 앞서 말한 것과 같이 가장 작은 소프트웨어를 실행하는 테스트로 실생활에서 예를 들면 자동차가 동작을 하는데 있어서 필요한 기능하나하나를 검증하는 것이라고 보면 좋을 것 같습니다.

자동차가 동작을 하기 위해서는 시동이 걸리는지, 자동차 핸들이 작동하는지, 엑셀과 브레이크가 잘 작동하는지를 파악하는 것이 단위 테스트라고 보면 좋을 것 같습니다.

다시 코드 관점에서 와서 단위 테스트를 보면 크게 범위가 정해진 것은 아니지만 주로 클래스 단위나 메소드 단위로 테스트를 하는 것을 의미합니다. 단위 테스트는 테스트의 크기가 작은 만큼 복잡성이 낮으므로 테스트 코드는 최대한 간단하고 디버깅하기 쉽게 작성되어야 합니다.

자동차에서 시동을 키고 가속과 감속에 대해서 테스트 코드를 작성하는 예시를 보여주겠습니다.
Car.java

package com.example.demo;

public class Car {

    private boolean power;
    private int speed;

    public Car() {
        this.power = false;
        this.speed = 0;
    }

    // 시동을 거는 메소드
    public void startUp(String s) {
        if(power) {
            System.out.println("이미 시동이 걸린 상태입니다.");
            return;
        }
        if(s.equals("시동")) {
            power = true;
            return;
        }
        power = false;
    }

    //엑셀을 밟아 속도를 올리는 메소드
    public void accelerate() {
        speed += 10;
    }

    //브레이크를 밟아 속도를 내리는 메소드
    public void decelerate() {
        if(speed < 10) {
            speed = 0;
            return;
        }
        speed -= 10;
    }

    public boolean getPower() {
        return power;
    }

    public int getSpeed() {
        return speed;
    }
    
    public void setPower(){
        power = !power;
    }

    public void setSpeed(int speed) {
        this.speed =speed;
    }
}

이와 같은 자동차 클래스가 존재한다고 하면 단위 테스트는 1. 시동을 거는 메소드, 2. 엑셀을 밟아 속도를 올리는 메소드, 3. 브레이크를 밟아 속도를 내리는 메소드를 테스트 코드를 작성하여 검증하면 됩니다.

위의 Car class를 보면 시동을 거는 메소드는 크게 3가지의 경우를 나눌 수 있습니다.
1. power가 false인 경우에 '시동'이 인자로 들어온 경우
2. power가 이미 true인 경우
3. power가 false인 경우에 '시동' 이외의 인자가 들어온 경우
이 3가지의 경우에 대해 기능을 검증하는 테스트코드는 다음과 같습니다.
CarTest.java(시동을 거는 메소드 테스트)

    @Test
    @DisplayName("power가 false이고 '시동' 이라는 문자가 들어왔을 때")
    void checkPowerOn() {
        //given
        boolean power = car.getPower();
        //when
        car.startUp("시동");
        //then
        assertThat(car.getPower()).isTrue();
    }

    @Test
    @DisplayName("power가 이미 true 인 경우")
    void checkPowerAlreadyTrue() {
        //given
        boolean power = car.getPower();
        car.startUp("시동");
        String str = "이미 시동이 걸린 상태입니다.";
        // prinln에 출력되는 문장을 파악가능
        OutputStream out = new ByteArrayOutputStream();
        System.setOut(new PrintStream(out));
        //when
        car.startUp("시동");
        //then
        assertThat(out.toString().trim()).isEqualTo(str);
    }

    @Test
    @DisplayName("power가 false인 상태에서 '시동' 이외의 문자가 들어온 경우")
    void checkPowerGivenError() {
        //given
        boolean power = car.getPower();
        //when
        car.startUp("시작");
        //then
        assertThat(car.getPower()).isFalse();
    }

엑셀을 밟아 가속을 하는 경우에는 다음과 같은 방식으로 테스트를 진행할 수 있습니다.

@Test
    @DisplayName("가속을 하는 경우")
    void checkAcceleration() {
        //given
        int speed = car.getSpeed();
        //when
        car.accelerate();
        //then
        assertThat(car.getSpeed()).isEqualTo(10);
    }

마지막으로 브레이크를 밟아 감속을 하는 경우에는 다음과 같은 방식으로 테스트를 진행할 수 있습니다.
1. 자동차 속도가 10 이상인 겅우
2. 자동차 속도가 10 미만인 경우
이 2가지의 경우를 테스트를 하면 다음과 같습니다.

@Test
    @DisplayName("감속을 하는 경우 speed가 10이상인 경우")
    void checkDecelerateSpeedOver10() {
        //given
        int speed = car.getSpeed();
        car.setSpeed(25);
        //when
        car.decelerate();
        //then
        assertThat(car.getSpeed()).isEqualTo(15);
    }

    @Test
    @DisplayName("감속을 하는 경우 speed가 10미만인 경우")
    void checkDecelerateSpeedLess10() {
        //given
        int speed = car.getSpeed();
        car.setSpeed(5);
        //when
        car.decelerate();
        //then
        assertThat(car.getSpeed()).isEqualTo(0);
    }

저는 단위 테스트를 작성할 때 메소드를 기준으로 경우의 수를 나누어서 각각 코드를 작성했고 이를 통해 메소드가 잘 동작하는 것을 확인할 수 있었습니다.

0개의 댓글