Go 單元測(cè)試

  • 最近在學(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í)間縮短
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窃诉,一起剝皮案震驚了整個(gè)濱河市杨耙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌飘痛,老刑警劉巖珊膜,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宣脉,居然都是意外死亡车柠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)竹祷,“玉大人谈跛,你說(shuō)我怎么就攤上這事∷芰辏” “怎么了感憾?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)猿妈。 經(jīng)常有香客問我吹菱,道長(zhǎng),這世上最難降的妖魔是什么彭则? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮占遥,結(jié)果婚禮上俯抖,老公的妹妹穿的比我還像新娘。我一直安慰自己瓦胎,他們只是感情好芬萍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搔啊,像睡著了一般柬祠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上负芋,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天漫蛔,我揣著相機(jī)與錄音,去河邊找鬼旧蛾。 笑死莽龟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锨天。 我是一名探鬼主播毯盈,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼病袄!你這毒婦竟也來(lái)了搂赋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤益缠,失蹤者是張志新(化名)和其女友劉穎脑奠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體左刽,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捺信,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迄靠。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秒咨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掌挚,到底是詐尸還是另有隱情雨席,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布吠式,位于F島的核電站陡厘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏特占。R本人自食惡果不足惜糙置,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望是目。 院中可真熱鬧谤饭,春花似錦、人聲如沸懊纳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嗤疯。三九已至冤今,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茂缚,已是汗流浹背戏罢。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阱佛,地道東北人帖汞。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像凑术,于是被迫代替她去往敵國(guó)和親翩蘸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1.1秋風(fēng)秋雨秋日寒詩(shī)田草蘆無(wú)日閑歌聲己接緋云樓菊黃蟹熟風(fēng)雨殘 1.2小窗過雨顯秋光暮色清幽鐘聲長(zhǎng)尋詞覓句銷殘夜如...
    Jack老錢閱讀 426評(píng)論 4 1
  • “人要讓自己活得像一支軍隊(duì)淮逊, 對(duì)自己的大腦和心靈招兵買馬催首。” 【劉...
    十三的書屋閱讀 570評(píng)論 0 2
  • 你為何如此堅(jiān)強(qiáng)泄鹏, 讓光也無(wú)法照進(jìn)你的心房郎任? 你為何如此倔強(qiáng)? 哪怕冷暖盡現(xiàn)于你的面前备籽, 你也不會(huì)正視他的臉龐舶治。 是...
    我給你編故事你有酒么閱讀 171評(píng)論 0 3
  • 1.iOS上線的流程 iOS上架流程 2.native reactive 的參考的網(wǎng)址 reactnative 中...
    MrCSA閱讀 379評(píng)論 0 0
  • 最近一周娃不在身邊分井,工作忙得迷迷糊糊,沉浸具體事物解決和半救火的狀態(tài)霉猛。按說(shuō)工作小20年了尺锚,應(yīng)該這樣那樣能應(yīng)付自如。...
    孟yueling閱讀 504評(píng)論 6 9