PHpullh
학습 라이브러리/Go/서브테스트

GO · 테스트

서브테스트

t.Run으로 서브테스트를 만들어 테스트를 구조화합니다. 개별 실행과 병렬 처리가 가능합니다.

테스트중급subtestparalleltestingstructured

핵심 설명

t.Run으로 서브테스트를 만들어 테스트를 구조화합니다. 개별 실행과 병렬 처리가 가능합니다.

Go code

package main

import (
	"fmt"
	"testing"
)

func TestUserService(t *testing.T) {
	// 셋업
	// db := setupTestDB(t)

	t.Run("Create", func(t *testing.T) {
		t.Run("유효한 입력", func(t *testing.T) {
			// 테스트 코드
		})
		t.Run("중복 이메일", func(t *testing.T) {
			// 테스트 코드
		})
	})

	t.Run("Find", func(t *testing.T) {
		t.Run("존재하는 ID", func(t *testing.T) {
			// 테스트 코드
		})
		t.Run("존재하지 않는 ID", func(t *testing.T) {
			// 테스트 코드
		})
	})

	// 병렬 서브테스트
	t.Run("Parallel", func(t *testing.T) {
		tests := []string{"test1", "test2", "test3"}
		for _, name := range tests {
			t.Run(name, func(t *testing.T) {
				t.Parallel() // 병렬 실행
				// 독립적인 테스트
			})
		}
	})
}

func main() {
	// go test -v -run TestUserService/Create/유효한_입력
	fmt.Println("서브테스트: go test -v -run TestX/SubTest")
}

학습 팁

go test -run TestX/SubName으로 특정 서브테스트만 실행할 수 있습니다. 한글 이름도 지원됩니다.

주의할 점

t.Parallel()을 사용할 때 외부 변수를 캡처하면 레이스 컨디션이 발생합니다. Go 1.22+에서는 루프 변수가 안전합니다.

자주 묻는 질문

서브테스트란 무엇인가요?

t.Run 으로 서브테스트를 만들어 테스트를 구조화합니다. 개별 실행과 병렬 처리가 가능합니다.

서브테스트 학습 시 주의할 점은 무엇인가요?

t.Parallel() 을 사용할 때 외부 변수를 캡처하면 레이스 컨디션이 발생합니다. Go 1.22+에서는 루프 변수가 안전합니다.