레슨 6 / 8·20분
테스트 작성
Go 테스트 기본
Go는 testing 패키지로 테스트를 기본 지원합니다. _test.go 파일에 Test로 시작하는 함수를 작성하면 go test로 실행할 수 있습니다.
go
// calc.go
package calc
func Add(a, b int) int {
return a + b
}
func Multiply(a, b int) int {
return a * b
}
func Abs(n int) int {
if n < 0 {
return -n
}
return n
}go
// calc_test.go
package calc
import "testing"
// 기본 테스트
func TestAdd(t *testing.T) {
result := Add(2, 3)
if result != 5 {
t.Errorf("Add(2, 3) = %d; want 5", result)
}
}
// 테이블 기반 테스트 (Table-Driven Test)
func TestMultiply(t *testing.T) {
tests := []struct {
name string
a, b int
expected int
}{
{"양수", 3, 4, 12},
{"음수", -2, 5, -10},
{"0 곱하기", 0, 100, 0},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := Multiply(tt.a, tt.b)
if result != tt.expected {
t.Errorf("Multiply(%d, %d) = %d; want %d",
tt.a, tt.b, result, tt.expected)
}
})
}
}벤치마크 테스트
go
// calc_test.go (계속)
// 벤치마크 - Benchmark로 시작
func BenchmarkAbs(b *testing.B) {
for i := 0; i < b.N; i++ {
Abs(-42)
}
}
// 실행:
// $ go test -bench=.
// BenchmarkAbs-8 1000000000 0.3 ns/op테스트 실행 명령어
go
// 현재 패키지 테스트
// $ go test
// 상세 출력
// $ go test -v
// 특정 테스트만 실행
// $ go test -run TestAdd
// 모든 패키지 테스트
// $ go test ./...
// 커버리지 확인
// $ go test -cover
// 벤치마크 실행
// $ go test -bench=.- •
t.Error()/t.Errorf()-- 테스트 실패 보고 (계속 진행) - •
t.Fatal()/t.Fatalf()-- 테스트 실패 보고 (즉시 중단) - •
t.Run()-- 서브 테스트 실행 - •
t.Skip()-- 테스트 건너뛰기 - •
b.N-- 벤치마크 반복 횟수 (자동 조절)
💡
Go에서 테이블 기반 테스트(Table-Driven Test)는 가장 권장되는 테스트 패턴입니다. 테스트 케이스를 구조체 슬라이스로 정의하면 추가가 쉽고 가독성이 좋습니다.