[lectures/04-testing] Add fuzzing slides.
This commit is contained in:
parent
30da35632a
commit
3d8fa62c87
1 changed files with 51 additions and 0 deletions
|
@ -329,6 +329,57 @@ Good example
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
* Fuzzing
|
||||||
|
|
||||||
|
func Reverse(s string) string {
|
||||||
|
b := []byte(s)
|
||||||
|
for i, j := 0, len(b)-1; i < len(b)/2; i, j = i+1, j-1 {
|
||||||
|
b[i], b[j] = b[j], b[i]
|
||||||
|
}
|
||||||
|
return string(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
* Fuzzing
|
||||||
|
|
||||||
|
func FuzzReverse(f *testing.F) {
|
||||||
|
testcases := []string{"Hello, world", " ", "!12345"}
|
||||||
|
for _, tc := range testcases {
|
||||||
|
f.Add(tc) // Use f.Add to provide a seed corpus
|
||||||
|
}
|
||||||
|
f.Fuzz(func(t *testing.T, orig string) {
|
||||||
|
rev := Reverse(orig)
|
||||||
|
doubleRev := Reverse(rev)
|
||||||
|
if orig != doubleRev {
|
||||||
|
t.Errorf("Before: %q, after: %q", orig, doubleRev)
|
||||||
|
}
|
||||||
|
if utf8.ValidString(orig) && !utf8.ValidString(rev) {
|
||||||
|
t.Errorf("Reverse produced invalid UTF-8 string %q", rev)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
* Fuzzing
|
||||||
|
|
||||||
|
go test -fuzz=Fuzz
|
||||||
|
fuzz: elapsed: 0s, gathering baseline coverage: 0/3 completed
|
||||||
|
fuzz: elapsed: 0s, gathering baseline coverage: 3/3 completed, now fuzzing with 8 workers
|
||||||
|
fuzz: minimizing 38-byte failing input file...
|
||||||
|
--- FAIL: FuzzReverse (0.01s)
|
||||||
|
--- FAIL: FuzzReverse (0.00s)
|
||||||
|
reverse_test.go:20: Reverse produced invalid UTF-8 string "\x9c\xdd"
|
||||||
|
|
||||||
|
Failing input written to testdata/fuzz/FuzzReverse/af69258a12129d6cbba438df5d5f25ba0ec050461c116f777e77ea7c9a0d217a
|
||||||
|
To re-run:
|
||||||
|
go test -run=FuzzReverse/af69258a12129d6cbba438df5d5f25ba0ec050461c116f777e77ea7c9a0d217a
|
||||||
|
FAIL
|
||||||
|
exit status 1
|
||||||
|
FAIL example/fuzz 0.030s
|
||||||
|
|
||||||
|
Что сломало реализацию?
|
||||||
|
|
||||||
|
go test fuzz v1
|
||||||
|
string("泃")
|
||||||
|
|
||||||
* Parallel tests
|
* Parallel tests
|
||||||
|
|
||||||
func TestA(t *testing.T) {
|
func TestA(t *testing.T) {
|
||||||
|
|
Loading…
Reference in a new issue