最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go中的fuzz模糊測(cè)試使用實(shí)戰(zhàn)詳解

 更新時(shí)間:2023年12月22日 10:27:53   作者:Go學(xué)習(xí)日記  
這篇文章主要為大家介紹了Go中的fuzz模糊測(cè)試使用實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

軟件系統(tǒng)越復(fù)雜,測(cè)試就越重要。然而手動(dòng)測(cè)試可能會(huì)非常費(fèi)時(shí)和乏味。這就是為什么自動(dòng)化測(cè)試變的越來越流行的原因。今天我們來聊一聊自動(dòng)化測(cè)試中的一種測(cè)試技術(shù)就是fuzz測(cè)試,它是一種隨機(jī)測(cè)試技術(shù),可以幫助發(fā)現(xiàn)軟件系統(tǒng)中的漏洞和錯(cuò)誤。

Go語言目前已經(jīng)是非常流行的語言了,具有高效、并發(fā)等特性。今天我們淺談使用Go語言進(jìn)行fuzz測(cè)試。從Go1.18開始,Go在其標(biāo)準(zhǔn)工具鏈中支持模糊測(cè)試。

什么是fuzz測(cè)試

模糊測(cè)試 (fuzz testing, fuzzing)是一種軟件測(cè)試技術(shù)。其核心思想是將自動(dòng)或半自動(dòng)生成的隨機(jī)數(shù)據(jù)輸入到一個(gè)程序中,并監(jiān)視程序異常,如崩潰,斷言(assertion)失敗,以發(fā)現(xiàn)可能的程序錯(cuò)誤,比如內(nèi)存泄漏。模糊測(cè)試常常用于檢測(cè)軟件或計(jì)算機(jī)系統(tǒng)的安全漏洞。

Go語言中的模糊測(cè)試

Go為開發(fā)者提供了一套強(qiáng)大的工具,用于實(shí)施模糊測(cè)試,核心是testing包中的Fuzz函數(shù)。通過創(chuàng)建以Fuzz為前綴的函數(shù),按特定的簽名定義輸入輸出,可以很容易集成模糊測(cè)試到我們的Go程序中。

上圖是一個(gè)模糊測(cè)試的例子,突出顯示了它的主要組件。

模糊測(cè)試必須要遵循的規(guī)則:

  • Fuzz測(cè)試必須是一個(gè)函數(shù),函數(shù)名必須以"Fuzz"開頭,后面必須是一個(gè)大寫字母開頭的名稱,例如"FuzzAdd"。

  • Fuzz測(cè)試函數(shù)必須接受一個(gè)*testing.F類型的參數(shù),不能有返回值。

  • Fuzz測(cè)試函數(shù)必須在*_test.go文件中定義才能運(yùn)行。

  • Fuzz目標(biāo)必須是一個(gè)方法調(diào)用,第一個(gè)參數(shù)必須是*testing.F類型,后面跟隨著fuzz測(cè)試的參數(shù)。

  • 每個(gè)fuzz測(cè)試函數(shù)只能有一個(gè)fuzz目標(biāo)。

  • 所有的種子語料庫條目的類型必須與fuzz測(cè)試的參數(shù)類型相同,順序也必須相同。這適用于對(duì)Fuzz函數(shù)的調(diào)用以及fuzz測(cè)試的testdata/fuzz目錄中的任何語料庫文件。

Fuzz測(cè)試的參數(shù)類型只能是以下類型:

string, []byte

int, uint, uintptr, int8, int16, int32, rune, int64, uint8, uint16, uint32, uint64

float32, float64

bool

這些規(guī)則和要求是Go語言fuzz測(cè)試的基本要求,遵循這些規(guī)則可以幫助我們編寫有效的fuzz測(cè)試并提高測(cè)試覆蓋率。

接下來我們通過一些簡單代碼來體驗(yàn)一下Fuzz test。

代碼編寫

我們創(chuàng)建一個(gè)名為fuzz的目錄

> mkdir fuzz
> cd fuzz
> go mod init example/fuzz
> touch main.go

在main.go中我們貼如以下代碼

package main
import "fmt"
func Add(a, b int) int {
  	return a + b
}
func main(){
  	fmt.Printf("Add(1, 2) = %d\n", Add(1, 2))
}

運(yùn)行代碼

go run .
Add(1, 2) = 3

現(xiàn)在代碼正常運(yùn)行,接下來我們來測(cè)試它。

添加單元測(cè)試

我們先為Add函數(shù)編寫一個(gè)基本的單元測(cè)試。

  • fuzz目錄創(chuàng)建一個(gè)文件為add_test.go。

貼如以下代碼到add_test.go。

package main
import "testing"
func TestAdd(t *testing.T) {
	testcases := []struct {
		a, b, want int
	}{
		{1, 2, 3},
		{0, 0, 0},
		{-1, -2, -3},
		{1, -2, -1},
	}
	for _, tc := range testcases {
		got := Add(tc.a, tc.b)
		if got != tc.want {
			t.Errorf("Add(%d, %d) == %d, want %d", tc.a, tc.b, got, tc.want)
		}
	}
}

執(zhí)行單元測(cè)試

> go test -v

=== RUN   TestAdd
--- PASS: TestAdd (0.00s)
PASS
ok      example/fuzz    0.003s

添加模糊測(cè)試

單元測(cè)試的局限是我們必須把每個(gè)輸入添加到測(cè)試中,模糊測(cè)試的好處是它提供了你的代碼,并且可能識(shí)別你想出的測(cè)試用例的邊緣情況。

我們把a(bǔ)dd_test.go中的單元測(cè)試替換為以下內(nèi)容模糊測(cè)試。

func FuzzAdd(f *testing.F) {
	f.Add(1, 2)
	f.Add(0, 0)
	f.Add(-1, -2)
	f.Add(-2, -2)
	f.Fuzz(func(t *testing.T, a, b int) {
		got := Add(a, b)
		if got != a+b {
			t.Errorf("Add(%d, %d) == %d, want %d", a, b, got, a+b)
		}
		t.Logf("Add(%d, %d) == %d", a, b, got)
	})
}

接下來我們執(zhí)行模糊測(cè)試, 通過-run選項(xiàng)用于指定要運(yùn)行的測(cè)試函數(shù)的正則表達(dá)式,-fuzz選項(xiàng)用于指定要運(yùn)行的fuzz測(cè)試函數(shù)的正則表達(dá)式,-fuzztime選項(xiàng)來控制fuzz測(cè)試的持續(xù)時(shí)間。

> go test -v -run=FuzzAdd -fuzz=Fuzz -fuzztime 10s
=== RUN   FuzzAdd
fuzz: elapsed: 0s, gathering baseline coverage: 0/11 completed
fuzz: elapsed: 0s, gathering baseline coverage: 11/11 completed, now fuzzing with 8 workers
fuzz: elapsed: 3s, execs: 718882 (239620/sec), new interesting: 1 (total: 12)
fuzz: elapsed: 6s, execs: 1444761 (241916/sec), new interesting: 1 (total: 12)
fuzz: elapsed: 9s, execs: 2177414 (244215/sec), new interesting: 1 (total: 12)
fuzz: elapsed: 10s, execs: 2415524 (216791/sec), new interesting: 1 (total: 12)
--- PASS: FuzzAdd (10.10s)
=== NAME  
PASS
ok      example/fuzz    10.106s

總的來說,Go語言內(nèi)置的fuzz測(cè)試框架提供了一種方便的方式來進(jìn)行fuzz測(cè)試,它與testing包緊密集成,可以更方便的進(jìn)行單元測(cè)試和fuzz測(cè)試。

以上就是Go中的fuzz模糊測(cè)試使用實(shí)戰(zhàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于Go fuzz模糊測(cè)試的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言中異步回調(diào)的實(shí)現(xiàn)

    Go語言中異步回調(diào)的實(shí)現(xiàn)

    異步回調(diào)是一種常見的編程模式,用于處理并發(fā)任務(wù)和事件驅(qū)動(dòng)的編程,本文主要介紹了Go語言中異步回調(diào)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-05-05
  • go語言開發(fā)中如何優(yōu)雅得關(guān)閉協(xié)程方法

    go語言開發(fā)中如何優(yōu)雅得關(guān)閉協(xié)程方法

    這篇文章主要為大家介紹了go語言開發(fā)中如何優(yōu)雅得關(guān)閉協(xié)程方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 解決Goland 提示 Unresolved reference 錯(cuò)誤的問題

    解決Goland 提示 Unresolved reference 錯(cuò)誤的問題

    這篇文章主要介紹了解決Goland 提示 Unresolved reference 錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang的Pseudo-versions使用問題解析

    golang的Pseudo-versions使用問題解析

    這篇文章主要為大家介紹有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪了golang的Pseudo-versions使用問題解析,
    2023-07-07
  • golang 整合antlr語法校驗(yàn)解析

    golang 整合antlr語法校驗(yàn)解析

    Antlr是一個(gè)語法分析器,本身是用java實(shí)現(xiàn)的,然是Runtime的庫也支持Golang、Java、Python等,本文給大家講解使用golang整合antlr進(jìn)行語法解析,感興趣的朋友一起看看吧
    2023-02-02
  • 詳解go語言 make(chan int, 1) 和 make (chan int) 的區(qū)別

    詳解go語言 make(chan int, 1) 和 make (chan int) 的區(qū)別

    這篇文章主要介紹了go語言 make(chan int, 1) 和 make (chan int) 的區(qū)別,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Golang中interface的基本用法詳解

    Golang中interface的基本用法詳解

    Go 中接口也是一個(gè)使用得非常頻繁的特性,好的軟件設(shè)計(jì)往往離不開接口的使用,比如依賴倒置原則(通過抽象出接口,分離了具體實(shí)現(xiàn)與實(shí)際使用的耦合)。 今天,就讓我們來了解一下 Go 中接口的一些基本用法
    2023-01-01
  • 使用gRPC實(shí)現(xiàn)獲取數(shù)據(jù)庫版本

    使用gRPC實(shí)現(xiàn)獲取數(shù)據(jù)庫版本

    這篇文章主要為大家詳細(xì)介紹了如何使用gRPC實(shí)現(xiàn)獲取數(shù)據(jù)庫版本,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • Go?常見設(shè)計(jì)模式之單例模式詳解

    Go?常見設(shè)計(jì)模式之單例模式詳解

    單例模式是設(shè)計(jì)模式中最簡單的一種模式,單例模式能夠確保無論對(duì)象被實(shí)例化多少次,全局都只有一個(gè)實(shí)例存在,在Go?語言有多種方式可以實(shí)現(xiàn)單例模式,所以我們今天就來一起學(xué)習(xí)下吧
    2023-07-07
  • golang圖片處理庫image基本操作

    golang圖片處理庫image基本操作

    這篇文章主要介紹了golang圖片處理庫image簡介,主要包括圖片的基本讀取與保存及圖片的修改,本文通過通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07

最新評(píng)論

深州市| 简阳市| 高台县| 繁峙县| 清苑县| 紫阳县| 治多县| 墨竹工卡县| 尼玛县| 永城市| 明溪县| 高淳县| 临潭县| 平凉市| 瑞金市| 娱乐| 喀什市| 保定市| 博白县| 青川县| 祁东县| 多伦县| 惠来县| 河西区| 弋阳县| 汉阴县| 丰城市| 平昌县| 吐鲁番市| 巴塘县| 海门市| 鄂州市| 六盘水市| 利津县| 苍溪县| 申扎县| 永宁县| 蚌埠市| 荣成市| 雷山县| 阿拉尔市|