一文詳解Go語言單元測試的原理與使用
前言
為什么要引用單元測試類
傳統(tǒng)方法的缺點(diǎn)分析
不方便,我們需要在main函數(shù)中去調(diào)用,這樣就需要去修改main函數(shù),如果現(xiàn)在項目正在運(yùn)行,就可能去停止項目
不利于管理,因為當(dāng)我們測試多個函數(shù)或者多個模塊時,都需要寫在main函數(shù),不利于我們管理和清晰我們的思路
單元測試基本介紹
Go語言中自帶有一個輕量級的測試框架testing和自帶的go test命令來實(shí)現(xiàn)單元測試和性能測試,testing框架和其他語言中的測試框架類似,可以基于這個框架寫針對相應(yīng)函數(shù)的測試用例,也可以基于該框架寫相應(yīng)的壓力測試用例
優(yōu)點(diǎn)
- 確保每個函數(shù)是可運(yùn)行,并且運(yùn)行結(jié)果是正確的
- 確保寫出來的代碼性能是好的
- 單元測試能及時的發(fā)現(xiàn)程序設(shè)計或?qū)崿F(xiàn)的邏輯錯誤,使問題及早暴露,便于問題的定位解決,而性能測試的重點(diǎn)在于發(fā)現(xiàn)程序設(shè)計的一些問題,讓程序能夠在高并發(fā)的情況下還能保持穩(wěn)定
Testing規(guī)范
1.測試用例文件名必須以 _test.go結(jié)尾
2.測試用例函數(shù)必須以Test開頭,一般來說就是Test+被測試的函數(shù)名
3.測試用例函數(shù)的形參類型必須是*testing.T
4.一個測試用例文件中,可以由多個測試用例函數(shù)
5.當(dāng)出現(xiàn)錯誤使,可以使用t.Fatalf來格式化輸出錯誤信息,并退出程序
6.t.Logf方法可以輸出相應(yīng)的日志
7.測試用例函數(shù),并沒有放在main函數(shù)中,但是卻執(zhí)行了main函數(shù)

8.pass表示測試用例運(yùn)行成功,Fail表示測試用例運(yùn)行失敗
9.測試單個文件,一個要帶上被測試的源文件
go test -v cal_test.go cal.go
10.測試單個方法
go test -v -test.run 函數(shù)名
基本使用
cal.go
package main
func add(n int)(int){
var sum int
for i:=1;i<=n ;i++ {
sum+=i
}
return sum
}
cal_test.go
package main
import "testing"
//函數(shù)名規(guī)范 Test+要測試的函數(shù)名(t *testing)
func TestAdd(t *testing.T){
res:=add(9)
if(res!=55){
t.Fatalf("add(10)執(zhí)行錯誤,期望值=%v 實(shí)際值=%v\n",55,res)
}
t.Logf("執(zhí)行正確!!")
}
Golang運(yùn)行



命令行

案例

monster.go
package monster
import (
"encoding/json"
"fmt"
"io/ioutil"
)
type Monster struct {
Name string
Age int
Skill string
}
func (this *Monster) Store() bool {
data,err:=json.Marshal(this)
if err!=nil{
fmt.Println("err=",err)
return false
}
filename:="f:/test.ser"
err2:=ioutil.WriteFile(filename,data,0666)
if err2 !=nil{
fmt.Println("err=",err2)
return false
}
return true
}
func (this *Monster) ReStore() bool {
filename:="f:/test.ser"
reader,err2:=ioutil.ReadFile(filename)
if err2 !=nil{
fmt.Println("err=",err2)
return false
}
err:=json.Unmarshal(reader,this)
if err!=nil{
fmt.Println("err=",err)
return false
}
return true
}monster_test.go
package monster
import (
"fmt"
"testing"
)
func TestStore(t *testing.T) {
monster:=&Monster{
Name: "張三",
Age: 18,
Skill: "打游戲",
}
flag:=monster.Store()
if !flag{
t.Fatalf("monster.Store() 錯誤,期望為%v,實(shí)際為%v",true,flag)
}
t.Logf("monster.Store()測試成功")
}
func TestRestore(t *testing.T) {
var monster=&Monster{}
flag:=monster.ReStore()
if !flag{
t.Fatalf("monster.ReStore() 錯誤,期望為%v,實(shí)際為%v",true,flag)
}
t.Logf("monster.Store()測試成功")
fmt.Println(monster) //&{張三 18 打游戲}
}到此這篇關(guān)于一文詳解Go語言單元測試的原理與使用的文章就介紹到這了,更多相關(guān)Go語言單元測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang封裝一個執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)示例代碼
在?Go?語言中,您可以使用?os/exec?包來執(zhí)行外部命令,不通過調(diào)用?shell,并且能夠獲得進(jìn)程的退出碼、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出,下面給大家分享golang封裝一個執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)的方法,感興趣的朋友跟隨小編一起看看吧2024-06-06
Go語言基礎(chǔ)之網(wǎng)絡(luò)編程全面教程示例
這篇文章主要為大家介紹了Go語言基礎(chǔ)之網(wǎng)絡(luò)編程全面教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

