## go test工具
Go語言中的測試依賴go test命令
go test命令是一個按照一定約定和組織的測試代碼的驅動程序。在包目錄內,所有以\_test.go為后綴名的源代碼文件都是go test測試的一部分,不會被go build編譯到最終的可執行文件中。
在`*_test.go`文件中有三種類型的函數,單元測試函數、基準測試函數和示例函數。
| 類型 | 格式 | 作用 |
| --- | --- | --- |
| 測試函數 | 函數名前綴為Test | 測試程序的一些邏輯行為是否正確 |
| 基準函數 | 函數名前綴為Benchmark | 測試函數的性能 |
| 示例函數 | 函數名前綴為Example | 為文檔提供示例文檔 |
go test命令會遍歷所有的`*_test.go`文件中符合上述命名規則的函數,然后生成一個臨時的main包用于調用相應的測試函數,然后構建并運行、報告測試結果,最后清理測試中生成的臨時文件。
Golang單元測試對文件名和方法名,參數都有很嚴格的要求。
~~~
1、文件名必須以xx_test.go命名
2、方法必須是Test[^a-z]開頭
3、方法參數必須 t *testing.T
4、使用go test執行單元測試
~~~
### go test參數解讀
go test是go語言自帶的測試工具,其中包含的是兩類,單元測試和性能測試
通過go help test可以看到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 : 將那些運行時間較長的測試用例運行時間縮短
- 概述
- go語言基礎特性
- Go語言聲明
- Go項目構建及編譯
- go command
- 程序設計原則
- Go基礎
- 變量
- 常量
- iota
- 基本類型
- byte和rune類型
- 類型定義和類型別名
- 數組
- string
- 高效字符串連接
- string底層原理
- 運算符
- new
- make
- 指針
- 下劃線 & import
- 語法糖
- 簡短變量申明
- 流程控制
- ifelse
- switch
- select
- select實現原理
- select常見案例
- for
- range
- range實現原理
- 常見案例
- range陷阱
- Goto&Break&Continue
- Go函數
- 函數
- 可變參數函數
- 高階函數
- init函數和main函數
- 匿名函數
- 閉包
- 常用內置函數
- defer
- defer常見案例
- defer規則
- defer與函數返回值
- defer實現原理
- defer陷阱
- 數據結構
- slice
- slice內存布局
- slice&array
- slice底層實現
- slice陷阱
- map
- Map實現原理
- 集合
- List
- Set
- 線程安全數據結構
- sync.Map
- Concurrent Map
- 面向對象編程
- struct
- 匿名結構體&匿名字段
- 嵌套結構體
- 結構體的“繼承”
- struct tag
- 行為方法
- 方法與函數
- type Method Value & Method Expressions
- interface
- 類型斷言
- 多態
- 錯誤機制
- error
- 自定義錯誤
- panic&recover
- reflect
- reflect包
- 應用示例
- DeepEqual
- 反射-fillObjectField
- 反射-copyObject
- IO
- 讀取文件
- 寫文件
- bufio
- ioutil
- Go網絡編程
- tcp
- tcp粘包
- udp
- HTTP
- http服務
- httprouter
- webSocket
- go并發編程
- Goroutine
- thread vs goroutine
- Goroutine任務取消
- 通過channel廣播實現
- Context
- Goroutine調度機制
- goroutine調度器1.0
- GMP模型調度器
- 調度器竊取策略
- 調度器的生命周期
- 調度過程全解析
- channel
- 無緩沖的通道
- 緩沖信道
- 單向信道
- chan實現原理
- 共享內存并發機制
- mutex互斥鎖
- mutex
- mutex原理
- mutex模式
- RWLock
- 使用信道處理競態條件
- WaitGroup
- 工作池
- 并發任務
- once運行一次
- 僅需任意任務完成
- 所有任務完成
- 對象池
- 定時器Timer
- Timer
- Timer實現原理
- 周期性定時器Ticker
- Ticker對外接口
- ticker使用場景
- ticker實現原理
- ticker使用陷阱
- 包和依賴管理
- package
- 依賴管理
- 測試
- 單元測試
- 表格測試法
- Banchmark
- BDD
- 常用架構模式
- Pipe-filter pattern
- Micro Kernel
- JSON
- json-內置解析器
- easyjson
- 性能分析
- gc
- 工具類
- fmt
- Time
- builtin
- unsafe
- sync.pool
- atomic
- flag
- runtime
- strconv
- template