요구사항 정리하기

TDD로 개발해 볼 과제 소개

대학에 처음 입학하고 선배들에게 번호를 받고 싶으면 업-다운 게임을 했어야했다. 예를 들어 4자리라고 한다면, 010-1234-XXXX의 XXXX 부분을 하나씩 맞춰야 했다. 5를 부르면 5가 아니라면 업이나 다운이라는 피드백을 술 한 잔과 함께 주고, 맞으면 그 다음 자리로 넘어가는 형식이었다. 이번 시리즈에서는 이와 비슷한 업-다운 게임을 만들어보자.

요구사항

  • 컴퓨터가 1~100 사이에서 랜덤하게 값을 정한다.

  • 사용자는 숫자를 입력한다.

  • 컴퓨터가 정한 숫자와 일치할 때 까지 사용자는 숫자를 입력하고, 크거나 작다는 피드백을 받는다.

예시

게임을 시작합니다.
1~100 사이의 숫자를 입력하세요: 50
UP
1~100 사이의 숫자를 입력하세요: 75
UP
1~100 사이의 숫자를 입력하세요: 90
DOWN
1~100 사이의 숫자를 입력하세요: 87
정답입니다!

요구사항 정리

우선, 과제의 요구사항을 정리해본다.

  • 게임 시작 문구 출력

  • 1~100 사이의 임의의 정수 생성

  • 사용자 입력

    • 1~100 사이의 정수인지 검증

  • 검증된 사용자 입력과 생성된 정수 대소비교

  • 일치한다면 종료

  • 일치하지 않는다면 피드백

어떤 요구사항을 테스트로 짜야할까?

Unit test하기 좋은 함수가 되기 위해선 input에 따라 output이 항상 같아야 한다. 그러므로 임의의 정수를 생성하는 것, 사용자 입력 등은 input 또는 output이 변경될 수 있으므로 테스트 할 필요성이 적다고 할 수 있다. 테스트는 항상 통과해야하기 때문에 테스트 하기 좋은 함수들에 한하여 테스트를 작성해야한다.

요구사항을 기준으로 테스트 정하기

우리가 테스트하고 싶은 것은 다음과 같다.

  • 1~100 사이의 임의의 정수 생성

    • 임의의 값을 생성할 때 범위를 넘어가면 Exceptionthrow할 것

  • 사용자 입력

    • 사용자 입력이 1~100 사이의 정수가 아니라면 Exceptionthrow할 것

  • 검증된 사용자 입력과 생성된 정수 대소비교

    • 사용자 입력 정수와 생성된 정수 일치 여부 확인

  • 사용자 입력 정수와 생성된 정수 대소 비교

이게 뭔 개소리야

임의의 정수를 생성하는 것, 사용자 입력 등은 input 또는 output이 변경될 수 있으므로 테스트 할 필요성이 적다고 할 수 있다.

라고 해놓고 임의의 값을 생성할 때 테스트를 한다고?

테스트를 할 수 있게 만들면 된다

int number = new Random().nextInt(100) + 1;

이것을 테스트할 수 있을까? 프로그래머 입장에서 number가 1부터 100 사이의 값이 나온다는 것은 알 수 있다. 하지만 테스트할 때 이보다 복잡한 랜덤 함수를 10억번 돌려서 무조건 통과한다는 보장이 있을까? 이를 위해서 테스트가 가능하도록 구조를 바꿔야한다. 예시로 Number라는 클래스를 만들고 생성자에서 이를 검증하도록 하겠다.

public class Number {
    private int number;

    public Number(int number) {
        if (number < 1 || number > 100) {
            return new IllegalArgumentException("1 이상 100 이하만 가능합니다");
        }
        this.number = number;
    }
}

Number number = new Number(new Random().nextInt(100) + 1);

이런 구조에서는 테스트 시 new Number(0)new Number(101)에서 IllegalArgumentExceptionthrow 할 것이고, 이 검증을 이용해 random이 아닌 Number 객체를 테스트할 수 있다.

이번 글에서는 요구사항을 정리하며 테스트로 짜기 좋은 함수들을 어떻게 만들지 알아보았으니, 다음 글에서는 실제로 테스트를 작성하며 요구사항을 충족하는 프로그램을 만들어보자.

Last updated