在go中進行單元測試的案例分享
更新時間:2024年01月16日 10:34:23 作者:coderyeah
這篇文章主要介紹了使用Go進行單元測試的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
一. 基礎(chǔ)介紹
1. 創(chuàng)建測試文件
- 測試文件通常與要測試的代碼文件位于同一個包中。
- 測試文件的名稱應(yīng)該以
_test.go結(jié)尾。例如,如果你要測試的文件是math.go,那么測試文件可以命名為math_test.go。
2. 編寫測試函數(shù)
- 測試函數(shù)必須導入
testing包。 - 每個測試函數(shù)必須以
Test開頭,后跟一個首字母大寫的名字,例如TestSum或TestSubtract。 - 測試函數(shù)的簽名應(yīng)該接受一個指向
testing.T類型的指針:func TestXxx(t *testing.T) { ... }。
3. 使用 t 對象進行斷言和日志記錄
t對象用于記錄測試信息和控制測試流程。- 使用
t.Error或t.Errorf報告失敗,但繼續(xù)執(zhí)行當前測試。 - 使用
t.Fatal或t.Fatalf報告失敗并立即終止當前測試。
4. 運行測試
- 在命令行中,進入包含測試文件的目錄。
- 執(zhí)行
go test命令運行所有測試,或使用go test -v以詳細模式運行(打印每個測試的名字和運行狀態(tài))。 - 使用
go test -run加上正則表達式來運行特定的測試。例如,go test -run TestSum僅運行名為TestSum的測試。
示例
假設(shè)有一個名為 math.go 的文件,其中定義了一個函數(shù) Sum:
goCopy code// math.go
package math
func Sum(a, b int) int {
return a + b
}
創(chuàng)建一個名為 math_test.go 的測試文件,其中包含以下內(nèi)容:
goCopy code// math_test.go
package math
import "testing"
func TestSum(t *testing.T) {
total := Sum(5, 5)
if total != 10 {
t.Errorf("Sum was incorrect, got: %d, want: %d.", total, 10)
}
}
然后在終端中運行 go test 或 go test -v 來執(zhí)行測試。
二. 綜合案例
結(jié)構(gòu)

monster.go
package test_case
import (
"encoding/json"
"fmt"
"os"
)
type Monster struct {
Name string `json:"name"`
Age int `json:"age"`
Skill string `json:"skill"`
}
// Store 將其序列化保存為文件
func (m *Monster) Store() bool {
data, err := json.Marshal(m)
if err != nil {
fmt.Println("json parse Monster err ", err)
return false
}
// 寫入文件
err = os.WriteFile("d:/monster.txt", data, 0666)
if err != nil {
fmt.Println("write file err ", err)
return false
}
return true
}
// ReStore 反序列化文件
func (m *Monster) ReStore() bool {
data, err := os.ReadFile("d:/monster.txt")
if err != nil {
fmt.Println("read file err ", err)
return false
}
// 將讀取的數(shù)據(jù)進行反序列化
err = json.Unmarshal(data, m)
if err != nil {
fmt.Println("json Unmarshal err ", err)
return false
}
return true
}
monster_test.go
package test_case
import (
"testing"
)
func TestStore(t *testing.T) {
monster := &Monster{
Name: "小狐貍",
Age: 200,
Skill: "魅惑",
}
res := monster.Store()
if !res {
t.Fatalf("TestStore fail,expected is %v,but got %v", true, res)
}
t.Logf("TestStore 測試通過")
}
func TestReStore(t *testing.T) {
monster := &Monster{} //空的結(jié)構(gòu)體
res := monster.ReStore() // 反序列化后結(jié)構(gòu)體就有數(shù)據(jù)
if !res {
t.Fatalf("TestReStore fail,expected is %v,but got %v", true, res)
}
if monster.Name != "小狐貍" {
t.Fatalf("TestStore fail,expected monster.Name is %v,but got %v", "小狐貍", monster.Name)
}
t.Logf("TestStore 測試通過")
}

以上就是在go中進行單元測試的案例分享的詳細內(nèi)容,更多關(guān)于go中進行單元測試的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang實現(xiàn)頁面靜態(tài)化操作的示例代碼
這篇文章主要介紹了golang實現(xiàn)頁面靜態(tài)化操作的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02
如何控制Go編碼JSON數(shù)據(jù)時的行為(問題及解決方案)
今天來聊一下我在Go中對數(shù)據(jù)進行 JSON 編碼時遇到次數(shù)最多的三個問題以及解決方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友參考下吧2020-02-02

