在正常的測(cè)試中,當(dāng)我們需要進(jìn)行接口測(cè)試時(shí),通常使用接口調(diào)試工具,如postman進(jìn)行接口測(cè)試
創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)提供從項(xiàng)目策劃、軟件開發(fā),軟件安全維護(hù)、網(wǎng)站優(yōu)化(SEO)、網(wǎng)站分析、效果評(píng)估等整套的建站服務(wù),主營(yíng)業(yè)務(wù)為成都網(wǎng)站建設(shè)、成都網(wǎng)站制作,app軟件開發(fā)公司以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。創(chuàng)新互聯(lián)公司深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
目前我在嘗試使用Go語言進(jìn)行接口測(cè)試,使用的庫均為Go自帶的庫。
注:當(dāng)前采用的接口為時(shí)事新聞接口,每天可以請(qǐng)求100次,需要的同學(xué),可以自行使用。
本教程介紹了 Go 中模糊測(cè)試的基礎(chǔ)知識(shí)。通過模糊測(cè)試,隨機(jī)數(shù)據(jù)會(huì)針對(duì)您的測(cè)試運(yùn)行,以嘗試找出漏洞或?qū)е卤罎⒌妮斎???梢酝ㄟ^模糊測(cè)試發(fā)現(xiàn)的一些漏洞示例包括 SQL 注入、緩沖區(qū)溢出、拒絕服務(wù)和跨站點(diǎn)腳本攻擊。
在本教程中,您將為一個(gè)簡(jiǎn)單的函數(shù)編寫一個(gè)模糊測(cè)試,運(yùn)行 go 命令,并調(diào)試和修復(fù)代碼中的問題。
首先,為您要編寫的代碼創(chuàng)建一個(gè)文件夾。
1、打開命令提示符并切換到您的主目錄。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為 fuzz 的目錄。
3、創(chuàng)建一個(gè)模塊來保存您的代碼。
運(yùn)行g(shù)o mod init命令,為其提供新代碼的模塊路徑。
接下來,您將添加一些簡(jiǎn)單的代碼來反轉(zhuǎn)字符串,稍后我們將對(duì)其進(jìn)行模糊測(cè)試。
在此步驟中,您將添加一個(gè)函數(shù)來反轉(zhuǎn)字符串。
a.使用您的文本編輯器,在 fuzz 目錄中創(chuàng)建一個(gè)名為 main.go 的文件。
獨(dú)立程序(與庫相反)始終位于 package 中main。
此函數(shù)將接受string,使用byte進(jìn)行循環(huán) ,并在最后返回反轉(zhuǎn)的字符串。
此函數(shù)將運(yùn)行一些Reverse操作,然后將輸出打印到命令行。這有助于查看運(yùn)行中的代碼,并可能有助于調(diào)試。
e.該main函數(shù)使用 fmt 包,因此您需要導(dǎo)入它。
第一行代碼應(yīng)如下所示:
從包含 main.go 的目錄中的命令行,運(yùn)行代碼。
可以看到原來的字符串,反轉(zhuǎn)它的結(jié)果,然后再反轉(zhuǎn)它的結(jié)果,就相當(dāng)于原來的了。
現(xiàn)在代碼正在運(yùn)行,是時(shí)候測(cè)試它了。
在這一步中,您將為Reverse函數(shù)編寫一個(gè)基本的單元測(cè)試。
a.使用您的文本編輯器,在 fuzz 目錄中創(chuàng)建一個(gè)名為 reverse_test.go 的文件。
b.將以下代碼粘貼到 reverse_test.go 中。
這個(gè)簡(jiǎn)單的測(cè)試將斷言列出的輸入字符串將被正確反轉(zhuǎn)。
使用運(yùn)行單元測(cè)試go test
接下來,您將單元測(cè)試更改為模糊測(cè)試。
單元測(cè)試有局限性,即每個(gè)輸入都必須由開發(fā)人員添加到測(cè)試中。模糊測(cè)試的一個(gè)好處是它可以為您的代碼提供輸入,并且可以識(shí)別您提出的測(cè)試用例沒有達(dá)到的邊緣用例。
在本節(jié)中,您將單元測(cè)試轉(zhuǎn)換為模糊測(cè)試,這樣您就可以用更少的工作生成更多的輸入!
請(qǐng)注意,您可以將單元測(cè)試、基準(zhǔn)測(cè)試和模糊測(cè)試保存在同一個(gè) *_test.go 文件中,但對(duì)于本示例,您將單元測(cè)試轉(zhuǎn)換為模糊測(cè)試。
在您的文本編輯器中,將 reverse_test.go 中的單元測(cè)試替換為以下模糊測(cè)試。
Fuzzing 也有一些限制。在您的單元測(cè)試中,您可以預(yù)測(cè)Reverse函數(shù)的預(yù)期輸出,并驗(yàn)證實(shí)際輸出是否滿足這些預(yù)期。
例如,在測(cè)試用例Reverse("Hello, world")中,單元測(cè)試將返回指定為"dlrow ,olleH".
模糊測(cè)試時(shí),您無法預(yù)測(cè)預(yù)期輸出,因?yàn)槟鸁o法控制輸入。
但是,Reverse您可以在模糊測(cè)試中驗(yàn)證函數(shù)的一些屬性。在這個(gè)模糊測(cè)試中檢查的兩個(gè)屬性是:
(1)將字符串反轉(zhuǎn)兩次保留原始值
(2)反轉(zhuǎn)的字符串將其狀態(tài)保留為有效的 UTF-8。
注意單元測(cè)試和模糊測(cè)試之間的語法差異:
(3)確保新包unicode/utf8已導(dǎo)入。
隨著單元測(cè)試轉(zhuǎn)換為模糊測(cè)試,是時(shí)候再次運(yùn)行測(cè)試了。
a.在不進(jìn)行模糊測(cè)試的情況下運(yùn)行模糊測(cè)試,以確保種子輸入通過。
如果您在該文件中有其他測(cè)試,您也可以運(yùn)行g(shù)o test -run=FuzzReverse,并且您只想運(yùn)行模糊測(cè)試。
b.運(yùn)行FuzzReverse模糊測(cè)試,查看是否有任何隨機(jī)生成的字符串輸入會(huì)導(dǎo)致失敗。這是使用go test新標(biāo)志-fuzz執(zhí)行的。
模糊測(cè)試時(shí)發(fā)生故障,導(dǎo)致問題的輸入被寫入將在下次運(yùn)行的種子語料庫文件中g(shù)o test,即使沒有-fuzz標(biāo)志也是如此。要查看導(dǎo)致失敗的輸入,請(qǐng)?jiān)谖谋揪庉嬈髦写蜷_寫入 testdata/fuzz/FuzzReverse 目錄的語料庫文件。您的種子語料庫文件可能包含不同的字符串,但格式相同。
語料庫文件的第一行表示編碼版本。以下每一行代表構(gòu)成語料庫條目的每種類型的值。由于 fuzz target 只需要 1 個(gè)輸入,因此版本之后只有 1 個(gè)值。
c.運(yùn)行沒有-fuzz標(biāo)志的go test; 新的失敗種子語料庫條目將被使用:
由于我們的測(cè)試失敗,是時(shí)候調(diào)試了。
Reverse為了解決這個(gè)問題,如果輸入不是有效的 UTF-8 ,讓我們返回一個(gè)錯(cuò)誤。
a.在您的文本編輯器中,將現(xiàn)有Reverse函數(shù)替換為以下內(nèi)容。
如果輸入字符串包含無效的 UTF-8 字符,此更改將返回錯(cuò)誤。
b.由于 Reverse 函數(shù)現(xiàn)在返回錯(cuò)誤,因此修改main函數(shù)以丟棄額外的錯(cuò)誤值。將現(xiàn)有main功能替換為以下內(nèi)容。
這些調(diào)用Reverse應(yīng)該返回一個(gè) nil 錯(cuò)誤,因?yàn)檩斎胱址怯行У?UTF-8。
c.您將需要導(dǎo)入錯(cuò)誤和 unicode/utf8 包。main.go 中的 import 語句應(yīng)如下所示。
d.修改reverse_test.go文件檢查是否有錯(cuò)誤,如果返回產(chǎn)生錯(cuò)誤則跳過測(cè)試。
除了返回之外,您還可以調(diào)用t.Skip()以停止執(zhí)行該模糊輸入。
a.使用 go test 運(yùn)行測(cè)試
b.使用go test -fuzz=Fuzz進(jìn)行模糊測(cè)試,幾秒鐘后,停止用ctrl-C模糊測(cè)試。
除非您通過-fuzztime標(biāo)志進(jìn)行限制,否則模糊測(cè)試將一直運(yùn)行,直到遇到失敗的輸入。如果沒有發(fā)生故障,默認(rèn)是永遠(yuǎn)運(yùn)行,并且可以使用 中斷該過程ctrl-C。
c. 使用go test -fuzz=Fuzz -fuzztime 30s。如果沒有30 秒發(fā)現(xiàn)失敗,它會(huì)在退出模糊測(cè)試。
模糊測(cè)試通過了!
做得很好!您剛剛學(xué)習(xí)了在 Go 中進(jìn)行模糊測(cè)試。
— main.go —
— reverse_test.go —