GO语言(十八)模糊测试入门(下)
修复错误
Reverse为了解决这个问题,如果输入不是有效的 UTF-8 ,让我们返回一个错误。
1、编写代码
a.在您的文本编辑器中,将现有Reverse函数替换为以下内容。 func Reverse(s string) (string, error) { if !utf8.ValidString(s) { return s, errors.New("input is not valid UTF-8") } r := []rune(s) for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { r[i], r[j] = r[j], r[i] } return string(r), nil }
如果输入字符串包含无效的 UTF-8 字符,此更改将返回错误。
b.由于 Reverse 函数现在返回错误,因此修改main函数以丢弃额外的错误值。将现有main功能替换为以下内容。 func main() { input := "The quick brown fox jumped over the lazy dog" rev, revErr := Reverse(input) doubleRev, doubleRevErr := Reverse(rev) fmt.Printf("original: %q ", input) fmt.Printf("reversed: %q, err: %v ", rev, revErr) fmt.Printf("reversed again: %q, err: %v ", doubleRev, doubleRevErr) }
这些调用Reverse应该返回一个 nil 错误,因为输入字符串是有效的 UTF-8。
c.您将需要导入错误和 unicode/utf8 包。main.go 中的 import 语句应如下所示。 import ( "errors" "fmt" "unicode/utf8" )
d.修改reverse_test.go文件检查是否有错误,如果返回产生错误则跳过测试。 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, err1 := Reverse(orig) if err1 != nil { return } doubleRev, err2 := Reverse(rev) if err2 != nil { return } 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) } }) }
除了返回之外,您还可以调用t.Skip()以停止执行该模糊输入。
2、运行代码
a.使用 go test 运行测试 $ go test PASS ok example/fuzz 0.019s
b.使用go test -fuzz=Fuzz进行模糊测试,几秒钟后,停止用ctrl-C模糊测试。 $ go test -fuzz=Fuzz fuzz: elapsed: 0s, gathering baseline coverage: 0/38 completed fuzz: elapsed: 0s, gathering baseline coverage: 38/38 completed, now fuzzing with 4 workers fuzz: elapsed: 3s, execs: 86342 (28778/sec), new interesting: 2 (total: 35) fuzz: elapsed: 6s, execs: 193490 (35714/sec), new interesting: 4 (total: 37) fuzz: elapsed: 9s, execs: 304390 (36961/sec), new interesting: 4 (total: 37) ... fuzz: elapsed: 3m45s, execs: 7246222 (32357/sec), new interesting: 8 (total: 41) ^Cfuzz: elapsed: 3m48s, execs: 7335316 (31648/sec), new interesting: 8 (total: 41) PASS ok example/fuzz 228.000s
除非您通过-fuzztime标志进行限制,否则模糊测试将一直运行,直到遇到失败的输入。如果没有发生故障,默认是永远运行,并且可以使用 中断该过程ctrl-C。
c.使用go test -fuzz=Fuzz -fuzztime 30s。如果没有30 秒发现失败,它会在退出模糊测试。 $ go test -fuzz=Fuzz -fuzztime 30s fuzz: elapsed: 0s, gathering baseline coverage: 0/5 completed fuzz: elapsed: 0s, gathering baseline coverage: 5/5 completed, now fuzzing with 4 workers fuzz: elapsed: 3s, execs: 80290 (26763/sec), new interesting: 12 (total: 12) fuzz: elapsed: 6s, execs: 210803 (43501/sec), new interesting: 14 (total: 14) fuzz: elapsed: 9s, execs: 292882 (27360/sec), new interesting: 14 (total: 14) fuzz: elapsed: 12s, execs: 371872 (26329/sec), new interesting: 14 (total: 14) fuzz: elapsed: 15s, execs: 517169 (48433/sec), new interesting: 15 (total: 15) fuzz: elapsed: 18s, execs: 663276 (48699/sec), new interesting: 15 (total: 15) fuzz: elapsed: 21s, execs: 771698 (36143/sec), new interesting: 15 (total: 15) fuzz: elapsed: 24s, execs: 924768 (50990/sec), new interesting: 16 (total: 16) fuzz: elapsed: 27s, execs: 1082025 (52427/sec), new interesting: 17 (total: 17) fuzz: elapsed: 30s, execs: 1172817 (30281/sec), new interesting: 17 (total: 17) fuzz: elapsed: 31s, execs: 1172817 (0/sec), new interesting: 17 (total: 17) PASS ok example/fuzz 31.025s
模糊测试通过了!
结论
做得很好!您刚刚学习了在 Go 中进行模糊测试。
完成的代码
— main.go — package main import ( "errors" "fmt" "unicode/utf8" ) func main() { input := "The quick brown fox jumped over the lazy dog" rev, revErr := Reverse(input) doubleRev, doubleRevErr := Reverse(rev) fmt.Printf("original: %q ", input) fmt.Printf("reversed: %q, err: %v ", rev, revErr) fmt.Printf("reversed again: %q, err: %v ", doubleRev, doubleRevErr) } func Reverse(s string) (string, error) { if !utf8.ValidString(s) { return s, errors.New("input is not valid UTF-8") } r := []rune(s) for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { r[i], r[j] = r[j], r[i] } return string(r), nil }
— reverse_test.go — package main import ( "testing" "unicode/utf8" ) 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, err1 := Reverse(orig) if err1 != nil { return } doubleRev, err2 := Reverse(rev) if err2 != nil { return } 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) } }) }
盘点差零差评的几款手机(1)离春节是越来越近了,很多朋友喜欢在过年换手机,但是更害怕换到智商监测机,今天作者给大家推荐三款口碑接近满分的三款手机,涵盖各大价位三星GalaxyS21Ultra5G(高端)三星G
蓝牙耳机圈里的颜值担当有哪些?感谢您的阅读,不考虑价位的话有小鸟TRACKAir苹果Airpodspro和漫步者w3小黄人定制版这三个在耳机圈里的颜值第一梯队。小鸟的TRACKAir系列耳机其实颜值都很高,比较
有高颜值的蓝牙耳机推荐吗?高颜值的蓝牙耳机真不少,头戴蓝牙耳机真有一款挺好看的,那就是缤特力BackBeatSense。缤特力BackBeatSense的设计比较的复古,深色的耳罩皮革10级金属外梁调节,都
2022苹果首场发布会新款iPhoneSE和MacBookAir将登场时间来到新的一年,苹果在2022年的首场发布会也开始出现很多消息。来自彭博社记者MarkGurman的消息称,苹果今年的第一场发布会会在三月或四月举行,往年的这个时间点都是苹果春季
日媒雅虎将对员工居住地不设限坐飞机出勤亦可中新经纬1月13日电据日本共同社消息,雅虎日本公司12日宣布,撤销有关员工居住地的限制,4月起推行可住在全国任何地方的制度。上下班交通方式除以往的电车新干线和巴士等外,还允许坐飞机
拒绝假期无聊综合症,这里有700万小时视频任你挑掐指一算,离春节也不过1月有余,转眼间也将迎来元旦小长假。怎样度过假期,追剧打游戏看比赛看电影上网课?随之你会发现假期居家期间如何有仪式感的度过,成为一个值得思考的问题。从手机屏幕
如何降低亚马逊FBA物流的送仓成本?很多卖家都会因为仓储成本大而苦恼,尤其是使用亚马逊FBA的卖家,除了平台服务费不便宜之外,还会经常遇到政策调整的问题,最终也是导致成本增加的问题。那么,如何降低FBA发货的成本呢?
戴上助听器会有杂音吗?助听器老是嗡嗡响是怎么回事?患者使用助听器后噪音很大,主要可能有三方面原因一可能是佩戴方法不正确,比如说助听器的耳塞没有戴好,就会产生一定啸叫声,可能误以为是噪声,患者应戴好耳塞或者更换耳膜二另一种情况是助听
如何有效与助听器佩戴者沟通?要有效地与听力损失患者交谈,需要他们最需要的关心,耐心和体谅,虽然助听器是好帮手,但并不能恢复佩戴者的正常听觉,他们需要的是被人接受即被视作一个正常健全的人,适当的运用一些技巧,加
旧iPhone反应太慢?实测发现更改地区可以让iPhone更流畅你有没有发现你的旧iPhone反应越来越慢流畅性大不如前?最近有用户发现可以通过更改手机地区提升运行速度,这疑似与当年电池门降速事件有关。据外媒PhoneArena报道,只要把iP
云电脑能用来挖矿吗?可以是可以但是1个小时挖不回来1小时的云电脑钱别多想了想法不错我们先了解下什么是云电脑1)硬件资源池服务器集群中的计算能力内存网络共享存储等形成硬件资源池,既可动态扩展,也可弹性分