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

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 를 매개변수로 받아야 합니다. 일반 테스트와 시그니처가 다릅니다.