在go中進(jìn)行單元測(cè)試的案例分享
一. 基礎(chǔ)介紹
1. 創(chuàng)建測(cè)試文件
- 測(cè)試文件通常與要測(cè)試的代碼文件位于同一個(gè)包中。
- 測(cè)試文件的名稱應(yīng)該以
_test.go
結(jié)尾。例如,如果你要測(cè)試的文件是math.go
,那么測(cè)試文件可以命名為math_test.go
。
2. 編寫(xiě)測(cè)試函數(shù)
- 測(cè)試函數(shù)必須導(dǎo)入
testing
包。 - 每個(gè)測(cè)試函數(shù)必須以
Test
開(kāi)頭,后跟一個(gè)首字母大寫(xiě)的名字,例如TestSum
或TestSubtract
。 - 測(cè)試函數(shù)的簽名應(yīng)該接受一個(gè)指向
testing.T
類型的指針:func TestXxx(t *testing.T) { ... }
。
3. 使用 t 對(duì)象進(jìn)行斷言和日志記錄
t
對(duì)象用于記錄測(cè)試信息和控制測(cè)試流程。- 使用
t.Error
或t.Errorf
報(bào)告失敗,但繼續(xù)執(zhí)行當(dāng)前測(cè)試。 - 使用
t.Fatal
或t.Fatalf
報(bào)告失敗并立即終止當(dāng)前測(cè)試。
4. 運(yùn)行測(cè)試
- 在命令行中,進(jìn)入包含測(cè)試文件的目錄。
- 執(zhí)行
go test
命令運(yùn)行所有測(cè)試,或使用go test -v
以詳細(xì)模式運(yùn)行(打印每個(gè)測(cè)試的名字和運(yùn)行狀態(tài))。 - 使用
go test -run
加上正則表達(dá)式來(lái)運(yùn)行特定的測(cè)試。例如,go test -run TestSum
僅運(yùn)行名為TestSum
的測(cè)試。
示例
假設(shè)有一個(gè)名為 math.go
的文件,其中定義了一個(gè)函數(shù) Sum
:
goCopy code// math.go package math func Sum(a, b int) int { return a + b }
創(chuàng)建一個(gè)名為 math_test.go
的測(cè)試文件,其中包含以下內(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) } }
然后在終端中運(yùn)行 go test
或 go test -v
來(lái)執(zhí)行測(cè)試。
二. 綜合案例
結(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 } // 寫(xiě)入文件 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ù)進(jìn)行反序列化 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 測(cè)試通過(guò)") } 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 測(cè)試通過(guò)") }
以上就是在go中進(jìn)行單元測(cè)試的案例分享的詳細(xì)內(nèi)容,更多關(guān)于go中進(jìn)行單元測(cè)試的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang組件swagger生成接口文檔實(shí)踐示例
這篇文章主要為大家介紹了golang組件swagger生成接口文檔實(shí)踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04GoLang之標(biāo)準(zhǔn)庫(kù)encoding/json包
本文主要介紹了GoLang之標(biāo)準(zhǔn)庫(kù)encoding/json包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08golang實(shí)現(xiàn)頁(yè)面靜態(tài)化操作的示例代碼
這篇文章主要介紹了golang實(shí)現(xiàn)頁(yè)面靜態(tài)化操作的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02詳解Go語(yǔ)言如何使用xorm實(shí)現(xiàn)讀取mysql
xorm是go語(yǔ)言的常用orm之一,可以用來(lái)操作數(shù)據(jù)庫(kù)。本文就來(lái)和大家聊聊Go語(yǔ)言如何使用xorm實(shí)現(xiàn)讀取mysql功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-11-11如何控制Go編碼JSON數(shù)據(jù)時(shí)的行為(問(wèn)題及解決方案)
今天來(lái)聊一下我在Go中對(duì)數(shù)據(jù)進(jìn)行 JSON 編碼時(shí)遇到次數(shù)最多的三個(gè)問(wèn)題以及解決方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-02-02Go標(biāo)準(zhǔn)庫(kù)Flag庫(kù)和Log庫(kù)的使用
本文主要介紹了Go標(biāo)準(zhǔn)庫(kù)Flag庫(kù)和Log庫(kù)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05