Learning
레슨 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)는 가장 권장되는 테스트 패턴입니다. 테스트 케이스를 구조체 슬라이스로 정의하면 추가가 쉽고 가독성이 좋습니다.