修复错误 Reverse为了解决这个问题,如果输入不是有效的UTF8,让我们返回一个错误。 1、编写代码 a。在您的文本编辑器中,将现有Reverse函数替换为以下内容。funcReverse(sstring)(string,error){if!utf8。ValidString(s){returns,errors。New(inputisnotvalidUTF8)}r:〔〕rune(s)fori,j:0,len(r)1;ilen(r)2;i,ji1,j1{r〔i〕,r〔j〕r〔j〕,r〔i〕}returnstring(r),nil} 如果输入字符串包含无效的UTF8字符,此更改将返回错误。 b。由于Reverse函数现在返回错误,因此修改main函数以丢弃额外的错误值。将现有main功能替换为以下内容。funcmain(){input:Thequickbrownfoxjumpedoverthelazydogrev,revErr:Reverse(input)doubleRev,doubleRevErr:Reverse(rev)fmt。Printf(original:q,input)fmt。Printf(reversed:q,err:v,rev,revErr)fmt。Printf(reversedagain:q,err:v,doubleRev,doubleRevErr)} 这些调用Reverse应该返回一个nil错误,因为输入字符串是有效的UTF8。 c。您将需要导入错误和unicodeutf8包。main。go中的import语句应如下所示。import(errorsfmtunicodeutf8) d。修改reversetest。go文件检查是否有错误,如果返回产生错误则跳过测试。funcFuzzReverse(ftesting。F){testcases:〔〕string{Hello,world,,!12345}for,tc:rangetestcases{f。Add(tc)Usef。Addtoprovideaseedcorpus}f。Fuzz(func(ttesting。T,origstring){rev,err1:Reverse(orig)iferr1!nil{return}doubleRev,err2:Reverse(rev)iferr2!nil{return}iforig!doubleRev{t。Errorf(Before:q,after:q,orig,doubleRev)}ifutf8。ValidString(orig)!utf8。ValidString(rev){t。Errorf(ReverseproducedinvalidUTF8stringq,rev)}})} 除了返回之外,您还可以调用t。Skip()以停止执行该模糊输入。 2、运行代码 a。使用gotest运行测试gotestPASSokexamplefuzz0。019s b。使用gotestfuzzFuzz进行模糊测试,几秒钟后,停止用ctrlC模糊测试。gotestfuzzFuzzfuzz:elapsed:0s,gatheringbaselinecoverage:038completedfuzz:elapsed:0s,gatheringbaselinecoverage:3838completed,nowfuzzingwith4workersfuzz:elapsed:3s,execs:86342(28778sec),newinteresting:2(total:35)fuzz:elapsed:6s,execs:193490(35714sec),newinteresting:4(total:37)fuzz:elapsed:9s,execs:304390(36961sec),newinteresting:4(total:37)。。。fuzz:elapsed:3m45s,execs:7246222(32357sec),newinteresting:8(total:41)Cfuzz:elapsed:3m48s,execs:7335316(31648sec),newinteresting:8(total:41)PASSokexamplefuzz228。000s 除非您通过fuzztime标志进行限制,否则模糊测试将一直运行,直到遇到失败的输入。如果没有发生故障,默认是永远运行,并且可以使用中断该过程ctrlC。 c。使用gotestfuzzFuzzfuzztime30s。如果没有30秒发现失败,它会在退出模糊测试。gotestfuzzFuzzfuzztime30sfuzz:elapsed:0s,gatheringbaselinecoverage:05completedfuzz:elapsed:0s,gatheringbaselinecoverage:55completed,nowfuzzingwith4workersfuzz:elapsed:3s,execs:80290(26763sec),newinteresting:12(total:12)fuzz:elapsed:6s,execs:210803(43501sec),newinteresting:14(total:14)fuzz:elapsed:9s,execs:292882(27360sec),newinteresting:14(total:14)fuzz:elapsed:12s,execs:371872(26329sec),newinteresting:14(total:14)fuzz:elapsed:15s,execs:517169(48433sec),newinteresting:15(total:15)fuzz:elapsed:18s,execs:663276(48699sec),newinteresting:15(total:15)fuzz:elapsed:21s,execs:771698(36143sec),newinteresting:15(total:15)fuzz:elapsed:24s,execs:924768(50990sec),newinteresting:16(total:16)fuzz:elapsed:27s,execs:1082025(52427sec),newinteresting:17(total:17)fuzz:elapsed:30s,execs:1172817(30281sec),newinteresting:17(total:17)fuzz:elapsed:31s,execs:1172817(0sec),newinteresting:17(total:17)PASSokexamplefuzz31。025s 模糊测试通过了! 结论 做得很好!您刚刚学习了在Go中进行模糊测试。 完成的代码 main。gopackagemainimport(errorsfmtunicodeutf8)funcmain(){input:Thequickbrownfoxjumpedoverthelazydogrev,revErr:Reverse(input)doubleRev,doubleRevErr:Reverse(rev)fmt。Printf(original:q,input)fmt。Printf(reversed:q,err:v,rev,revErr)fmt。Printf(reversedagain:q,err:v,doubleRev,doubleRevErr)}funcReverse(sstring)(string,error){if!utf8。ValidString(s){returns,errors。New(inputisnotvalidUTF8)}r:〔〕rune(s)fori,j:0,len(r)1;ilen(r)2;i,ji1,j1{r〔i〕,r〔j〕r〔j〕,r〔i〕}returnstring(r),nil} reversetest。gopackagemainimport(testingunicodeutf8)funcFuzzReverse(ftesting。F){testcases:〔〕string{Hello,world,,!12345}for,tc:rangetestcases{f。Add(tc)Usef。Addtoprovideaseedcorpus}f。Fuzz(func(ttesting。T,origstring){rev,err1:Reverse(orig)iferr1!nil{return}doubleRev,err2:Reverse(rev)iferr2!nil{return}iforig!doubleRev{t。Errorf(Before:q,after:q,orig,doubleRev)}ifutf8。ValidString(orig)!utf8。ValidString(rev){t。Errorf(ReverseproducedinvalidUTF8stringq,rev)}})}