Go 테스팅 마스터하기
Ethan Miller
Product Engineer · Leapcell

테스트 파일 구성
Go에서 테스트 파일은 일반적으로 테스트 대상 소스 파일과 동일한 패키지에 있으며 다음과 같은 명명 규칙을 따릅니다.
- 소스 파일: xxx.go
- 테스트 파일: xxx_test.go
테스트 파일 이름은 Go 툴체인이 인식하고 테스트 파일로 처리할 수 있도록 _test.go
로 끝나야 합니다.
테스트 함수 서명
테스트 함수는 다음 서명을 가져야 합니다.
func TestXxx(t *testing.T) { ... }
- 함수 이름은
Test
로 시작하고, 그 뒤에 테스트할 함수 또는 기능의 이름이 옵니다(일반적으로 대문자로 시작). - 테스트 실패를 보고하고 정보를 기록하는 데 사용되는 단일 매개변수
*testing.T
를 사용합니다.
테스트 함수 작성
기본 예제
math.go
파일에 있는 간단한 덧셈 함수 Add
가 있다고 가정합니다.
// math.go package mathutil func Add(a, b int) int { return a + b }
해당 테스트 파일 math_test.go
는 다음과 같이 작성할 수 있습니다.
// math_test.go package mathutil import ( "testing" ) func TestAdd(t *testing.T) { tests := []struct { a, b, expected int }{ {1, 2, 3}, {0, 0, 0}, {-1, 1, 0}, } for _, tt := range tests { result := Add(tt.a, tt.b) if result != tt.expected { t.Errorf("Add(%d, %d) = %d; expected %d", tt.a, tt.b, result, tt.expected) } } }
하위 테스트 사용
Go 1.7에서는 하위 테스트가 도입되어 동일한 테스트 함수 내에서 여러 관련 테스트를 실행하는 것이 더 편리해졌습니다.
func TestAdd(t *testing.T) { tests := []struct { a, b, expected int }{ {1, 2, 3}, {0, 0, 0}, {-1, 1, 0}, } for _, tt := range tests { t.Run(fmt.Sprintf("%d+%d", tt.a, tt.b), func(t *testing.T) { result := Add(tt.a, tt.b) if result != tt.expected { t.Errorf("Add(%d, %d) = %d; expected %d", tt.a, tt.b, result, tt.expected) } }) } }
테이블 기반 테스트 사용
테이블 기반 테스트는 함수의 동작을 테스트하기 위해 일련의 입력 및 예상 출력이 정의되는 일반적인 패턴입니다.
func TestMultiply(t *testing.T) { tests := []struct { a, b, expected int }{ {2, 3, 6}, {0, 5, 0}, {-2, 4, -8}, } for _, tt := range tests { t.Run(fmt.Sprintf("%d*%d", tt.a, tt.b), func(t *testing.T) { result := Multiply(tt.a, tt.b) if result != tt.expected { t.Errorf("Multiply(%d, %d) = %d; expected %d", tt.a, tt.b, result, tt.expected) } }) } }
테스트 실행
go test
명령 사용
테스트 파일이 포함된 패키지 디렉터리에서 다음 명령을 실행하여 모든 테스트를 실행합니다.
go test
특정 테스트 실행
특정 테스트 함수를 실행하려면 정규식을 지원하는 -run
매개변수를 사용할 수 있습니다.
go test -run TestAdd
자세한 출력 보기
각 테스트 함수에 대한 자세한 출력을 보려면 -v
플래그를 사용합니다.
go test -v
병렬로 테스트 실행
테스트 함수를 동시에 실행하여 테스트 효율성을 높이려면 t.Parallel()
을 사용합니다.
func TestSomething(t *testing.T) { t.Parallel() // test code }
테스트를 실행할 때 -parallel
을 사용하여 병렬로 실행할 테스트 수를 지정할 수 있습니다.
go test -parallel 4
테스트 커버리지
테스트 커버리지를 확인하려면 go test -cover
를 사용합니다.
커버리지 파일 생성:
go test -coverprofile=coverage.out go tool cover -html=coverage.out
테스트 커버리지를 확인하려면 go test -cover
를 사용합니다.
커버리지 파일 생성:
go test -coverprofile=coverage.out go tool cover -html=coverage.out
예제: 전체 테스팅 워크플로
테스트 커버리지를 작성, 실행 및 확인하는 방법을 보여주는 포괄적인 예제입니다.
소스 코드
// mathutil/math.go package mathutil func Add(a, b int) int { return a + b } func Multiply(a, b int) int { return a * b }
테스트 코드
// mathutil/math_test.go package mathutil import ( "testing" ) func TestAdd(t *testing.T) { tests := []struct { a, b, expected int }{ {1, 2, 3}, {0, 0, 0}, {-1, 1, 0}, } for _, tt := range tests { t.Run(fmt.Sprintf("%d+%d", tt.a, tt.b), func(t *testing.T) { result := Add(tt.a, tt.b) if result != tt.expected { t.Errorf("Add(%d, %d) = %d; expected %d", tt.a, tt.b, result, tt.expected) } }) } }
테스트 및 커버리지 실행
go test -v -coverprofile=coverage.out go tool cover -html=coverage.out
Go는 강력하고 간결한 테스팅 도구를 제공하여 테스트를 작성하고 유지 관리하는 데 매우 편리합니다. 테스트 파일을 적절하게 구성하고, 테스트 가능한 코드를 작성하고, 테스트 커버리지를 정기적으로 확인함으로써 개발자는 코드 품질과 안정성을 보장할 수 있습니다. 지속적인 통합과 결합된 자동화된 테스팅은 프로젝트 안정성을 보장하는 중요한 수단이 됩니다.
Go 프로젝트 호스팅을 위한 최고의 선택, Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무제한 프로젝트를 무료로 배포
- 사용량에 대해서만 지불 — 요청 없음, 요금 없음.
탁월한 비용 효율성
- 유휴 요금 없이 사용량에 따라 지불합니다.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 고성능
- 쉬운 동시성 처리를 위한 자동 확장.
- 운영 오버헤드가 없으므로 구축에만 집중하십시오.
설명서에서 자세히 알아보세요!
X에서 팔로우하세요: @LeapcellHQ