GO · 테스트
퍼즈 테스트
Go 1.18의 퍼즈 테스트로 예상치 못한 입력에 대한 버그를 자동 발견합니다.
테스트고급fuzztestingproperty-basedgo118
핵심 설명
Go 1.18의 퍼즈 테스트로 예상치 못한 입력에 대한 버그를 자동 발견합니다.
Go code
package main
import (
"fmt"
"testing"
"unicode/utf8"
)
func Reverse(s string) string {
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
func FuzzReverse(f *testing.F) {
// 시드 코퍼스 (초기 입력)
f.Add("hello")
f.Add("세계")
f.Add("")
f.Add("🌍🎉")
f.Fuzz(func(t *testing.T, orig string) {
rev := Reverse(orig)
doubleRev := Reverse(rev)
// 불변식 검증
if orig != doubleRev {
t.Errorf("두 번 뒤집기 실패: %q → %q → %q",
orig, rev, doubleRev)
}
if utf8.ValidString(orig) && !utf8.ValidString(rev) {
t.Errorf("유효한 UTF-8이 뒤집기 후 무효: %q", orig)
}
})
}
func main() {
fmt.Println("퍼즈 테스트:")
fmt.Println(" go test -fuzz=FuzzReverse # 퍼즈 실행")
fmt.Println(" go test -fuzz=FuzzReverse -fuzztime=30s # 30초간 실행")
}학습 팁
퍼즈 테스트는 "입력-출력 쌍"보다 "불변식(invariant)"을 검증합니다. "두 번 적용하면 원래대로" 같은 속성이 적합합니다.
주의할 점
퍼즈 함수 이름은 Fuzz로 시작해야 하며, *testing.F를 매개변수로 받아야 합니다. 일반 테스트와 시그니처가 다릅니다.
자주 묻는 질문
퍼즈 테스트란 무엇인가요?
Go 1.18의 퍼즈 테스트로 예상치 못한 입력에 대한 버그를 자동 발견합니다.
퍼즈 테스트 학습 시 주의할 점은 무엇인가요?
퍼즈 함수 이름은 Fuzz 로 시작해야 하며, *testing.F 를 매개변수로 받아야 합니다. 일반 테스트와 시그니처가 다릅니다.