Go 單元測試

  • 最近在學go的api,但是我覺得我不能學個api把整個項目build一次,特地去搜了一把Go的單元測試
  • 單元測試規則
    • 每個測試文件必須以 _test.go 結尾,不然 go test 不能發現測試文件
    • 每個測試文件必須導入 testing 包
    • 功能測試函數必須以 Test 開頭,然后一般接測試函數的名字,這個不強求
    • 測試方法參數必須 t *testing.T
    • 性能測試case以Benchmark開頭
  • 例子
    • 文件結構
     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 測試文件
    package api
    
    import "testing"
    
    func TestTar(t *testing.T)  {
       Tar();
    
    }
    
    • 測試方法
    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
    
  • 關于go test命令
    • go test [-c] [-i] [build flags] [packages] [flags for test binary]
    • 參數解讀
      -c : 編譯go test成為可執行的二進制文件,但是不運行測試。
      
      -i : 安裝測試包依賴的package,但是不運行測試。
      
      關于build flags,調用go help build,這些是編譯運行過程中需要使用到的參數,一般設置為空
      
      關于packages,調用go help packages,這些是關于包的管理,一般設置為空
      
      關于flags for test binary,調用go help testflag,這些是go test過程中經常使用到的參數
      
      -test.v : 是否輸出全部的單元測試用例(不管成功或者失敗),默認沒有加上,所以只輸出失敗的單元測試用例。
      
      -test.run pattern: 只跑哪些單元測試用例
      
      -test.bench patten: 只跑那些性能測試用例
      
      -test.benchmem : 是否在性能測試的時候輸出內存情況
      
      -test.benchtime t : 性能測試運行的時間,默認是1s
      
      -test.cpuprofile cpu.out : 是否輸出cpu性能分析文件
      
      -test.memprofile mem.out : 是否輸出內存性能分析文件
      
      -test.blockprofile block.out : 是否輸出內部goroutine阻塞的性能分析文件
      
      -test.memprofilerate n : 內存性能分析的時候有一個分配了多少的時候才打點記錄的問題。這個參數就是設置打點的內存分配間隔,也就是profile中一個sample代表的內存大小。默認是設置為512 * 1024的。如果你將它設置為1,則每分配一個內存塊就會在profile中有個打點,那么生成的profile的sample就會非常多。如果你設置為0,那就是不做打點了。
      
      你可以通過設置memprofilerate=1和GOGC=off來關閉內存回收,并且對每個內存塊的分配進行觀察。
      
      -test.blockprofilerate n: 基本同上,控制的是goroutine阻塞時候打點的納秒數。默認不設置就相當于-test.blockprofilerate=1,每一納秒都打點記錄一下
      
      -test.parallel n : 性能測試的程序并行cpu數,默認等于GOMAXPROCS。
      
      -test.timeout t : 如果測試用例運行時間超過t,則拋出panic
      
      -test.cpu 1,2,4 : 程序運行在哪些CPU上面,使用二進制的1所在位代表,和nginx的nginx_worker_cpu_affinity是一個道理
      
      -test.short : 將那些運行時間較長的測試用例運行時間縮短
    
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容

  • 1.1秋風秋雨秋日寒詩田草蘆無日閑歌聲己接緋云樓菊黃蟹熟風雨殘 1.2小窗過雨顯秋光暮色清幽鐘聲長尋詞覓句銷殘夜如...
    Jack老錢閱讀 444評論 4 1
  • “人要讓自己活得像一支軍隊, 對自己的大腦和心靈招兵買馬。” 【劉...
    十三的書屋閱讀 600評論 0 2
  • 你為何如此堅強, 讓光也無法照進你的心房? 你為何如此倔強? 哪怕冷暖盡現于你的面前, 你也不會正視他的臉龐。 是...
    我給你編故事你有酒么閱讀 176評論 0 3
  • 1.iOS上線的流程 iOS上架流程 2.native reactive 的參考的網址 reactnative 中...
    MrCSA閱讀 391評論 0 0
  • 最近一周娃不在身邊,工作忙得迷迷糊糊,沉浸具體事物解決和半救火的狀態。按說工作小20年了,應該這樣那樣能應付自如。...
    孟yueling閱讀 517評論 6 9