<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          我要提高 Go 程序健壯性,Fuzzing 來了!

          共 3229字,需瀏覽 7分鐘

           ·

          2021-07-06 08:58


          源 /         文/ 



          大家好,我是煎魚。
          就在前幾天,Go1.17 beta1 正式發(fā)布:
          興沖沖本想著看一下當初在 Go1.17 的計劃中,預計會支持的新特性:模糊測試(Fuzzing)。不過沒想到...計劃趕不上變化,官方正式宣告 Fuzzing 不會出現在 Go1.17 的新功能中。
          煎魚在悲傷之際,發(fā)現 Go 在 dev.fuzz 分支上提供了該功能的 Beta 測試,因此今天帶大家一起來深入該特性。

          什么是 Fuzzing

          Fuzzing 是一種自動測試技術,包括向計算機程序提供隨機數據作為輸入。然后監(jiān)測程序是否出現恐慌、斷言失敗、無限循環(huán)等。
          Fuzzing 不是使用一個小的、預先定義好的手動創(chuàng)建的輸入集(如單元測試),而是用新的案例不斷地測試代碼,以努力 ”鍛煉“ 有關軟件的所有方面。
          這聽起來很 ”難“。但在過去的幾年里,Fuzzing 的技術水平有了很大的提高。Fuzzing 不再是需要專業(yè)知識才能成功使用的東西,現代模糊測試策略能更快、更有效地找到有用的輸入。
          在應用程序中,就是你只要引入一個 package,對著 API 一頓用就可以了。

          為什么要做 Fuzzing

          可能會有小伙伴說,測試?直接人工測試,再把測試數據準備一下,配套 YAPI 等接口管理平臺,把自動化接口測試一弄就好了。還需要 Fuzzing 嗎?
          其實 Fuzzing 是對其他形式的測試、代碼審查和靜態(tài)分析的補充,它通過生成一個隨機測試用例去覆蓋人為測不到的各種復雜場景。而這些輸入幾乎不可能人為去構造,總會被傳統(tǒng)測試所遺漏。

          發(fā)生在身邊的 Fuzzing

          實際上 Go-fuzz 對 Go 標準庫進行過測試,依然這這之中發(fā)現了 200  多個 bug:
          這還是建立在標準庫已經比較成熟,且由非常有經驗的開發(fā)者編寫,在生產中使用多年的情況下,依然有如此多的問題。

          快速上手

          我們需要在本地執(zhí)行如下命令,需開啟 GO111MODULE 和天梯:
          go get golang.org/dl/gotip
          $ gotip download dev.fuzz
          執(zhí)行完畢后會從 dev.fuzz 分支構建 Go 工具鏈,同時 gotip 可以作為 go 命令的替代者命令,也就是可以運行 Fuzzing 的相關代碼了。
          // +build gofuzzbeta

          package tests

          import (
           "net/url"
           "reflect"
           "testing"
          )

          func FuzzParseQuery(f *testing.F) {
           f.Add("x=1&y=2")
           f.Fuzz(func(t *testing.T, queryStr string) {
            query, err := url.ParseQuery(queryStr)
            if err != nil {
             t.Skip()
            }
            queryStr2 := query.Encode()
            query2, err := url.ParseQuery(queryStr2)
            if err != nil {
             t.Fatalf("ParseQuery failed to decode a valid encoded query %s: %v", queryStr2, err)
            }
            if !reflect.DeepEqual(query, query2) {
             t.Errorf("ParseQuery gave different query after being encoded\nbefore: %v\nafter: %v", query, query2)
            }
           })
          }
          在相應的目錄下執(zhí)行 gotip test -fuzz=FuzzParseQuery 命令,輸出結果:
          fuzzing, elapsed: 3.0s, execs: 319 (106/sec), workers: 4, interesting: 15
          fuzzing, elapsed: 6.0s, execs: 665 (111/sec), workers: 4, interesting: 15
          fuzzing, elapsed: 9.0s, execs: 1019 (113/sec), workers: 4, interesting: 15
          fuzzing, elapsed: 12.0s, execs: 1400 (117/sec), workers: 4, interesting: 15
          ...
          需要注意的是:
          • Fuzzing 會消耗大量的內存,在運行時會影響到機器的性能(一運行,小風扇就轉了起來)。
          • Fuzzing 會默認使用 GOMAXPROCS相同的核數,可以通過執(zhí)行 -parallel 標識來控制數量。
          • Fuzzing 會默認在運行時,將擴大測試范圍的數值寫入 $GOCACHE/fuzz 內的模糊緩存目錄,目前是沒有限制的,可以通過運行 gotip clean -fuzzcache 來清除。

          總結

          在今天這篇文章中,我們介紹了 Fuzzing 是什么。簡單而言,模糊測試(Fuzzing)在真實環(huán)境已經被驗證了其有效性,其可以隨機生成測試用例去覆蓋人為測不到的各種復雜場景,帶來很大的收益。
          在接下來中,除了依賴開源的 go-fuzz 庫外,Go 語言也正式的在支持 Fuzzing,雖然他放了 Go1.17 的鴿子...
          這會對構建 Go 程序健壯性的又一強心劑!

          好文推薦



          985 研究生組團詐騙,一個中招就關 App,涉案金額超 1 億,受害人遍布全國


          清華博士接親被要求現場寫代碼,網友:真是面向對象編程!


          字節(jié)跳動P0級事故:實習生刪除GB以下所有模型,差點沒上頭條......





          一鍵三連「分享」、「點贊」和「在看」

          技術干貨與你天天見~




          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91插逼| 日韩人妻中文视频在线 | 色二区| 伊人影院av | 一区二区导航 |