- 最近在學(xué)go的api抬纸,但是我覺得我不能學(xué)個(gè)api把整個(gè)項(xiàng)目build一次,特地去搜了一把Go的單元測(cè)試
- 單元測(cè)試規(guī)則
- 每個(gè)測(cè)試文件必須以 _test.go 結(jié)尾徘意,不然 go test 不能發(fā)現(xiàn)測(cè)試文件
- 每個(gè)測(cè)試文件必須導(dǎo)入 testing 包
- 功能測(cè)試函數(shù)必須以 Test 開頭车摄,然后一般接測(cè)試函數(shù)的名字,這個(gè)不強(qiáng)求
- 測(cè)試方法參數(shù)必須 t *testing.T
- 性能測(cè)試case以Benchmark開頭
- 例子
- 文件結(jié)構(gòu)
src └── api ├── compress_file.go └── compress_file_test.go
- go文件
package api import ( "bytes" "archive/tar" "log" "io" "fmt" "os" ) func Tar() { buf := new(bytes.Buffer) // Create a new tar archive. tw := tar.NewWriter(buf) // Add some files to the archive. var files = []struct { Name, Body string }{ {"readme.txt", "This archive contains some text files."}, {"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"}, {"todo.txt", "Get animal handling licence."}, } for _, file := range files { hdr := &tar.Header{ Name: file.Name, Size: int64(len(file.Body)), } if err := tw.WriteHeader(hdr); err != nil { log.Fatalln(err) } if _, err := tw.Write([]byte(file.Body)); err != nil { log.Fatalln(err) } } // Make sure to check the error on Close. if err := tw.Close(); err != nil { log.Fatalln(err) } // Open the tar archive for reading. r := bytes.NewReader(buf.Bytes()) tr := tar.NewReader(r) // Iterate through the files in the archive. for { hdr, err := tr.Next() if err == io.EOF { // end of tar archive break } if err != nil { log.Fatalln(err) } fmt.Printf("Contents of %s:\n", hdr.Name) if _, err := io.Copy(os.Stdout, tr); err != nil { log.Fatalln(err) } fmt.Println() } }
- go 測(cè)試文件
package api import "testing" func TestTar(t *testing.T) { Tar(); }
- 測(cè)試方法
go test compress_file*.go -v -cover === RUN TestTar Contents of readme.txt: This archive contains some text files. Contents of gopher.txt: Gopher names: George Geoffrey Gonzo Contents of todo.txt: Get animal handling licence. --- PASS: TestTar (0.00s) PASS coverage: 78.3% of statements ok command-line-arguments 0.007s
- 關(guān)于go test命令
go test [-c] [-i] [build flags] [packages] [flags for test binary]
- 參數(shù)解讀
-c : 編譯go test成為可執(zhí)行的二進(jìn)制文件隙畜,但是不運(yùn)行測(cè)試。 -i : 安裝測(cè)試包依賴的package说贝,但是不運(yùn)行測(cè)試议惰。 關(guān)于build flags,調(diào)用go help build乡恕,這些是編譯運(yùn)行過程中需要使用到的參數(shù)言询,一般設(shè)置為空 關(guān)于packages俯萎,調(diào)用go help packages,這些是關(guān)于包的管理运杭,一般設(shè)置為空 關(guān)于flags for test binary夫啊,調(diào)用go help testflag,這些是go test過程中經(jīng)常使用到的參數(shù) -test.v : 是否輸出全部的單元測(cè)試用例(不管成功或者失斄俱尽)撇眯,默認(rèn)沒有加上,所以只輸出失敗的單元測(cè)試用例虱咧。 -test.run pattern: 只跑哪些單元測(cè)試用例 -test.bench patten: 只跑那些性能測(cè)試用例 -test.benchmem : 是否在性能測(cè)試的時(shí)候輸出內(nèi)存情況 -test.benchtime t : 性能測(cè)試運(yùn)行的時(shí)間熊榛,默認(rèn)是1s -test.cpuprofile cpu.out : 是否輸出cpu性能分析文件 -test.memprofile mem.out : 是否輸出內(nèi)存性能分析文件 -test.blockprofile block.out : 是否輸出內(nèi)部goroutine阻塞的性能分析文件 -test.memprofilerate n : 內(nèi)存性能分析的時(shí)候有一個(gè)分配了多少的時(shí)候才打點(diǎn)記錄的問題。這個(gè)參數(shù)就是設(shè)置打點(diǎn)的內(nèi)存分配間隔腕巡,也就是profile中一個(gè)sample代表的內(nèi)存大小玄坦。默認(rèn)是設(shè)置為512 * 1024的。如果你將它設(shè)置為1绘沉,則每分配一個(gè)內(nèi)存塊就會(huì)在profile中有個(gè)打點(diǎn)煎楣,那么生成的profile的sample就會(huì)非常多。如果你設(shè)置為0梆砸,那就是不做打點(diǎn)了转质。 你可以通過設(shè)置memprofilerate=1和GOGC=off來(lái)關(guān)閉內(nèi)存回收,并且對(duì)每個(gè)內(nèi)存塊的分配進(jìn)行觀察帖世。 -test.blockprofilerate n: 基本同上休蟹,控制的是goroutine阻塞時(shí)候打點(diǎn)的納秒數(shù)。默認(rèn)不設(shè)置就相當(dāng)于-test.blockprofilerate=1日矫,每一納秒都打點(diǎn)記錄一下 -test.parallel n : 性能測(cè)試的程序并行cpu數(shù)赂弓,默認(rèn)等于GOMAXPROCS。 -test.timeout t : 如果測(cè)試用例運(yùn)行時(shí)間超過t哪轿,則拋出panic -test.cpu 1,2,4 : 程序運(yùn)行在哪些CPU上面盈魁,使用二進(jìn)制的1所在位代表,和nginx的nginx_worker_cpu_affinity是一個(gè)道理 -test.short : 將那些運(yùn)行時(shí)間較長(zhǎng)的測(cè)試用例運(yùn)行時(shí)間縮短
Go 單元測(cè)試
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)竹祷,“玉大人谈跛,你說(shuō)我怎么就攤上這事∷芰辏” “怎么了感憾?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)猿妈。 經(jīng)常有香客問我吹菱,道長(zhǎng),這世上最難降的妖魔是什么彭则? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮占遥,結(jié)果婚禮上俯抖,老公的妹妹穿的比我還像新娘。我一直安慰自己瓦胎,他們只是感情好芬萍,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搔啊,像睡著了一般柬祠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上负芋,一...
- 那天漫蛔,我揣著相機(jī)與錄音,去河邊找鬼旧蛾。 笑死莽龟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锨天。 我是一名探鬼主播毯盈,決...
- 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼病袄!你這毒婦竟也來(lái)了搂赋?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤益缠,失蹤者是張志新(化名)和其女友劉穎脑奠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體左刽,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡捺信,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迄靠。...
- 正文 年R本政府宣布吠式,位于F島的核電站陡厘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏特占。R本人自食惡果不足惜糙置,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望是目。 院中可真熱鬧谤饭,春花似錦、人聲如沸懊纳。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嗤疯。三九已至冤今,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茂缚,已是汗流浹背戏罢。 一陣腳步聲響...
- 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像凑术,于是被迫代替她去往敵國(guó)和親翩蘸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 1.1秋風(fēng)秋雨秋日寒詩(shī)田草蘆無(wú)日閑歌聲己接緋云樓菊黃蟹熟風(fēng)雨殘 1.2小窗過雨顯秋光暮色清幽鐘聲長(zhǎng)尋詞覓句銷殘夜如...
- 你為何如此堅(jiān)強(qiáng)泄鹏, 讓光也無(wú)法照進(jìn)你的心房郎任? 你為何如此倔強(qiáng)? 哪怕冷暖盡現(xiàn)于你的面前备籽, 你也不會(huì)正視他的臉龐舶治。 是...
- 1.iOS上線的流程 iOS上架流程 2.native reactive 的參考的網(wǎng)址 reactnative 中...
- 最近一周娃不在身邊分井,工作忙得迷迷糊糊,沉浸具體事物解決和半救火的狀態(tài)霉猛。按說(shuō)工作小20年了尺锚,應(yīng)該這樣那樣能應(yīng)付自如。...