Go test 命令行参数
轉(zhuǎn)自:《Go專家編程》Go test 命令行參數(shù)
前言
go test有非常豐富的參數(shù),一些參數(shù)用于控制測(cè)試的編譯,另一些參數(shù)控制測(cè)試的執(zhí)行。
有關(guān)測(cè)試覆蓋率、vet和pprof相關(guān)的參數(shù)先略過,我們?cè)谟懻撓嚓P(guān)內(nèi)容時(shí)再詳細(xì)介紹。
控制編譯的參數(shù)
-args
指示go test把-args后面的參數(shù)帶到測(cè)試中去。具體的測(cè)試函數(shù)會(huì)跟據(jù)此參數(shù)來控制測(cè)試流程。
-args后面可以附帶多個(gè)參數(shù),所有參數(shù)都將以字符串形式傳入,每個(gè)參數(shù)做為一個(gè)string,并存放到字符串切片中。
// TestArgs 用于演示如何解析-args參數(shù) func TestArgs(t *testing.T) { if !flag.Parsed() { flag.Parse() } argList := flag.Args() // flag.Args() 返回 -args 后面的所有參數(shù),以切片表示,每個(gè)元素代表一個(gè)參數(shù) for _, arg := range argList { if arg == "cloud" { t.Log("Running in cloud.") }else { t.Log("Running in other mode.") } } }執(zhí)行測(cè)試時(shí)帶入?yún)?shù):
E:\OpenSource\GitHub\RainbowMango\GoExpertProgrammingSourceCode\GoExpert\src\gotest>go test -run TestArgs -v -args "cloud" TestMain setup. === RUN TestArgs --- PASS: TestArgs (0.00s) unit_test.go:28: Running in cloud. PASS TestMain tear-down. ok gotest 0.353s通過參數(shù)-args指定傳遞給測(cè)試的參數(shù)。
-json
-json 參數(shù)用于指示go test將結(jié)果輸出轉(zhuǎn)換成json格式,以方便自動(dòng)化測(cè)試解析使用。
示例如下:
E:\OpenSource\GitHub\RainbowMango\GoExpertProgrammingSourceCode\GoExpert\src\gotest>gotest -run TestAdd -json {"Time":"2019-02-28T15:46:50.3756322+08:00","Action":"output","Package":"gotest","Output":"TestMain setup.\n"} {"Time":"2019-02-28T15:46:50.4228258+08:00","Action":"run","Package":"gotest","Test":"TestAdd"} {"Time":"2019-02-28T15:46:50.423809+08:00","Action":"output","Package":"gotest","Test":"TestAdd","Output":"=== RUN TestAdd\n"} {"Time":"2019-02-28T15:46:50.423809+08:00","Action":"output","Package":"gotest","Test":"TestAdd","Output":"--- PASS: TestAdd (0.00s)\n"} {"Time":"2019-02-28T15:46:50.423809+08:00","Action":"pass","Package":"gotest","Test":"TestAdd","Elapsed":0} {"Time":"2019-02-28T15:46:50.4247922+08:00","Action":"output","Package":"gotest","Output":"PASS\n"} {"Time":"2019-02-28T15:46:50.4247922+08:00","Action":"output","Package":"gotest","Output":"TestMain tear-down.\n"} {"Time":"2019-02-28T15:46:50.4257754+08:00","Action":"output","Package":"gotest","Output":"ok \tgotest\t0.465s\n"} {"Time":"2019-02-28T15:46:50.4257754+08:00","Action":"pass","Package":"gotest","Elapsed":0.465}-o <file>
-o 參數(shù)指定生成的二進(jìn)制可執(zhí)行程序,并執(zhí)行測(cè)試,測(cè)試結(jié)束不會(huì)刪除該程序。
沒有此參數(shù)時(shí),go test生成的二進(jìn)制可執(zhí)行程序存放到臨時(shí)目錄,執(zhí)行結(jié)束便刪除。
示例如下:
E:\OpenSource\GitHub\RainbowMango\GoExpertProgrammingSourceCode\GoExpert\src\gotest>go test -run TestAdd -o TestAdd TestMain setup. PASS TestMain tear-down. ok gotest 0.439s E:\OpenSource\GitHub\RainbowMango\GoExpertProgrammingSourceCode\GoExpert\src\gotest>TestAdd TestMain setup. PASS TestMain tear-down.本例中,使用-o 參數(shù)指定生成二進(jìn)制文件"TestAdd"并存放到當(dāng)前目錄,測(cè)試執(zhí)行結(jié)束后,仍然可以直接執(zhí)行該二進(jìn)制程序。
控制測(cè)試的參數(shù)
-bench regexp
go test默認(rèn)不執(zhí)行性能測(cè)試,使用-bench參數(shù)才可以運(yùn)行,而且只運(yùn)行性能測(cè)試函數(shù)。
其中正則表達(dá)式用于篩選所要執(zhí)行的性能測(cè)試。如果要執(zhí)行所有的性能測(cè)試,使用參數(shù)"-bench ."或"-bench=."。
此處的正則表達(dá)式不是嚴(yán)格意義上的正則,而是種包含關(guān)系。
比如有如下三個(gè)性能測(cè)試:
- func BenchmarkMakeSliceWithoutAlloc(b *testing.B)
- func BenchmarkMakeSliceWithPreAlloc(b *testing.B)
- func BenchmarkSetBytes(b *testing.B)
使用參數(shù)“-bench=Slice”,那么前兩個(gè)測(cè)試因?yàn)槎及?#34;Slice",所以都會(huì)被執(zhí)行,第三個(gè)測(cè)試則不會(huì)執(zhí)行。
對(duì)于包含子測(cè)試的場(chǎng)景下,匹配是按層匹配的。舉一個(gè)包含子測(cè)試的例子:
func BenchmarkSub(b *testing.B) {b.Run("A=1", benchSub1) b.Run("A=2", benchSub2) b.Run("B=1", benchSub3) }測(cè)試函數(shù)命名規(guī)則中,子測(cè)試的名字需要以父測(cè)試名字做為前綴并以"/"連接,上面的例子實(shí)際上是包含4個(gè)測(cè)試:
- Sub
- Sub/A=1
- Sub/A=2
- Sub/B=1
如果想執(zhí)行三個(gè)子測(cè)試,那么使用參數(shù)“-bench Sub”。如果只想執(zhí)行“Sub/A=1”,則使用參數(shù)"-bench Sub/A=1"。如果想執(zhí)行"Sub/A=1"和“Sub/A=2”,則使用參數(shù)"-bench Sub/A="。
-benchtime <t>s
-benchtime指定每個(gè)性能測(cè)試的執(zhí)行時(shí)間,如果不指定,則使用默認(rèn)時(shí)間1s。
例如,執(zhí)定每個(gè)性能測(cè)試執(zhí)行2s,則參數(shù)為:"go test -bench Sub/A=1 -benchtime 2s"。
-cpu 1,2,4
-cpu 參數(shù)提供一個(gè)CPU個(gè)數(shù)的列表,提供此列表后,那么測(cè)試將按照這個(gè)列表指定的CPU數(shù)設(shè)置GOMAXPROCS并分別測(cè)試。
比如“-cpu 1,2”,那么每個(gè)測(cè)試將執(zhí)行兩次,一次是用1個(gè)CPU執(zhí)行,一次是用2個(gè)CPU執(zhí)行。 例如,使用命令"go test -bench Sub/A=1 -cpu 1,2,3,4" 執(zhí)行測(cè)試:
BenchmarkSub/A=1 1000 1256835 ns/op BenchmarkSub/A=1-2 2000 912109 ns/op BenchmarkSub/A=1-3 2000 888671 ns/op BenchmarkSub/A=1-4 2000 894531 ns/op測(cè)試結(jié)果中測(cè)試名后面的-2、-3、-4分別代表執(zhí)行時(shí)GOMAXPROCS的數(shù)值。 如果GOMAXPROCS為1,則不顯示。
-count n
-count指定每個(gè)測(cè)試執(zhí)行的次數(shù),默認(rèn)執(zhí)行一次。
例如,指定測(cè)試執(zhí)行2次:
E:\OpenSource\GitHub\RainbowMango\GoExpertProgrammingSourceCode\GoExpert\src\gotest>go test -bench Sub/A=1 -count 2 TestMain setup. goos: windows goarch: amd64 pkg: gotest BenchmarkSub/A=1-4 2000 917968 ns/op BenchmarkSub/A=1-4 2000 882812 ns/op PASS TestMain tear-down. ok gotest 10.236s可以看到結(jié)果中也將呈現(xiàn)兩次的測(cè)試結(jié)果。
如果使用-count指定執(zhí)行次數(shù)的同時(shí)還指定了-cpu列表,那么測(cè)試將在每種CPU數(shù)量下執(zhí)行count指定的次數(shù)。
注意,示例測(cè)試不關(guān)心-count和-cpu參數(shù),它總是執(zhí)行一次。
-failfast
默認(rèn)情況下,go test將會(huì)執(zhí)行所有匹配到的測(cè)試,并最后打印測(cè)試結(jié)果,無論成功或失敗。
-failfast指定如果有測(cè)試出現(xiàn)失敗,則立即停止測(cè)試。這在有大量的測(cè)試需要執(zhí)行時(shí),能夠更快的發(fā)現(xiàn)問題。
-list regexp
-list 只是列出匹配成功的測(cè)試函數(shù),并不真正執(zhí)行。而且,不會(huì)列出子函數(shù)。
例如,使用參數(shù)"-list Sub"則只會(huì)列出包含子測(cè)試的三個(gè)測(cè)試,但不會(huì)列出子測(cè)試:
E:\OpenSource\GitHub\RainbowMango\GoExpertProgrammingSourceCode\GoExpert\src\gotest>go test -list Sub TestMain setup. TestSubParallel TestSub BenchmarkSub TestMain tear-down. ok gotest 0.396s-parallel n
指定測(cè)試的最大并發(fā)數(shù)。
當(dāng)測(cè)試使用t.Parallel()方法將測(cè)試轉(zhuǎn)為并發(fā)時(shí),將受到最大并發(fā)數(shù)的限制,默認(rèn)情況下最多有GOMAXPROCS個(gè)測(cè)試并發(fā),其他的測(cè)試只能阻塞等待。
-run regexp
跟據(jù)正則表達(dá)式執(zhí)行單元測(cè)試和示例測(cè)試。正則匹配規(guī)則與-bench 類似。
-timeout d
默認(rèn)情況下,測(cè)試執(zhí)行超過10分鐘就會(huì)超時(shí)而退出。
例時(shí),我們把超時(shí)時(shí)間設(shè)置為1s,由本來需要3s的測(cè)試就會(huì)因超時(shí)而退出:
E:\OpenSource\GitHub\RainbowMango\GoExpertProgrammingSourceCode\GoExpert\src\gotest>go test -timeout=1s TestMain setup. panic: test timed out after 1s設(shè)置超時(shí)可以按秒、按分和按時(shí):
- 按秒設(shè)置:-timeout xs或-timeout=xs
- 按分設(shè)置:-timeout xm或-timeout=xm
- 按時(shí)設(shè)置:-timeout xh或-timeout=xh
-v
默認(rèn)情況下,測(cè)試結(jié)果只打印簡(jiǎn)單的測(cè)試結(jié)果,-v 參數(shù)可以打印詳細(xì)的日志。
性能測(cè)試下,總是打印日志,因?yàn)槿罩居袝r(shí)會(huì)影響性能結(jié)果。
-benchmem
默認(rèn)情況下,性能測(cè)試結(jié)果只打印運(yùn)行次數(shù)、每個(gè)操作耗時(shí)。使用-benchmem則可以打印每個(gè)操作分配的字節(jié)數(shù)、每個(gè)操作分配的對(duì)象數(shù)。
// 沒有使用-benchmem BenchmarkMakeSliceWithoutAlloc-4 2000 971191 ns/op // 使用-benchmem BenchmarkMakeSliceWithoutAlloc-4 2000 914550 ns/op 4654335 B/op 30 allocs/op此處,每個(gè)操作的含義是放到循環(huán)中的操作,如下示例所示:
func BenchmarkMakeSliceWithoutAlloc(b *testing.B) {for i := 0; i < b.N; i++ { gotest.MakeSliceWithoutAlloc() // 一次操作 } }轉(zhuǎn)自:《Go專家編程》Go test 命令行參數(shù)
總結(jié)
以上是生活随笔為你收集整理的Go test 命令行参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql笔记--03DML
- 下一篇: 工匠服务协议