成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 1.18 新增三大功能之一“模糊測試”使用方式

開發(fā) 前端
本文我們介紹 Go 模糊測試的使用方式,它可以很好地解決功能測試無法考慮到所有邊界問題的情況。

?1、介紹

在 Go 1.18 之前,Go 語言支持功能測試、基準測試和示例測試,在 Go 項目開發(fā)中,使用最多的是功能測試,讀者朋友們應該都比較熟悉功能測試的使用方式了。

在 Go 1.18 中,Go 語言新增模糊測試,本文我們介紹模糊測試的使用方式。

2、使用方式

Go 語言的模糊測試,與其他三種測試方式相同,測試文件的文件名以 _test.go? 結尾,測試文件中必須導入 testing 包。

模糊測試與其他三種測試方式的不同點是,函數(shù)名和函數(shù)簽名不同。

我們在之前關于 Go 測試的文章中介紹過,功能測試的函數(shù)名以 Test? 開頭,函數(shù)簽名是 t testing.T。

性能測試的函數(shù)名以 Benchmark? 開頭,函數(shù)簽名是 b testing.B。

模糊測試的函數(shù)名以 Fuzz? 開頭,函數(shù)簽名是 f testing.F。

與功能測試和性能測試相同,運行模糊測試也是使用 go test? 命令,讀者朋友們可以運行 go help test?或 go help testflag 了解更多。

3、模糊測試示例

Go 語言功能測試需要我們預定義測試值和與之對應的期望得到的值,如果測試輸出結果值與預先定義的期望值相同,則認為通過測試,反之,則認為未通過測試。

示例代碼:

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)
}

功能測試代碼:

func TestReverse(t *testing.T) {
testcases := []struct {
in, want string
}{
{"Hello, world", "dlrow ,olleH"},
{" ", " "},
{"!12345", "54321!"},
}
for _, tc := range testcases {
rev := Reverse(tc.in)
if rev != tc.want {
t.Errorf("Reverse: %q, want %q", rev, tc.want)
}
}
}

閱讀上面這段代碼,我們定義一個反轉字符串的函數(shù) Reverse?,并定義一個功能測試函數(shù) TestReverse,讀者朋友們應該非常熟悉類似的功能測試代碼。

但是,在實際項目開發(fā)中,我們很難考慮到所有測試用例,比如上面這段代碼運行結果是通過測試,我們一般就會認為定義的反轉字符串函數(shù) Reverse 功能正常。

實際結果并非如此,我們在測試用例中加入一組中文字符串,{"我愛學編程", "程編學愛我"},,我們再運行功能測試代碼,得到的結果就是未通過。

聰明的讀者朋友們,應該已經(jīng)發(fā)現(xiàn)問題在哪,修復該問題也很簡單,只需將 []byte? 改為 []rune,當然,這不是本文的重點,我們也就不深入解釋問題的原因了。

模糊測試,就是 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 := Reverse(orig)
doubleRev := Reverse(rev)
if orig != doubleRev {
t.Errorf("Before: %q, after: %q", orig, doubleRev)
}
})
}

閱讀上面這段代碼,我們將功能測試代碼轉換為模糊測試代碼,仔細分析這段代碼,我們可以發(fā)現(xiàn),我們將功能測試中的輸入測試用例,通過 f.Add 將其作為模糊測是的種子語料庫。

在功能測試代碼的函數(shù)簽名中,新增一個字符串類型的參數(shù) orig?,將 orig? 原值經(jīng)過兩次反轉,如果最終結果與 orig? 不同,則為未通過測試,并將該代碼作為 f.Fuzz? 的參數(shù),這里的 orig 稱為模糊參數(shù)。

圖片

需要注意的是,運行模糊測試函數(shù)時,首次先不要使用 -fuzz,以確保種子輸入可以通過。

然后,在運行 go test -fuzz=Fuzz(也可以使用完整模糊測試函數(shù)名),運行失敗時,將導致運行失敗的輸入寫入種子語料庫。

接著,就是調式代碼,直到通過模糊測試,限于篇幅,我們不講述調試過程。

需要注意的時,當模糊測試可以通過時,模糊測試將一直運行,我們需要使用 ctrl-C? 結束程序。或者使用 -fuzztime 30s,代表如果模糊測試通過,運行 30s 將自動停止。

4、總結

本文我們介紹 Go 模糊測試的使用方式,它可以很好地解決功能測試無法考慮到所有邊界問題的情況。

關于模糊測是的更多內容,感興趣的讀者朋友們可以閱讀官方教程。

責任編輯:武曉燕 來源: Golang語言開發(fā)棧
相關推薦

2022-11-27 23:37:34

Go模式Workspaces

2022-07-12 06:17:43

GoogleGolang開發(fā)工作

2013-07-25 09:05:11

谷歌Android4.3

2019-04-29 13:35:32

iOS 13蘋果iPad

2022-01-10 11:33:17

Go測試軟件

2010-12-16 20:54:07

Windows Azu

2022-01-26 09:02:57

GoCut方法

2012-07-27 14:45:12

傲游瀏覽器傲游瀏覽器

2012-08-10 10:59:18

IP-guard信息泄露信息防泄露

2009-11-05 10:29:14

Visual Stud

2021-09-27 22:29:39

iOS微信系統(tǒng)

2022-09-08 17:16:10

iOS蘋果功能

2016-06-13 13:53:24

iosgif蘋果

2012-10-16 09:25:33

Windows 8

2011-05-24 15:12:15

Android

2018-04-03 12:26:14

2020-07-19 11:10:20

QQ郵箱功能推送

2012-05-24 14:36:00

傲游瀏覽器Android

2011-07-06 11:33:18

Windows 8

2009-09-27 10:03:53

Silverlight
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲高清视频一区二区 | 91 视频网站 | 一级黄大片 | 精品福利一区二区三区 | av在线免费观看网站 | 欧美日韩精品久久久免费观看 | av看片网| 一区二区片| 成人伊人| 成人性视频免费网站 | 视频第一区 | 国产精品久久国产精品 | 亚洲成人三区 | 日本超碰在线 | 成人在线观看免费视频 | 亚洲福利一区 | 亚洲vs天堂 | h在线播放 | 日韩一级不卡 | 天天干天天色 | 成人午夜性成交 | 亚洲一区二区三区四区五区午夜 | 天天操网 | 国产一区免费 | 美女一级a毛片免费观看97 | 国产一区二区免费 | 第四色狠狠 | 高清欧美性猛交xxxx黑人猛交 | 国产精品一区二区久久精品爱微奶 | 国产91丝袜在线播放 | 国产精品99久久久久久久vr | 欧美成人精品在线观看 | 黄色av网站在线观看 | 成人精品久久久 | 国产乱码精品一区二区三区忘忧草 | 在线视频亚洲 | 国产精品久久久久久久久免费 | 九九亚洲 | 97在线观视频免费观看 | 亚洲一区二区三区视频免费观看 | 欧美中文视频 |