12장 테스트

프로그래밍은 쉽지 않다. 최고의 프로그래머들조차도 늘 정확히 의도한 대로 동작하는 프로그램을 작성하는 능력은 갖추고 있지 않다. 따라서 소프트웨어 개발 프로세스의 중요한 부분 중 하나는 바로 테스트다. 우리가 작성한 코드에 대한 테스트를 작성하는 것은 품질을 보장하고 가독성을 향상시키는 좋은 방법이다.

Go에는 테스트를 작성하기 쉽게 만들어 주는 특별한 프로그램이 포함돼 있으니 11장에서 만든 패키지에 대한 테스트를 만들어 보자. chapter11 안의 math 폴더에서 math_test.go라는 파일을 하나 만들고 다음과 같은 내용을 입력한다.

package math

import "testing"

func TestAverage(t *testing.T) {
    var v float64
    v = Average([]float64{1,2})
    if v != 1.5 {
        t.Error("Expected 1.5, got ", v)
    }
}

이제 다음 명령어를 실행한다.

go test

그럼 다음과 같이 출력될 것이다.

$ go test
PASS
ok      golang-book/chapter11/math      0.032s

go test 명령을 실행하면 현재 폴더에 들어 있는 파일에서 테스트를 찾아 실행한다. 함수의 이름이 Test라는 단어로 시작하고 *testing.T를 인자로 받으면 테스트로 간주된다. 예제의 경우 Average 함수를 테스트하고 있으므로 테스트 함수의 이름으로 TestAverage를 지정했다.

테스트 함수가 준비되면 테스트할 코드를 사용하는 테스트를 작성한다. 예제의 경우 [1,2]의 평균은 1.5임을 알고 있으므로 이를 검사하겠다. 다양한 숫자 조합을 많이 테스트하는 것이 좋을 테니 테스트 프로그램을 조금 변경해 보자.

package math

import "testing"

type testpair struct {
    values []float64
    average float64
}

var tests = []testpair{
    { []float64{1,2}, 1.5 },
    { []float64{1,1,1,1,1,1}, 1 },
    { []float64{-1,1}, 0 },
}

func TestAverage(t *testing.T) {
    for _, pair := range tests {
        v := Average(pair.values)
        if v != pair.average {
            t.Error(
                "For", pair.values,
                "expected", pair.average,
                "got", v,
            )
        }
    }
}

위 코드는 테스트를 준비할 때 흔히 쓰는 방법이다(Go에 포함된 소스코드에서 다양한 예제를 찾아볼 수 있다). 여기서는 struct를 이용해 함수의 입력과 출력을 표현했다. 그런 다음 이러한 struct(쌍)의 리스트를 만들었다. 마지막으로 리스트의 원소를 순회하면서 함수를 실행했다.

연습문제

  1. 훌륭한 테스트 스위트를 작성하기란 언제나 쉬운 일은 아니지만 테스트를 작성하는 과정에서 문제에 관한 정보가 더 드러나기도 한다. 예를 들어, Average 함수에서 빈 리스트([]float64{})를 전달하면 어떻게 되는가? 이 경우 함수에서 0을 반환하게 하려면 어떻게 해야 하는가?

  2. 이전 장에서 작성한 MinMax 함수에 대한 테스트를 각각 작성하라.

← 이전다음 →