GOLang單元測(cè)試用法詳解
概念
單元測(cè)試 UT測(cè)試,針對(duì)程序來(lái)進(jìn)行正確檢測(cè)測(cè)試工作,一個(gè)優(yōu)秀強(qiáng)壯代碼 需要有完美的 UT測(cè)試用例
go test基本用法
- go test 測(cè)試用例放在 *_test.go 文件中,與被測(cè)函數(shù)放到同一個(gè)目錄下面go build 時(shí)候不會(huì)構(gòu)建成包一部分
- 被測(cè)試用例函數(shù)命名 TestXXX. 第一個(gè)字母必須大寫
- 測(cè)試函數(shù): 檢測(cè)邏輯是否正確
- 基準(zhǔn)函數(shù)以BenChmark 為函數(shù)名稱前綴, 衡量函數(shù)性能
- 示例函數(shù): 以Example 函數(shù)名稱為前綴函數(shù) 提供編譯器正確性的示例文檔
go test 基礎(chǔ)用例
首先 GoLand 中g(shù)o Test 不成熟,如果直接運(yùn)行 會(huì)拋出 Undefined 的指令
借助GoLand 對(duì)于指定方式 使用Generate 對(duì)需要函數(shù)產(chǎn)生對(duì)應(yīng)的XX_test.go 文件
只能 Teiminal 下:
如果想 直接運(yùn)行當(dāng)前目錄下所有測(cè)試用例: run go test,在當(dāng)前目錄下面右鍵即可
如果指向單純運(yùn)行某個(gè)函數(shù) 需要 到該目錄下面:
go test -v -run TestXXX 即可
goLand 給我們產(chǎn)生的單元測(cè)試使用用例 值需要我們字節(jié)填寫對(duì)應(yīng) name(測(cè)試用例名稱),args(數(shù)組,輸入?yún)?shù)) want(返回參數(shù))
type args struct { s string } tests := []struct { name string args args want bool }{ // TODO: Add test cases. { "test1", args{ "kafka", }, true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := IsPalindrome(tt.args.s); got != tt.want { t.Errorf("IsPalindrome() = %v, want %v", got, tt.want) } }) }
使用 Go mod 解決此問(wèn)題
在 GoPATH目錄下 手動(dòng)窗口 bin, pkg, src
三個(gè)目錄
配置 Go Moudle 路徑
直接運(yùn)行GOLand 即可
go test -v : 測(cè)試函數(shù)名字和運(yùn)行時(shí)間
go test -v -run 對(duì)應(yīng)正則表達(dá)式,測(cè)試函數(shù)與正確表達(dá)式匹配才會(huì)過(guò)濾 指定某個(gè)特定函數(shù)
測(cè)試可執(zhí)行程序
用來(lái)測(cè)試一個(gè)可執(zhí)行程序一個(gè)包的名字是main, 示例: 將程序拆分兩個(gè)函數(shù), echo 函數(shù)完成真正的工作 main 函數(shù)用于處理命令行參數(shù)和 echo可能返回錯(cuò)誤
import ( "flag" "fmt" "io" "os" "strings" ) var ( n = flag.Bool("n", false, "omit trailing newline") s = flag.String("s", " ", "separator") ) var out io.Writer = os.Stdout // modified during testing func main() { flag.Parse() if err := echo(!*n, *s, flag.Args()); err != nil { fmt.Fprintf(os.Stderr, "echo: %v\n", err) os.Exit(1) } } func echo(newline bool, sep string, args []string) error { fmt.Fprint(out, strings.Join(args, sep)) if newline { fmt.Fprintln(out) } return nil }
import ( "bytes" "fmt" "testing" ) func TestEcho(t *testing.T) { var tests = []struct { newline bool sep string args []string want string }{ {true, "", []string{}, "\n"}, {false, "", []string{}, ""}, {true, "\t", []string{"one", "two", "three"}, "one\ttwo\tthree\n"}, {true, ",", []string{"a", "b", "c"}, "a,b,c\n"}, {false, ":", []string{"1", "2", "3"}, "1:2:3"}, } for _, test := range tests { descr := fmt.Sprintf("echo(%v, %q, %q)", test.newline, test.sep, test.args) out = new(bytes.Buffer) // captured output if err := echo(test.newline, test.sep, test.args); err != nil { t.Errorf("%s failed: %v", descr, err) continue } got := out.(*bytes.Buffer).String() if got != test.want { t.Errorf("%s = %q, want %q", descr, got, test.want) } } }
外部測(cè)試包解決循環(huán)依賴
外部測(cè)試主要用來(lái) 解決 測(cè)試過(guò)程中循環(huán)依賴問(wèn)題, GO語(yǔ)言中禁止包進(jìn)行循環(huán)依賴,解決一個(gè)下層包的測(cè)試代碼導(dǎo)入上層包的這種行為解決方案:z在net.url 包所在目錄聲明一個(gè)獨(dú)立url_test 測(cè)試包,其中包名_test 后綴告訴go test 工具創(chuàng)建一個(gè)額外包進(jìn)行允許測(cè)試
測(cè)試覆蓋比例
go test -run=Coverage -coverprofile=c.out gopl.io/ch7/eval
go tool cover -html=c.out
測(cè)試基準(zhǔn)函數(shù)
在固定的工作負(fù)載下的性能,一Benchmark 前綴
go test -bench=IsPalindrome , . 表示匹配所有基準(zhǔn)測(cè)試函數(shù)
func BenchmarkIsPalindrome(b *testing.B) { for i := 0; i < b.N; i++ { IsPalindrome("A man, a plan, a canal: Panama") } } goos: windows goarch: amd64 pkg: goprograme/src cpu: Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz BenchmarkIsPalindrome BenchmarkIsPalindrome-4 2308773 502.9 ns/op
1. 基準(zhǔn)函數(shù)數(shù)字后綴 -4 表示運(yùn)行時(shí)候?qū)?yīng) GOMAXPROCS 值, 與并發(fā)相關(guān)的基準(zhǔn)測(cè)試重要信息
2. 每個(gè)調(diào)用函數(shù) 花費(fèi)時(shí)間 502.9 微妙
3. 明顯 上面 函數(shù) 判斷是 第二個(gè)函數(shù) 使用
1.n := len(letters) /2 z只比較一般方式優(yōu)化 測(cè)試后只是改進(jìn) 提升 4%
2. 在每個(gè)字符預(yù)先分配一個(gè)足夠大的數(shù)組,這樣避免在append 函數(shù)時(shí)候可能導(dǎo)致內(nèi)存多次重新分配
-- 通過(guò)性能工具的測(cè)試 從而優(yōu)化我們的程序
func IsPalindrome(s string) bool { letters := make([]rune, 0, len(s)) for _, r := range s { if unicode.IsLetter(r) { letters = append(letters, unicode.ToLower(r)) } } n := len(letters) / 2 for i := 0; i < n; i++ { if letters[i] != letters[len(letters)-1-i] { return false } } return true }
到此這篇關(guān)于GOLang單元測(cè)試用法詳解的文章就介紹到這了,更多相關(guān)GO單元測(cè)試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 深入理解Golang的單元測(cè)試和性能測(cè)試
- Golang單元測(cè)試與覆蓋率的實(shí)例講解
- golang 對(duì)私有函數(shù)進(jìn)行單元測(cè)試的實(shí)例
- Golang使用ChatGPT生成單元測(cè)試實(shí)踐
- Golang?單元測(cè)試和基準(zhǔn)測(cè)試實(shí)例詳解
- Golang測(cè)試框架goconvey進(jìn)行單元測(cè)試流程介紹
- Golang實(shí)現(xiàn)單元測(cè)試中的接口層
- Golang單元測(cè)試中的技巧分享
- 詳解Golang中單元測(cè)試的使用
- Go語(yǔ)言:打造優(yōu)雅數(shù)據(jù)庫(kù)單元測(cè)試的實(shí)戰(zhàn)指南
相關(guān)文章
Go語(yǔ)言中的錯(cuò)誤處理最佳實(shí)踐詳解
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中的錯(cuò)誤處理的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們深入了解Go語(yǔ)言有一定的幫助,需要的可以參考下2023-08-08GoLang中sql.Exec()報(bào)錯(cuò)解決辦法
這篇文章主要給大家介紹了關(guān)于GoLang中sql.Exec()報(bào)錯(cuò)的解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01關(guān)于Golang中range指針數(shù)據(jù)的坑詳解
這篇文章主要給大家介紹了關(guān)于Golang中range指針數(shù)據(jù)的坑的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02GoLang并發(fā)機(jī)制探究goroutine原理詳細(xì)講解
goroutine是Go語(yǔ)言提供的語(yǔ)言級(jí)別的輕量級(jí)線程,在我們需要使用并發(fā)時(shí),我們只需要通過(guò) go 關(guān)鍵字來(lái)開啟 goroutine 即可。這篇文章主要介紹了GoLang并發(fā)機(jī)制goroutine原理,感興趣的可以了解一下2022-12-12詳解Go語(yǔ)言中select語(yǔ)句的常見(jiàn)用法
這篇文章主要是來(lái)和大家介紹一下Go語(yǔ)言中select?語(yǔ)句的常見(jiàn)用法,以及在使用過(guò)程中的注意事項(xiàng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-07-07Go語(yǔ)言中的定時(shí)器原理與實(shí)戰(zhàn)應(yīng)用
在Go語(yǔ)言中,Timer和Ticker是處理定時(shí)任務(wù)的重要工具,Timer用于一次性事件,而Ticker則用于周期性事件,本文詳細(xì)介紹了這兩種定時(shí)器的創(chuàng)建、使用和停止方法,并通過(guò)實(shí)際案例展示了它們?cè)诒O(jiān)控日志、檢查系統(tǒng)狀態(tài)等方面的應(yīng)用2024-10-10如何判斷Golang接口是否實(shí)現(xiàn)的操作
這篇文章主要介紹了如何判斷Golang接口是否實(shí)現(xiàn)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12