一、問題引入
如果讓你測試一個函數或者子產品,你會怎麼做呢?如下:
package main
import "fmt"
// 被測試的函數
func calAdd(n1 int, n2 int) int {
res := n1 + n2
return res
}
func main() {
// 傳統測試方式,在main函數中調用,看輸出結果
res := calAdd(1, 2)
if res != 3 {
fmt.Printf("calAdd函數錯誤,期望值是%v,傳回值是%v", 3, res)
} else {
fmt.Printf("calAdd函數正确,期望值是%v,傳回值是%v", 3, res)
}
}
可以看到在主函數中對被測試函數進行測試,那麼會存在一些弊端:
- 與主函數main進行了綁定
- 一旦有多個被測試項,都要更改主函數的代碼
- 如果項目正在運作過程中,還需要停止主函數才能繼續測試
是以就需要一個專門用于測試的架構來幫助我們解決上面的問題。
二、testing測試架構
1、什麼是testing
testing 提供對 Go 包的自動化測試的支援。通過 `go test` 指令,能夠自動執行如下形式的任何函數:
func TestXxx(*testing.T)
其中 Xxx 可以是任何字母數字字元串(但第一個字母不能是 [a-z]),用于識别測試例程。
在這些函數中,使用 Error, Fail 或相關方法來發出失敗信号。
要編寫一個新的測試套件,需要建立一個名稱以 _test.go 結尾的檔案,該檔案包含 `TestXxx` 函數,如上所述。 将該檔案放在與被測試的包相同的包中。該檔案将被排除在正常的程式包之外,但在運作 “go test” 指令時将被包含。 有關詳細資訊,請運作 “go help test” 和 “go help testflag” 了解。
2、快速入門
- 目錄結構
|─test
| cal.go
| cal_test.go
- cal.go 業務函數
package abc
func calAdd(n1 int, n2 int) int {
res := n1 + n2
return res
}
- cal_test.go 測試套件
package abc
import (
"testing"
)
func TestCalAdd(t *testing.T) {
res := calAdd(1, 2)
if res != 3 {
t.Fatalf("calAdd函數錯誤,期望值是%v,傳回值是%v", 3, res)
} else {
t.Logf("calAdd函數正确,期望值是%v,傳回值是%v", 3, res)
}
}
在上面的代碼中可以看到:
- cal_test.go測試套件中并沒有引入calAdd函數,但是可以識别,原因就是将測試套件cal_test.go和與cal.go放在同一個包abc下
- 測試套件中的測試用例必須以Test開頭,這樣友善識别具體的測試用例
3、注意事項
- 測試套件必須以_test.go結尾
- 測試套件中的測試用例必須以Test開頭,但後面的第一個不能是小寫字母[a-z]
- 一個測試套件檔案中可以有多個測試用例函數
4、測試方法
進入到test檔案夾:
- 所有測試用例
go test -v // 執行所有的測試套件中的所有測試用例
- 測試單個檔案
go test -v cal_test.go cal.go
- 測試單個方法
go test -v -test.run TestCalAdd
作者:iveBoy
出處:http://www.cnblogs.com/shenjianping/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連接配接,否則保留追究法律責任的權利。