欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang單元測試中的技巧分享

 更新時間:2023年03月13日 10:04:59   作者:LinkinStar  
這篇文章主要為大家詳細(xì)介紹了Golang進行單元測試時的一些技巧和科技,文中的示例代碼講解詳細(xì),具有一定的參考價值,感興趣的小伙伴可以了解一下

打樁測試

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

代碼

這里我們使用 github.com/agiledragon/gomonkey 來實現(xiàn)。

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

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() 是我們在另一個包中實現(xiàn)的方法。我們使用 gomonkey.ApplyFunc 相當(dāng)于直接替換了原有方法的實現(xiàn),強制返回了 mock 的數(shù)據(jù) 666。

注意事項

  • 使用 gomonkey 時,注意一定要使用 -gcflags=all=-l 來禁止內(nèi)聯(lián)優(yōu)化,否則容易導(dǎo)致打樁不生效。如:go test -gcflags=all=-l -v
  • 在 Mac 的 M1 下打樁不生效,可以使用環(huán)境變量 GOARCH=amd64 來進行測試,只不過這樣就無法進行斷點調(diào)試。https://github.com/agiledragon/gomonkey/issues/77
  • 畢竟是黑科技,實際使用環(huán)境對于測試還是有影響的。

壓測

這里的壓測通常不是對接口的壓測,而是對于某些方法的壓測。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

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

測試覆蓋率

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

我們可以使用 -cover 參數(shù)來統(tǒng)計單元測試的代碼覆蓋率

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

還可以生成 profile 然后通過可視化網(wǎng)頁查看分析

? 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

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

表格驅(qū)動測試

TDT 的提出也算是給單元測試提供了一條不錯的思路。主要的形式就是將測試的數(shù)據(jù)做成類似表格,然后測試的時候遍歷所有的數(shù)據(jù)來進行測試,測試代碼不動,只需要增加測試數(shù)據(jù)就可以了。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 來幫助我們快速生成想要的表格驅(qū)動測試代碼

到此這篇關(guān)于Golang單元測試中的技巧分享的文章就介紹到這了,更多相關(guān)Golang單元測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入解析Go template模板使用詳解

    深入解析Go template模板使用詳解

    這篇文章主要介紹了深入解析Go template模板使用詳解,需要的朋友可以參考下
    2022-04-04
  • Go語言實現(xiàn)并發(fā)控制的常見方式詳解

    Go語言實現(xiàn)并發(fā)控制的常見方式詳解

    這篇文章主要為大家詳細(xì)介紹了Go語言實現(xiàn)并發(fā)控制的幾種常見方式,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-03-03
  • Go Plugins插件的實現(xiàn)方式

    Go Plugins插件的實現(xiàn)方式

    目前 Plugins 僅在 Linux、FreeBSD 和 macOS 上受支持,且只支持 golang 調(diào)用,今天通過本文給大家介紹Go Plugins插件的實現(xiàn)方式,感興趣的朋友一起看看吧
    2021-08-08
  • golang如何實現(xiàn)mapreduce單進程版本詳解

    golang如何實現(xiàn)mapreduce單進程版本詳解

    這篇文章主要給大家介紹了關(guān)于golang如何實現(xiàn)mapreduce單進程版本的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Golang連接并操作PostgreSQL數(shù)據(jù)庫基本操作

    Golang連接并操作PostgreSQL數(shù)據(jù)庫基本操作

    PostgreSQL是常見的免費的大型關(guān)系型數(shù)據(jù)庫,具有豐富的數(shù)據(jù)類型,也是軟件項目常用的數(shù)據(jù)庫之一,下面這篇文章主要給大家介紹了關(guān)于Golang連接并操作PostgreSQL數(shù)據(jù)庫基本操作的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Golang實現(xiàn)支持多種類型的set

    Golang實現(xiàn)支持多種類型的set

    在項目開發(fā)中,常常會用到set去重,為什么不寫一個set呢,而且go現(xiàn)在支持了泛型,所以本文就來用Golang實現(xiàn)一個支持多種類型的set呢
    2023-05-05
  • golang中的net/http庫基本使用詳解

    golang中的net/http庫基本使用詳解

    今天給大家分享golang中的net/http庫基本使用方法,文章開頭給大家詳細(xì)介紹了標(biāo)準(zhǔn)庫net/http如何處理一個請求,結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • golang中的nil接收器詳解

    golang中的nil接收器詳解

    這篇文章主要介紹了golang中的nil接收器,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • Go命令行參數(shù)解析flag 包使用示例詳解

    Go命令行參數(shù)解析flag 包使用示例詳解

    這篇文章主要介紹了Go命令行參數(shù)解析flag 包使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • go語言實現(xiàn)短信發(fā)送實例探究

    go語言實現(xiàn)短信發(fā)送實例探究

    這篇文章主要為大家介紹了go語言實現(xiàn)短信發(fā)送實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01

最新評論