中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang單元測試中的技巧是什么

發布時間:2023-03-13 14:18:22 來源:億速云 閱讀:108 作者:iii 欄目:開發技術

這篇文章主要講解了“Golang單元測試中的技巧是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Golang單元測試中的技巧是什么”吧!

    打樁測試

    當我們在編寫單元測試的時候,有時我們非常想 mock 掉其中一個方法,但是這個方法又沒有接口去定義和實現(無法用 github.com/golang/mock 來實現),這時就可以嘗試看看我們的打樁黑科技。

    代碼

    這里我們使用 github.com/agiledragon/gomonkey 來實現。

    實際中,經常在代碼中會遇到一些隨機值的情況,比如驗證碼。為了方便測試,我們會想要 mock 掉隨機值方法,讓每次產生的值固定方便后續的測試。

    package main
    
    import (
      "fmt"
      "testing"
    
      "github.com/agiledragon/gomonkey/v2"
      "go-demo/m/unit-test/other/rand"
    )
    
    func init() {
      gomonkey.ApplyFunc(rand.Number, func() int { return 666 })
    }
    
    func TestRand(t *testing.T) {
      fmt.Println(rand.Number())
    }

    其中 rand.Number() 是我們在另一個包中實現的方法。我們使用 gomonkey.ApplyFunc 相當于直接替換了原有方法的實現,強制返回了 mock 的數據 666。

    注意事項

    • 使用 gomonkey 時,注意一定要使用 -gcflags=all=-l 來禁止內聯優化,否則容易導致打樁不生效。如:go test -gcflags=all=-l -v

    • 在 Mac 的 M1 下打樁不生效,可以使用環境變量 GOARCH=amd64 來進行測試,只不過這樣就無法進行斷點調試。https://github.com/agiledragon/gomonkey/issues/77

    • 畢竟是黑科技,實際使用環境對于測試還是有影響的。

    壓測

    這里的壓測通常不是對接口的壓測,而是對于某些方法的壓測。Golang 提供 非常好用的 b *testing.B 來專門進行壓測。

    代碼

    非常容易上手,讓我們直接來看代碼

    var numbers = []int{
      100,
      1000,
      77777,
      666666,
    }
    
    func BenchmarkPrimeNumbers(b *testing.B) {
      for _, v := range numbers {
        b.Run(fmt.Sprintf("calc_num_%d", v), func(b *testing.B) {
          for i := 0; i < b.N; i++ {
            primeNumbers(v)
          }
        })
      }
    }

    使用

    使用 -bench=. 即可

    ? go test -bench=. b_test.go
    goos: darwin
    goarch: arm64
    BenchmarkPrimeNumbers/calc_num_100-8             3391329               348.9 ns/op
    BenchmarkPrimeNumbers/calc_num_1000-8             293733              3979 ns/op
    BenchmarkPrimeNumbers/calc_num_77777-8               730           1619089 ns/op
    BenchmarkPrimeNumbers/calc_num_666666-8               42          28509805 ns/op
    PASS
    ok      command-line-arguments  5.846s

    可以看到次數和耗時,這樣的數據經常會被貼在開源項目README的性能比較板塊中。

    測試覆蓋率

    單元測試當然少不了覆蓋率咯,看著高高的覆蓋率才有成就感對不對?

    我們可以使用 -cover 參數來統計單元測試的代碼覆蓋率

    ? go test -cover .           
    ok      go-demo/m/unit-test/service     0.879s  coverage: 70.0% of statements

    還可以生成 profile 然后通過可視化網頁查看分析

    ? go test ./... -coverprofile=cover.out
    ok      go-demo/m/unit-test/service     0.108s  coverage: 70.0% of statements
    ? go tool cover -html=cover.out

    當然,如果你和我一樣使用 goland 進行開發,可以直接在界面上點擊單元測試,就可以快速進行覆蓋率測試,并且展示也很方便,很快能看到有哪些代碼沒有被測試覆蓋。

    Golang單元測試中的技巧是什么

    Golang單元測試中的技巧是什么

    表格驅動測試

    TDT 的提出也算是給單元測試提供了一條不錯的思路。主要的形式就是將測試的數據做成類似表格,然后測試的時候遍歷所有的數據來進行測試,測試代碼不動,只需要增加測試數據就可以了。go 很多官方庫用了這樣的寫法來做測試。

    package main
    
    import (
        "testing"
    )
    
    func TestAdd(t *testing.T) {
        tests := []struct {
            a, b, expected int
        }{
            {1, 2, 3},
            {0, 0, 0},
            {-1, 1, 0},
            {-1, -1, -2},
        }
    
        for _, test := range tests {
            result := Add(test.a, test.b)
            if result != test.expected {
                t.Errorf("Add(%d, %d) = %d; expected %d", test.a, test.b, result, test.expected)
            }
        }
    }
    
    func Add(a, b int) int {
        return a + b
    }

    我們可以通過 github.com/cweill/gotests 來幫助我們快速生成想要的表格驅動測試代碼

    感謝各位的閱讀,以上就是“Golang單元測試中的技巧是什么”的內容了,經過本文的學習后,相信大家對Golang單元測試中的技巧是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    广西| 松阳县| 全椒县| 旺苍县| 柘荣县| 佛冈县| 永胜县| 廊坊市| 天气| 遂宁市| 东台市| 抚宁县| 文安县| 罗江县| 高淳县| 四子王旗| 拉孜县| 嘉禾县| 察哈| 海盐县| 丹巴县| 托克逊县| 双桥区| 阜康市| 九江县| 吉水县| 惠东县| 咸阳市| 都兰县| 台东市| 阜新| 南开区| 鄂伦春自治旗| 三亚市| 佛学| 商洛市| 特克斯县| 呈贡县| 连州市| 翁牛特旗| 静海县|