最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang單元測(cè)試中的技巧分享

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

打樁測(cè)試

當(dāng)我們?cè)诰帉憜卧獪y(cè)試的時(shí)候,有時(shí)我們非常想 mock 掉其中一個(gè)方法,但是這個(gè)方法又沒有接口去定義和實(shí)現(xiàn)(無法用 github.com/golang/mock 來實(shí)現(xiàn)),這時(shí)就可以嘗試看看我們的打樁黑科技。

代碼

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

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

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() 是我們?cè)诹硪粋€(gè)包中實(shí)現(xiàn)的方法。我們使用 gomonkey.ApplyFunc 相當(dāng)于直接替換了原有方法的實(shí)現(xiàn),強(qiáng)制返回了 mock 的數(shù)據(jù) 666。

注意事項(xiàng)

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

壓測(cè)

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

代碼

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

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í),這樣的數(shù)據(jù)經(jīng)常會(huì)被貼在開源項(xiàng)目README的性能比較板塊中。

測(cè)試覆蓋率

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

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

? 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 進(jìn)行開發(fā),可以直接在界面上點(diǎn)擊單元測(cè)試,就可以快速進(jìn)行覆蓋率測(cè)試,并且展示也很方便,很快能看到有哪些代碼沒有被測(cè)試覆蓋。

表格驅(qū)動(dòng)測(cè)試

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

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ū)動(dòng)測(cè)試代碼

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

相關(guān)文章

  • golang?chan傳遞數(shù)據(jù)的性能開銷詳解

    golang?chan傳遞數(shù)據(jù)的性能開銷詳解

    這篇文章主要為大家詳細(xì)介紹了Golang中chan在接收和發(fā)送數(shù)據(jù)時(shí)因?yàn)椤皬?fù)制”而產(chǎn)生的開銷,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-01-01
  • Go?文件讀取和寫入操作全面講解

    Go?文件讀取和寫入操作全面講解

    這篇文章主要為大家介紹了Go文件的讀取和寫入操作示例的全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Go設(shè)計(jì)模式之狀態(tài)模式圖文詳解

    Go設(shè)計(jì)模式之狀態(tài)模式圖文詳解

    狀態(tài)模式是一種行為設(shè)計(jì)模式, 讓你能在一個(gè)對(duì)象的內(nèi)部狀態(tài)變化時(shí)改變其行為, 使其看上去就像改變了自身所屬的類一樣,本文將通過一些圖片來給大家詳細(xì)的介紹一下Go的狀態(tài)模式,需要的朋友可以參考下
    2023-08-08
  • go語言中結(jié)構(gòu)體tag使用小結(jié)

    go語言中結(jié)構(gòu)體tag使用小結(jié)

    Go語言是一種靜態(tài)類型、編譯型的編程語言,其中結(jié)構(gòu)體是一種非常重要的數(shù)據(jù)類型,本文就來介紹一下go語言中結(jié)構(gòu)體tag使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Golang中switch語句和select語句的用法教程

    Golang中switch語句和select語句的用法教程

    這篇文章主要給大家介紹了關(guān)于Golang中switch和select的用法教程,文中通過示例代碼將switch語句與select語句的使用方法介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • 如何編寫Go語言中間件的實(shí)例教程

    如何編寫Go語言中間件的實(shí)例教程

    不知道大家有沒有寫過中間件呢,它是怎么寫的呢?下面這篇文中就來給大家分享一下使用Go,如何編寫中間件,文中通過示例代碼介紹的非常詳細(xì),供大家參考學(xué)習(xí),下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • 詳解Go?中的時(shí)間處理

    詳解Go?中的時(shí)間處理

    這篇文章主要介紹了Go?中的時(shí)間處理,本文將介紹?time?庫中一些重要的函數(shù)和方法,希望能幫助到那些一遇到?Go?時(shí)間處理問題就需要百度的童鞋,需要的朋友可以參考下
    2022-07-07
  • 一文詳解Go語言切片是如何擴(kuò)容的

    一文詳解Go語言切片是如何擴(kuò)容的

    切片是一個(gè)擁有相同類型元素的可變長(zhǎng)度的序列,它是基于數(shù)組類型做的一層封裝。它非常靈活,支持自動(dòng)擴(kuò)容。所以本文就來看看Go語言切片是如何擴(kuò)容的吧
    2023-04-04
  • Go語言中slice的用法實(shí)例分析

    Go語言中slice的用法實(shí)例分析

    這篇文章主要介紹了Go語言中slice的用法,實(shí)例分析了slice的功能及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • go實(shí)現(xiàn)for range迭代時(shí)修改值的操作

    go實(shí)現(xiàn)for range迭代時(shí)修改值的操作

    這篇文章主要介紹了go實(shí)現(xiàn)for range迭代時(shí)修改值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評(píng)論

青浦区| 金乡县| 大兴区| 密山市| 安龙县| 霍城县| 潞城市| 孝昌县| 呈贡县| 澄江县| 兴文县| 比如县| 渝北区| 许昌市| 北京市| 沂源县| 尚义县| 东山县| 彭泽县| 肃宁县| 辉县市| 合江县| 深水埗区| 米易县| 景宁| 清徐县| 麻城市| 崇左市| 禄丰县| 东台市| 鄱阳县| 乐至县| 汕尾市| 资溪县| 大港区| 得荣县| 鄂州市| 屏边| 伊金霍洛旗| 岐山县| 永善县|