Golang 中的可測試示例函數(shù)(Example Function)詳解
Golang 可測試示例函數(shù) (Example Function)
示例函數(shù)類似于單元測試函數(shù),但沒有 *testing 類型的參數(shù)。編寫示例函數(shù)也是很容易的:
- 創(chuàng)建對(duì)應(yīng)的測試文件:在 Go 項(xiàng)目的源代碼目錄下創(chuàng)建一個(gè)新的文件(和被測代碼文件在同一個(gè)包),以 _test.go 為后綴名。例如,要測試 net 包中 dial.go 中的方法,在 net 包中創(chuàng)建一個(gè)名字為 dial_test.go 或者 net_test.go 或者 example_test.go 文件,和單元測試文件是一樣的。
- 編寫示例函數(shù):在測試文件中,編寫一個(gè)以 Example 為前綴的函數(shù),后面跟上一個(gè)或多個(gè)字符或字符組合來標(biāo)識(shí)測試用例的名稱(一般使用被測的對(duì)象的名稱,例如包名稱、函數(shù)名稱、結(jié)構(gòu)體名稱等,也可以不跟上任何字符),沒有任何參數(shù)。
- 在方法體中編寫使用方式,將內(nèi)容輸出到標(biāo)準(zhǔn)輸出。方法體的最后可以添加 “Output:” 或 “Unordered output:” 注釋,也可以不添加。如果添加了“Output:”注釋,會(huì)將輸出結(jié)果與注釋進(jìn)行精確比較。如果添加了“Unordered output:”注釋,也會(huì)將輸出與注釋進(jìn)行比較,但是會(huì)忽略行順序。沒有添加任何 output 注釋,示例函數(shù)會(huì)被編譯但不會(huì)被執(zhí)行。
可測試示例函數(shù)示例
以 json 格式校驗(yàn)工具 https://github.com/luduoxin/json-validator-go 為例,validator 包中的 scanner.go 文件中的關(guān)鍵函數(shù) Valid 用于校驗(yàn)給定字符串是否 json 格式,對(duì)應(yīng)的測試文件為 scanner_test.go,里面的示例函數(shù)為 ExampleValid,代碼如下:
func ExampleValid() { fmt.Println(Valid([]byte("{}"))) // output: true }
運(yùn)行看下效果:
=== RUN ExampleValid
--- PASS: ExampleValid (0.00s)
PASS
看一個(gè)有多條輸出結(jié)果的示例:
func ExampleValid() { fmt.Println(Valid([]byte("{}"))) fmt.Println(Valid([]byte(`a:b`))) // output: true // false }
運(yùn)行看下效果:
=== RUN ExampleValid
--- PASS: ExampleValid (0.00s)
PASS
看一個(gè) “Unordered output:” 注釋的示例:
func ExampleValid() { fmt.Println(Valid([]byte("{}"))) fmt.Println(Valid([]byte(`{"a":"b"}`))) // Unordered output: true // true }
運(yùn)行看下效果:
=== RUN ExampleValid
--- PASS: ExampleValid (0.00s)
PASS
看一個(gè)測試不通過的示例:
func ExampleValid() { fmt.Println(Valid([]byte("{}"))) fmt.Println(Valid([]byte(`{"a":"b"}`))) // Unordered output: true // false }
運(yùn)行看下效果:
=== RUN ExampleValid
--- FAIL: ExampleValid (0.00s)
got:
true
true
看一個(gè)沒有 output 注釋的示例:
func ExampleValid() { fmt.Println(Valid([]byte("{}"))) }
運(yùn)行 go test 命令,此函數(shù)不會(huì)被執(zhí)行。
上面測試通過的示例(運(yùn)行結(jié)果為 PASS 的示例)的通過是什么意思呢?就是在執(zhí)行示例時(shí),測試框架捕獲寫入到標(biāo)準(zhǔn)輸出的數(shù)據(jù),然后與 “output:” 注釋中的結(jié)果進(jìn)行比較,如果匹配,則測試通過,否則測試不通過(結(jié)果為 FAIL)。
在 Godoc 中的展示
示例函數(shù)會(huì)在 Godoc 中作為對(duì)應(yīng)函數(shù)的示例,看 Golang 官方的一張截圖:
Godoc 使用命名約定將示例函數(shù)與包級(jí)標(biāo)的識(shí)符關(guān)聯(lián)起來。約定規(guī)則如下:
func ExampleFoo() // documents the Foo function or type func ExampleBar_Qux() // documents the Qux method of type Bar func Example() // documents the package as a whole
按照這個(gè)約定,Godoc 將在 Reverse 函數(shù)的文檔旁邊顯示 ExampleReverse 示例。通過使用以下劃線開頭、后跟小寫字母的后綴,可以為指定函數(shù)(或者包、結(jié)構(gòu)體、方法等)提供多個(gè)示例。如下:
func ExampleReverse() func ExampleReverse_second() func ExampleReverse_third()
小結(jié)
本文詳細(xì)講解了 Golang 中的可測試示例函數(shù), 可以很方便地轉(zhuǎn)換為 Godoc 中可讀性很強(qiáng)的文檔,這也是 Golang 提倡的代碼即文檔的一個(gè)最佳實(shí)踐,如果你還沒有使用過,趕快使用起來吧。
到此這篇關(guān)于Golang 中的可測試示例函數(shù)(Example Function)詳解的文章就介紹到這了,更多相關(guān)Golang可測試示例函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang新手們?nèi)菀追傅?個(gè)錯(cuò)誤總結(jié)
這篇文章主要給大家介紹了關(guān)于golang新手們?nèi)菀追傅?個(gè)錯(cuò)誤,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08Go語言如何使用golang-jwt/jwt/v4進(jìn)行JWT鑒權(quán)詳解
最近項(xiàng)目中需要用到鑒權(quán)機(jī)制,golang中jwt可以用,這篇文章主要給大家介紹了關(guān)于Go語言如何使用golang-jwt/jwt/v4進(jìn)行JWT鑒權(quán)的相關(guān)資料,需要的朋友可以參考下2022-09-09關(guān)于Golang獲取當(dāng)前項(xiàng)目絕對(duì)路徑的問題
這篇文章主要介紹了Golang獲取當(dāng)前項(xiàng)目絕對(duì)路徑的問題,通常的做法是go run用于本地開發(fā),用一個(gè)命令中快速測試代碼確實(shí)非常方便;在部署生產(chǎn)環(huán)境時(shí),我們會(huì)通過go build構(gòu)建出二進(jìn)制文件然后上傳到服務(wù)器再去執(zhí)行,那么會(huì)產(chǎn)生什么問題呢?感興趣的朋友一起看看吧2022-04-04淺談Go語言多態(tài)的實(shí)現(xiàn)與interface使用
如果大家系統(tǒng)的學(xué)過C++、Java等語言以及面向?qū)ο蟮脑挘嘈艖?yīng)該對(duì)多態(tài)不會(huì)陌生。多態(tài)是面向?qū)ο蠓懂牣?dāng)中經(jīng)常使用并且非常好用的一個(gè)功能,它主要是用在強(qiáng)類型語言當(dāng)中,像是Python這樣的弱類型語言,變量的類型可以隨意變化,也沒有任何限制,其實(shí)區(qū)別不是很大2021-06-06詳解Golang net/http包中的RoundTripper接口
RoundTripper 是 net/http 包中的一個(gè)接口,定義了處理 HTTP 請(qǐng)求返回和響應(yīng)的方法,是 http.Client 結(jié)構(gòu)體中執(zhí)行 http 請(qǐng)求的核心部分,本文將詳細(xì)的給大家介紹Golang RoundTripper接口,需要的朋友可以參考下2023-09-09Go語言pointer及switch?fallthrough實(shí)戰(zhàn)詳解
這篇文章主要為大家介紹了Go語言pointer及switch?fallthrough實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06