이번 글에서는 Go언어에 TDD를 적용할 때 사용하는 테스트 프레임워크 go test에 대해 설명하겠다.
go test란?
go test는 Go언어에 자체적으로 내장된 테스트 프레임워크이다. 테스트 케이스를 형식에 맞춰서 작성하고 go test를 실행하면 자동적으로 테스트가 이루어진다.
절차
go test를 이용해 TDD를 적용하는 방법을 간단한 예시를 통해 설명하겠다.
0. 테스트할 간단한 프로그램 만들기
테스트하기 위해서는 당연히 테스트할 프로그램을 정의해야 한다. 우선 연습할 프로젝트 폴더 practice와 그 안에 Calc.go를 만들어서 아래와 같이 작성해보자.
package main
func main() {
}
func Add(a int, b int) int {
}
위의 함수 Add는 당연히 두 수를 더하는 함수이다. 물론 우리는 안에 넣을 코드를 바로 작성할 수 있지만 TDD에서는 잠시 참아야 한다.
1. 테스트 파일 및 테스트 케이스 만들기
이제 테스트 파일 Calc_test.go를 만들어보자. {이름}.go 파일의 테스트 파일은 반드시 {이름}_test.go로 이름을 지어야 한다.
package main
import "testing"
func TestAdd(t *testing.T) {
if Add(1, 3) != 4 {
t.Errorf("Errors in case 1 : Expected 4, Actual %d", Add(1, 3))
}
if Add(1, 0) != 2 {
t.Errorf("Errors in case 2 : Expected 2, Actual %d", Add(1, 0)) //Wrong case
}
if Add (1, -1) != 0 {
t.Errorf("Errors in case 3 : Expected 0, Actual %d", Add(1, -1))
}
}
그 후 명령행에서 테스트를 실행해보자. (IDE를 쓴다면 그 IDE에 맞게 Calc_test.go를 실행하면 된다)
go test
함수 Add가 int값을 반환해야 하는데 비어있기 때문에 당연히 에러가 발생한다.
2. 함수 작성하기
이번에는 Calc.go로 돌아가 함수 Add에 틀린(하지만 컴파일 에러는 일으키지 않는) 코드를 넣어보자.
func Add(a int, b int) int {
return a-b
}
3. 테스트하기
다시 테스트를 실행해보자. 컴파일이 완료되고 다음과 같은 메시지를 얻는다. (단, 테스트 소요 시간은 환경에 따라 다를 수 있다)
--- FAIL: TestAdd (0.00s)
Calc_test.go:7: Errors in case 1 : Expected 4, Actual -2
Calc_test.go:10: Errors in case 2 : Expected 2, Actual 1
Calc_test.go:13: Errors in case 3 : Expected 0, Actual 2
FAIL
exit status 1
FAIL practice 0.444s
간단하게 말하면 테스트에 실패했다는 의미이다.
4. 함수 고치기
이번에는 Calc.go의 함수 Add를 제대로 고쳐보자.
func Add(a int, b int) int {
return a+b
}
5. 다시 테스트하기
다시 테스트를 실행해보자.
--- FAIL: TestAdd (0.00s)
Calc_test.go:10: Errors in case 2 : Expected 2, Actual 1
FAIL
exit status 1
FAIL practice 0.390s
이번에도 에러 메시지가 우리를 반겨준다. 이번에는 특정 케이스에서 에러가 발생했으니 어느 테스트 케이스에서 에러가 났는지 확인해보자.
6. 테스트 케이스 수정하기 (일반적이지는 않음)
위의 에러 로그를 보면 case 2에서 에러가 발생한 것을 알 수 있다. Calc_test.go의 두번째 케이스를 보자.
if Add(1, 0) != 2 {
t.Errorf("Errors in case 2 : Expected 2, Actual %d", Add(1, 0)) //Wrong case
}
이런! 1+0는 2가 아니다. 가끔 오타 등의 이유로 테스트 케이스를 잘못 작성하는 경우가 있다. 테스트 케이스를 올바르게 수정하자.
if Add(1, 0) != 1 {
t.Errorf("Errors in case 2 : Expected 1, Actual %d", Add(1, 0))
}
7. 또 다시 테스트하기
테스트를 하면 다음과 같은 창이 뜬다.
PASS
ok practice 0.395s
축하한다. 함수 Add가 테스트에 통과했다. 이제 다른 함수를 만들러 가면 된다.
정리
위에서 0번 ~ 3번 정도를 제외하고는 순서가 바뀌거나 생략될 수 있다. 핵심은 '테스트 케이스를 먼저 작성하고 그에 맞춰 함수를 작성한다'는 것이다. 단, 테스트 케이스를 작성할 때 그 값이 정당한지 -혹시 위의 6번 같은 상황이 있는지- 확인해야 한다.
마치며...
이번 글에서는 Go언어에 TDD를 적용시키는 방법에 대해 알아봤다. 다음 글에서는 test 파일을 Simple & Clear하게 쓰는 법에 대해 설명하겠다.