Reverse為了解決這個問題,如果輸入不是有效的 UTF-8 ,讓我們返回一個錯誤。
創(chuàng)新互聯(lián)建站主營西充網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App制作,西充h5小程序定制開發(fā)搭建,西充網(wǎng)站營銷推廣歡迎西充等地區(qū)企業(yè)咨詢
a.在您的文本編輯器中,將現(xiàn)有Reverse函數(shù)替換為以下內(nèi)容。
如果輸入字符串包含無效的 UTF-8 字符,此更改將返回錯誤。
b.由于 Reverse 函數(shù)現(xiàn)在返回錯誤,因此修改main函數(shù)以丟棄額外的錯誤值。將現(xiàn)有main功能替換為以下內(nèi)容。
這些調(diào)用Reverse應(yīng)該返回一個 nil 錯誤,因為輸入字符串是有效的 UTF-8。
c.您將需要導(dǎo)入錯誤和 unicode/utf8 包。main.go 中的 import 語句應(yīng)如下所示。
d.修改reverse_test.go文件檢查是否有錯誤,如果返回產(chǎn)生錯誤則跳過測試。
除了返回之外,您還可以調(diào)用t.Skip()以停止執(zhí)行該模糊輸入。
a.使用 go test 運行測試
b.使用go test -fuzz=Fuzz進行模糊測試,幾秒鐘后,停止用ctrl-C模糊測試。
除非您通過-fuzztime標志進行限制,否則模糊測試將一直運行,直到遇到失敗的輸入。如果沒有發(fā)生故障,默認是永遠運行,并且可以使用 中斷該過程ctrl-C。
c. 使用go test -fuzz=Fuzz -fuzztime 30s。如果沒有30 秒發(fā)現(xiàn)失敗,它會在退出模糊測試。
模糊測試通過了!
做得很好!您剛剛學(xué)習(xí)了在 Go 中進行模糊測試。
— main.go —
— reverse_test.go —
之前寫過了Go語言gorm框架MySQL實踐,其中對gorm框架在操作MySQL的各種基礎(chǔ)實踐,下面分享一下如何使用gorm框架對MySQL直接進行性能測試的簡單實踐。
這里我使用了一個原始的Go語言版本的 FunTester 測試框架,現(xiàn)在只有一個基本的方法,實在是因為Go語言特性太強了??蚣茉O(shè)計的主要思路之一就是利用Go語言的閉包和方法參數(shù)特性,將一個 func() 當做性能測試的主題,通過不斷運行這個 func() 來實現(xiàn)性能測試。當然還有另外一個思路就是運行一個多線程任務(wù)類,類似 Java 版本的 com.funtester.base.constaint.ThreadBase 抽象類,這樣可以設(shè)置一些類的屬性,綁定一些測試資源,適配更多的測試場景。
下面演示select的性能測試,這里我用了隨機ID查詢的場景。
這里我使用從35開始遞增的ID進行刪除。
這里使用了select的用例部分,隨機ID,然后更新name字段,隨機10個長度的字符串。
這里用到了 FunTester 字段都是隨機生成。
到這里可以看出,性能測試框架用到的都是gorm框架的基礎(chǔ)API使用,這里MySQL連接池的管理工作完全交給了gorm框架完成,看資料說非常牛逼,我們只需要設(shè)置幾個參數(shù)。這個使用體現(xiàn)很像 HttpClient 設(shè)置 HTTP 連接池類似,這里我們也可以看出這些優(yōu)秀的框架使用起來都是非常簡單的。
PS:關(guān)于gorm的基礎(chǔ)使用的請參考上一期的文章Go語言gorm框架MySQL實踐。
本教程介紹了 Go 中模糊測試的基礎(chǔ)知識。通過模糊測試,隨機數(shù)據(jù)會針對您的測試運行,以嘗試找出漏洞或?qū)е卤罎⒌妮斎???梢酝ㄟ^模糊測試發(fā)現(xiàn)的一些漏洞示例包括 SQL 注入、緩沖區(qū)溢出、拒絕服務(wù)和跨站點腳本攻擊。
在本教程中,您將為一個簡單的函數(shù)編寫一個模糊測試,運行 go 命令,并調(diào)試和修復(fù)代碼中的問題。
首先,為您要編寫的代碼創(chuàng)建一個文件夾。
1、打開命令提示符并切換到您的主目錄。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,為您的代碼創(chuàng)建一個名為 fuzz 的目錄。
3、創(chuàng)建一個模塊來保存您的代碼。
運行g(shù)o mod init命令,為其提供新代碼的模塊路徑。
接下來,您將添加一些簡單的代碼來反轉(zhuǎn)字符串,稍后我們將對其進行模糊測試。
在此步驟中,您將添加一個函數(shù)來反轉(zhuǎn)字符串。
a.使用您的文本編輯器,在 fuzz 目錄中創(chuàng)建一個名為 main.go 的文件。
獨立程序(與庫相反)始終位于 package 中main。
此函數(shù)將接受string,使用byte進行循環(huán) ,并在最后返回反轉(zhuǎn)的字符串。
此函數(shù)將運行一些Reverse操作,然后將輸出打印到命令行。這有助于查看運行中的代碼,并可能有助于調(diào)試。
e.該main函數(shù)使用 fmt 包,因此您需要導(dǎo)入它。
第一行代碼應(yīng)如下所示:
從包含 main.go 的目錄中的命令行,運行代碼。
可以看到原來的字符串,反轉(zhuǎn)它的結(jié)果,然后再反轉(zhuǎn)它的結(jié)果,就相當于原來的了。
現(xiàn)在代碼正在運行,是時候測試它了。
在這一步中,您將為Reverse函數(shù)編寫一個基本的單元測試。
a.使用您的文本編輯器,在 fuzz 目錄中創(chuàng)建一個名為 reverse_test.go 的文件。
b.將以下代碼粘貼到 reverse_test.go 中。
這個簡單的測試將斷言列出的輸入字符串將被正確反轉(zhuǎn)。
使用運行單元測試go test
接下來,您將單元測試更改為模糊測試。
單元測試有局限性,即每個輸入都必須由開發(fā)人員添加到測試中。模糊測試的一個好處是它可以為您的代碼提供輸入,并且可以識別您提出的測試用例沒有達到的邊緣用例。
在本節(jié)中,您將單元測試轉(zhuǎn)換為模糊測試,這樣您就可以用更少的工作生成更多的輸入!
請注意,您可以將單元測試、基準測試和模糊測試保存在同一個 *_test.go 文件中,但對于本示例,您將單元測試轉(zhuǎn)換為模糊測試。
在您的文本編輯器中,將 reverse_test.go 中的單元測試替換為以下模糊測試。
Fuzzing 也有一些限制。在您的單元測試中,您可以預(yù)測Reverse函數(shù)的預(yù)期輸出,并驗證實際輸出是否滿足這些預(yù)期。
例如,在測試用例Reverse("Hello, world")中,單元測試將返回指定為"dlrow ,olleH".
模糊測試時,您無法預(yù)測預(yù)期輸出,因為您無法控制輸入。
但是,Reverse您可以在模糊測試中驗證函數(shù)的一些屬性。在這個模糊測試中檢查的兩個屬性是:
(1)將字符串反轉(zhuǎn)兩次保留原始值
(2)反轉(zhuǎn)的字符串將其狀態(tài)保留為有效的 UTF-8。
注意單元測試和模糊測試之間的語法差異:
(3)確保新包unicode/utf8已導(dǎo)入。
隨著單元測試轉(zhuǎn)換為模糊測試,是時候再次運行測試了。
a.在不進行模糊測試的情況下運行模糊測試,以確保種子輸入通過。
如果您在該文件中有其他測試,您也可以運行g(shù)o test -run=FuzzReverse,并且您只想運行模糊測試。
b.運行FuzzReverse模糊測試,查看是否有任何隨機生成的字符串輸入會導(dǎo)致失敗。這是使用go test新標志-fuzz執(zhí)行的。
模糊測試時發(fā)生故障,導(dǎo)致問題的輸入被寫入將在下次運行的種子語料庫文件中g(shù)o test,即使沒有-fuzz標志也是如此。要查看導(dǎo)致失敗的輸入,請在文本編輯器中打開寫入 testdata/fuzz/FuzzReverse 目錄的語料庫文件。您的種子語料庫文件可能包含不同的字符串,但格式相同。
語料庫文件的第一行表示編碼版本。以下每一行代表構(gòu)成語料庫條目的每種類型的值。由于 fuzz target 只需要 1 個輸入,因此版本之后只有 1 個值。
c.運行沒有-fuzz標志的go test; 新的失敗種子語料庫條目將被使用:
由于我們的測試失敗,是時候調(diào)試了。
新聞標題:go語言測試用例 go語言單元測試
轉(zhuǎn)載來源:http://jinyejixie.com/article4/ddcodie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、ChatGPT、網(wǎng)站收錄、網(wǎng)站營銷、微信小程序、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)