PHpullh
학습 라이브러리/Go/testcontainers 패턴

GO · 테스트

testcontainers 패턴

Docker 컨테이너를 테스트에서 자동으로 시작/종료합니다. 실제 DB, Redis 등과 통합 테스트합니다.

테스트고급testcontainersdockerintegrationdatabase

핵심 설명

Docker 컨테이너를 테스트에서 자동으로 시작/종료합니다. 실제 DB, Redis 등과 통합 테스트합니다.

Go code

package main

import (
	"context"
	"fmt"
	"testing"
)

// testcontainers-go 사용 예시
// import "github.com/testcontainers/testcontainers-go"

type TestDB struct {
	Host string
	Port int
	// container testcontainers.Container
}

func SetupPostgres(t *testing.T) *TestDB {
	t.Helper()

	// ctx := context.Background()
	// req := testcontainers.ContainerRequest{
	//     Image:        "postgres:16",
	//     ExposedPorts: []string{"5432/tcp"},
	//     Env: map[string]string{
	//         "POSTGRES_PASSWORD": "test",
	//         "POSTGRES_DB":       "testdb",
	//     },
	//     WaitingFor: wait.ForListeningPort("5432/tcp"),
	// }
	// container, _ := testcontainers.GenericContainer(ctx, req)
	// host, _ := container.Host(ctx)
	// port, _ := container.MappedPort(ctx, "5432")

	db := &TestDB{Host: "localhost", Port: 5432}

	t.Cleanup(func() {
		fmt.Println("컨테이너 정리")
		// container.Terminate(ctx)
	})

	return db
}

func TestWithPostgres(t *testing.T) {
	if testing.Short() { t.Skip("통합 테스트") }
	db := SetupPostgres(t)
	fmt.Printf("테스트 DB: %s:%d\n", db.Host, db.Port)
}

func main() {
	_ = context.Background()
	fmt.Println("testcontainers: Docker 기반 통합 테스트")
}

학습 팁

t.Cleanup으로 컨테이너를 정리하면 테스트 실패 시에도 자동으로 정리됩니다.

주의할 점

각 테스트마다 컨테이너를 시작하면 느립니다. TestMain에서 한 번 시작하고 여러 테스트에서 공유하세요.

자주 묻는 질문

testcontainers 패턴란 무엇인가요?

Docker 컨테이너를 테스트에서 자동으로 시작/종료합니다. 실제 DB, Redis 등과 통합 테스트합니다.

testcontainers 패턴 학습 시 주의할 점은 무엇인가요?

각 테스트마다 컨테이너를 시작하면 느립니다. TestMain 에서 한 번 시작하고 여러 테스트에서 공유하세요.