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