Go 유닛 테스트

Go에서 테스트 작성하기

Go는 간편하게 사용할 수 있는 테스트 프레임워크를 내장하고 있는데, "go test" 명령을 실행하여 테스트 코드들을 실행할 수 있다. "go test"는 현재 폴더에 있는 *_test.go 파일들을 테스트 코드로 인식하고, 이들을 일괄적으로 실행한다.

테스트 파일은 "testing" 이라는 표준패키지를 사용하는데, 먼저 testing 패키지를 import 하고, 테스트 메서드를 작성한다. 테스트 메서드는 TestXxx와 같은 특별한 메서드명을 갖는데, 앞의 Test는 해당 메서드가 테스트 메서드임을 알리는 것이고 Xxx는 임의의 메서드명으로 처음 글자는 항상 대문자이어야 한다. 메서드의 ProtoType은 아래와 같이 testing.T 포인터를 하나 입력으로 받으며 출력은 없다. 테스트 에러를 표시하기 위해 testing.T 의 Error(), Fail() 등의 메서드들을 사용한다.

func TestXxx(t *testing.T)

그럼 간단한 테스트 코드를 만들어 보자. 우선 테스트를 할 함수를 아래와 같이 간단히 작성한다. 이 코드를 /src/calc/calc.go 파일에 저장하는데, 패키지명을 calc로 하였으며, 이 패키지에는 Sum() 이라는 메서드 하나만을 작성하였다.

package calc

// Sum -
func Sum(a ...int) int {
	sum := 0
	for _, i := range a {
		sum += i
	}
	return sum
}

다음으로 이 Sum() 함수를 테스트할 테스트 코드로서 아래 코드들 /src/calc/calc_test.go 파일에 저장한다. 여기서 주목한 점은 테스트 패키지명을 calc가 아닌 다른 이름(calc_test)로 설정한다는 점과, 파일명을 *_test.go로 설정한 점이다. 아래 예제는 1,2,3을 더한 결과가 6이 아니면, t.Error() 메소드를 호출하여 테스트가 에러임을 알리는 유닛 테스트이다.

package calc_test

import (
	"calc"
	"testing"
)

func TestSum(t *testing.T) {
	s := calc.Sum(1, 2, 3)

	if s != 6 {
		t.Error("Wrong result")
	}
}

위와 같이 calc.go 라이브러리 함수 파일과 calc_test.go 라는 유닛 테스트 파일이 /src/calc 폴더에 생성되었으면, 아래와 같이 go test 명령을 실행하여 테스트 결과를 볼 수 있다 (Mac 에서의 실행 결과).

~/goapp/src/calc$ ls
calc.go         calc_test.go

~/goapp/src/calc$ go test
PASS
ok      calc    0.007s
~/goapp/src/calc$