? ? ? ?在Go中,go test子命令是Go語言包的測(cè)試驅(qū)動(dòng)程序拥刻,這些包根據(jù)某些約定組織在一起怜瞒,在一個(gè)包目錄中,以_test.go結(jié)尾的文件不是go build命令編譯的目標(biāo),而是go test編譯的目標(biāo)吴汪。在*_test.go文件中惠窄,三種函數(shù)需要特殊對(duì)待,即功能測(cè)試函數(shù)漾橙、基準(zhǔn)測(cè)試函數(shù)和示例函數(shù)杆融。功能測(cè)試函數(shù)是以Test前綴命名的函數(shù),用來檢測(cè)一些程序邏輯的正確性霜运,go test運(yùn)行測(cè)試函數(shù)脾歇,并且報(bào)告結(jié)果是PASS還是FAIL√约瘢基準(zhǔn)測(cè)試函數(shù)的名稱以Benchmark開頭藕各,用來測(cè)試某些操作的性能,go test匯報(bào)操作的平均執(zhí)行時(shí)間焦除。go test工具掃描*_test.go文件來尋找特殊函數(shù)激况,并生成一個(gè)臨時(shí)的main包來調(diào)用它們,然后編譯和運(yùn)行膘魄,并匯報(bào)結(jié)果乌逐,最后清空臨時(shí)文件。
? ? ? 每一個(gè)測(cè)試文件都需要導(dǎo)入testing包创葡,這些函數(shù)的函數(shù)簽名格式是這樣的:func TestName (t *testing.T) { //... } 浙踢,比如sin函數(shù)就是func TestSin(t *testing.T) {/* ... */},cos函數(shù)就是func TestCos(t *testing.T) {/* ... */}蹈丸。測(cè)試可以讓我們順序地檢查內(nèi)容成黄,如果一個(gè)測(cè)試套件(test suite)里面有很多測(cè)試用例,我們可以選擇性地測(cè)試用例來加加測(cè)試過程逻杖。
? ? ? 命令-v可以輸出包中每個(gè)測(cè)試用例的名稱和執(zhí)行的時(shí)間奋岁,命令-run的參數(shù)是一個(gè)正則表達(dá)式,它可以使得go test只有運(yùn)行那些測(cè)試函數(shù)名稱匹配給定模式的函數(shù)荸百。當(dāng)然闻伶,一旦我們使得選擇的測(cè)試用例通過之后,在我們提交更改之前够话,我們必須重新使用不帶開關(guān)的go test來運(yùn)行一次整個(gè)測(cè)試套件蓝翰。當(dāng)調(diào)用t.Errorf輸出的失敗的調(diào)試用例信息沒有包含整個(gè)跟蹤棧信息,也不會(huì)導(dǎo)致程序宕機(jī)或者終止執(zhí)行女嘲,這和很多其他語言的測(cè)試框架中的斷言不同畜份。測(cè)試用例彼此都是獨(dú)立的,如果一個(gè)測(cè)試表中的一個(gè)條目造成測(cè)試失敗欣尼,那么其他條目的測(cè)試仍然會(huì)繼續(xù)測(cè)試爆雹,這樣我們就會(huì)在一次測(cè)試過程中發(fā)現(xiàn)多個(gè)失敗的情況停蕉,更方便我們進(jìn)行錯(cuò)誤的尋找。有的時(shí)候钙态,我們需要中止測(cè)試慧起,那么我們就可以使用t.Fatal或者t.Fatalf函數(shù)來終止測(cè)試。這些函數(shù)的調(diào)用必須和Test函數(shù)在同樣一個(gè)goroutine中册倒,而不能在測(cè)試用例創(chuàng)建的其他goroutine中蚓挤。
? ? ? ?測(cè)試錯(cuò)誤信息一般的格式是f(X)=Y, want z,這里f(x)表示需要執(zhí)行的操作和它的輸入驻子,y是實(shí)際的輸出結(jié)果灿意,z是期望得到的一個(gè)結(jié)果。處于方便拴孤,對(duì)于f(x)我們會(huì)使用Go的語法脾歧。在基于表的測(cè)試中,輸出x是很重要的演熟,因?yàn)橐粭l斷言語句會(huì)在不同的輸入情況下執(zhí)行多次鞭执,錯(cuò)誤消息要避免樣板文字和冗余信息。如果x芒粹、y兄纺、z都比較長(zhǎng),可以輸出準(zhǔn)確代表各部分的概要信息化漆。