반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
Go 에서 테스트 코드 란 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.
질문 >
Go 에서 테스트 코드 란 무엇이며, 어떻게 활용할 수 있나요?
답변 >
Go에서 테스트 코드란?
Go에서 테스트 코드는 프로그램의 기능이 기대한 대로 작동하는지 확인하기 위해 작성된 코드입니다. 테스트 코드는 일반적으로 표준 라이브러리에서 제공하는 testing 패키지를 사용하여 작성됩니다.
테스트 코드는 프로그램의 유지보수성을 높이고, 새로운 변경 사항이 기존 기능을 망가뜨리지 않도록 보장하는 데 도움을 줍니다.
테스트 코드의 특징
- 파일 이름: 테스트 코드는 _test.go로 끝나는 파일에 작성됩니다.
- 예: main_test.go
- 함수 이름: 테스트 함수는 반드시 Test로 시작해야 하며, 함수 시그니처는 다음과 같습니다:
func Test함수명(t *testing.T) {
// 테스트 코드
}
- testing.T: 테스트 함수는 testing.T 타입의 매개변수를 받아야 하며, 이를 통해 테스트 실패를 기록할 수 있습니다.
테스트 코드 작성 예제
1. 단위 테스트(Unit Test)
예제: 기능 테스트
// calculator.go
package calculator
func Add(a, b int) int {
return a + b
}
// calculator_test.go
package calculator
import "testing"
func TestAdd(t *testing.T) {
result := Add(2, 3)
if result != 5 {
t.Errorf("Add(2, 3) = %d; want 5", result)
}
}
실행 방법:
go test
2. 테스트 실패 처리
- testing.T에는 다음 메서드가 있습니다:
- t.Fail(): 테스트를 실패로 표시하지만 실행을 계속합니다.
- t.FailNow(): 테스트를 실패로 표시하고 즉시 실행을 중단합니다.
- t.Error(args ...)와 t.Errorf(format string, args ...): 실패 메시지를 기록하고 실행을 계속합니다.
- t.Fatal(args ...)와 t.Fatalf(format string, args ...): 실패 메시지를 기록하고 실행을 중단합니다.
테스트의 유형
1. 단위 테스트 (Unit Tests)
- 함수나 메서드와 같은 작은 단위를 테스트합니다.
2. 테이블 기반 테스트
- 여러 입력값과 기대값을 하나의 테이블로 정의하여 테스트를 반복 실행합니다.
예제
func TestAddTable(t *testing.T) {
tests := []struct {
a, b, expected int
}{
{1, 2, 3},
{0, 0, 0},
{-1, -1, -2},
}
for _, test := range tests {
result := Add(test.a, test.b)
if result != test.expected {
t.Errorf("Add(%d, %d) = %d; want %d", test.a, test.b, result, test.expected)
}
}
}
3. 벤치마크 테스트
- 코드 성능을 측정하기 위한 테스트로, Benchmark로 시작하는 함수를 작성합니다.
예제
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(1, 2)
}
}
실행 방법:
go test -bench=.
4. 예제 테스트
- 코드의 사용 예제를 문서화하고, 동작을 확인합니다.
- 함수 이름은 Example로 시작해야 하며, 출력 결과를 주석으로 기대값으로 표시합니다.
예제
func ExampleAdd() {
result := Add(2, 3)
fmt.Println(result)
// Output: 5
}
실행 방법:
go test
고급 테스트 기능
1. Mocking
- 실제 외부 종속성을 테스트 환경에서 대체하기 위해 사용됩니다.
- Go에서는 인터페이스와 함수 타입을 활용하여 mocking을 구현할 수 있습니다.
2. t.Run으로 하위 테스트 작성
- 테스트를 논리적으로 분리하고 이름을 부여할 수 있습니다.
func TestAddSubtests(t *testing.T) {
t.Run("Positive numbers", func(t *testing.T) {
if Add(1, 2) != 3 {
t.Fail()
}
})
t.Run("Negative numbers", func(t *testing.T) {
if Add(-1, -2) != -3 {
t.Fail()
}
})
}
3. Coverage(커버리지) 확인
- 테스트 코드가 실제 코드의 몇 퍼센트를 커버하는지 확인합니다.
go test -cover
테스트 코드 작성 시 유의점
- 단순하고 독립적이어야 함:
- 테스트는 한 번에 하나의 기능만 확인해야 합니다.
- 외부 의존성 최소화:
- 파일, 네트워크, 데이터베이스 등 외부 의존성은 mock으로 대체하거나 최소화합니다.
- 에러 메시지 작성:
- 테스트 실패 시 디버깅을 돕는 명확한 메시지를 작성합니다.
결론
Go의 테스트 코드는 간단한 문법과 강력한 도구(testing 패키지)를 통해 안정적이고 유지보수 가능한 프로그램을 작성하는 데 필수적입니다. 단위 테스트, 벤치마크, 예제 테스트 등 다양한 유형의 테스트를 활용하면 코드의 품질을 높이고, 변경 사항이 기존 기능에 미치는 영향을 빠르게 파악할 수 있습니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com
반응형
'프로그래밍' 카테고리의 다른 글
👨💻 [Go] Go 에서 프로파일링 이란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.09 |
---|---|
👨💻 [Go] Go 에서 벤치마크 코드 란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.09 |
👨💻 [Go] Go 에서 메서드 란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.09 |
👨💻 [Go] Go 에서 함수란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.09 |
👨💻 [Go] Go 에서 sync.Map 은 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.08 |