← 返回文章列表

golang學習記錄(13)

Go 基礎學習系列第 13 篇,記錄語法、示例與學習過程。

1、單元測試用例

go test命令是一個按照一定約定和組織的測試程式碼驅動程式

在包目錄中,所有以_test.go結尾的原始碼檔案都會被go test執行到

我們寫的 _test.go原始碼檔案不用擔心內容過多,因為go test命令不會將這些測試檔案打包到最後的可執行檔案

在實際應用中,test檔案有四類:

1、Test開頭的:功能測試

2、Benchmark開頭的:效能測試

3、Example開頭的:模糊測試

4、TestMain開頭的:單元測試

1.1、單元測試用例編寫

下面舉一個單元測試的例子:

在包目錄中有三個go檔案,分別是:

1、add.go

2、add_test.go

3、main.go

go

在add.go中定義了一個Add函式,用來實現兩個整數的相加:

在add_test.go中首先匯入”testing”包,然後定義了一個TestAdd函式,用來測試Add函式的正確性,並作出相應的出錯處理:

import "testing"

func TestAdd(t *testing.T){
    re := add(1,2)
    if re!= 3{
        t.Errorf("add(1,2) = %d; want 3", re)
    }
}

之後對add_test.go檔案執行go test命令,即可進行單元測試,檢視測試結果

1.2、跳過耗時的單元測試用例

在實際應用中,我們可能會遇到一些耗時的單元測試用例,我們可以使用t.Skip()函式來跳過這些耗時的單元測試用例

在執行測試檔案的過程中,使用 go test -short命令可以檢視測試結果,其中 -short命令會跳過所有耗時的單元測試用例

耗時的單元測試用例是有自己定義的

下面是一個使用跳過單元測試的例子:

func TestAdd(t *testing.T){
    if testing.Short(){
        t.Skip("skip this test")
    }
    // 下面是执行不到的
    re := add(1,2)
    if re!= 3{
        t.Errorf("add(1,2) = %d; want 3", re)
    }
}

testing中的short相當於採用了兩種模式,供使用者選擇。

2、基於表格驅動測試

在實際測試的的時候,測試用例可能不止一組,一個一個測試非常耗時,go中提供了一種基於表格驅動測試的方式,它可以一次性測試多組資料,提高測試效率

下面是一個基於表格驅動測試的例子:

import "testing"

func TestAdd(t *testing.T){
    var tests = []struct{
        a int
        b int
        want int
    }{
        {1,2,3},
        {2,3,5},
        {3,4,7},
    }

    for _, tt := range tests{
        re := add(tt.a, tt.b)
        if re!= tt.want{
            t.Errorf("add(%d, %d) = %d; want %d", tt.a, tt.b, re, tt.want)
        }
    }
}

3、benchmark效能測試

在一些核心函式中對效能有要求,我們可以使用benchmark效能測試來測試函式的效能

同樣,效能測試函式也在”testing”包中

在應用過程中,效能測試函式的命名必須以Benchmark開頭,後面跟上要測試的函式名

效能測試函式的引數必須是*testing.B型別的指標

在執行測試檔案的過程中,使用 go test -bench命令可以檢視測試結果,其中 -bench命令會執行所有的效能測試用例

下面是一個關於單元效能測試的例子:

import "testing"

func BenchmarkAdd(b *testing.B){
    a := 123
    b := 456
    c := 579


    for i:=0; i<b.N; i++{
        if actual := add(a,b); actual!= c{
            fmt.Printf("add(%d, %d) = %d; want %d", a, b, actual, c)
    }
}

在進行效能測試過沉重還有一個常用的函式:b.ResetTimer(),它可以重置計時器,使得測試結果更加準確

關於這篇文章的日期

保留舊站原始文章標註的日期;實際開始寫作的時間可能更早。

原始日期: 2024-10-20 16:01:34 +0800

同一系列 · Go 基礎學習

上一篇golang學習記錄(12) ←