[TOC]
# 簡介
Go 程序編寫三類測試,即:功能測試(test)、基準測試(benchmark,也稱性能測試),以及示例測試(example)
一般情況下,一個測試源碼文件只會針對于某個命令源碼文件,或庫源碼文件(以下簡稱被測源碼文件)做測試,所以我們總會(并且應該)把它們放在同一個代碼包內
測試源碼文件的主名稱應該以被測源碼文件的主名稱為前導,并且必須以“\_test”為后綴。例如,如果被測源碼文件的名稱為 demo52.go,那么針對它的測試源碼文件的名稱就應該是 demo52\_test.go
每個測試源碼文件都必須至少包含一個測試函數。并且,從語法上講,每個測試源碼文件中,都可以包含用來做任何一類測試的測試函數,即使把這三類測試函數都塞進去也沒有問題。我通常就是這么做的,只要把控好測試函數的分組和數量就可以了
# 對測試函數的名稱和簽名規定
這里我給出的典型回答是下面三個內容。
* 對于功能測試函數來說,其名稱必須以Test為前綴,并且參數列表中只應有一個\*testing.T類型的參數聲明。
* 對于性能測試函數來說,其名稱必須以Benchmark為前綴,并且唯一參數的類型必須是\*testing.B類型的。
* 對于示例測試函數來說,其名稱必須以Example為前綴,但對函數的參數列表沒有強制規定
# 基于表的測試方式
在 Go 語言中,有一種常用的測試套路,叫做**基于表的測試方式**,其核心就是我們需要針對不同的場景,其實也就是不同的輸入和輸出來驗證一個功能。例如我們要驗證的`Add`函數,我們需要驗證的功能點有很多,例如:
* 兩個正數相加是否正確
* 兩個負數相加是否正確
* 一個正數加上一個負數是否正確
* 有一個數為 0 是否正確
那么,我們就可以使用**基于表的測試方式**了,代碼可以這樣寫
~~~
func TestMultiAdd(t *testing.T) {
var tests = []struct{
Arg1 int
Arg2 int
sum int
} {
{1, 1, 2},
{-1, -1, -2},
{1, -1, 0},
{0, 1, 1},
}
for _, test := range tests {
sum := Add(test.Arg1, test.Arg2)
if sum != test.sum {
t.Errorf("Add %v and %v result isn't %v", test.Arg1, test.Arg2, test.sum)
}
}
}
~~~
- 基礎
- 簡介
- 主要特征
- 變量和常量
- 編碼轉換
- 數組
- byte與rune
- big
- sort接口
- 和mysql類型對應
- 函數
- 閉包
- 工作區
- 復合類型
- 指針
- 切片
- map
- 結構體
- sync.Map
- 隨機數
- 面向對象
- 匿名組合
- 方法
- 接口
- 權限
- 類型查詢
- 異常處理
- error
- panic
- recover
- 自定義錯誤
- 字符串處理
- 正則表達式
- json
- 文件操作
- os
- 文件讀寫
- 目錄
- bufio
- ioutil
- gob
- 棧幀的內存布局
- shell
- 時間處理
- time詳情
- time使用
- new和make的區別
- container
- list
- heap
- ring
- 測試
- 單元測試
- Mock依賴
- delve
- 命令
- TestMain
- path和filepath包
- log日志
- 反射
- 詳解
- plugin包
- 信號
- goto
- 協程
- 簡介
- 創建
- 協程退出
- runtime
- channel
- select
- 死鎖
- 互斥鎖
- 讀寫鎖
- 條件變量
- 嵌套
- 計算單個協程占用內存
- 執行規則
- 原子操作
- WaitGroup
- 定時器
- 對象池
- sync.once
- 網絡編程
- 分層模型
- socket
- tcp
- udp
- 服務端
- 客戶端
- 并發服務器
- Http
- 簡介
- http服務器
- http客戶端
- 爬蟲
- 平滑重啟
- context
- httptest
- 優雅中止
- web服務平滑重啟
- beego
- 安裝
- 路由器
- orm
- 單表增刪改查
- 多級表
- orm使用
- 高級查詢
- 關系查詢
- SQL查詢
- 元數據二次定義
- 控制器
- 參數解析
- 過濾器
- 數據輸出
- 表單數據驗證
- 錯誤處理
- 日志
- 模塊
- cache
- task
- 調試模塊
- config
- 部署
- 一些包
- gjson
- goredis
- collection
- sjson
- redigo
- aliyunoss
- 密碼
- 對稱加密
- 非對稱加密
- 單向散列函數
- 消息認證
- 數字簽名
- mysql優化
- 常見錯誤
- go run的錯誤
- 新手常見錯誤
- 中級錯誤
- 高級錯誤
- 常用工具
- 協程-泄露
- go env
- gometalinter代碼檢查
- go build
- go clean
- go test
- 包管理器
- go mod
- gopm
- go fmt
- pprof
- 提高編譯
- go get
- 代理
- 其他的知識
- go內存對齊
- 細節總結
- nginx路由匹配
- 一些博客
- redis為什么快
- cpu高速緩存
- 常用命令
- Go 永久阻塞的方法
- 常用技巧
- 密碼加密解密
- for 循環迭代變量
- 備注
- 垃圾回收
- 協程和纖程
- tar-gz
- 紅包算法
- 解決golang.org/x 下載失敗
- 逃逸分析
- docker
- 鏡像
- 容器
- 數據卷
- 網絡管理
- 網絡模式
- dockerfile
- docker-composer
- 微服務
- protoBuf
- GRPC
- tls
- consul
- micro
- crontab
- shell調用
- gorhill/cronexpr
- raft
- go操作etcd
- mongodb