當你寫完一個函數,結構體,main之後,你下一步需要的就是測試了。testing包提供了很簡單易用的測試包。
測試文件的文件名需要以_test.go為結尾,測試用例需要以TestXxxx的樣式存在。
比如我要測試utils包的sql.go中的函數:
func GetOne(db *sql.DB, query string, args ...interface{}) (map[string][]byte, error) {
就需要創建一個sql_test.go
package utils
import (
"database/sql"
_ "fmt"
_ "github.com/go-sql-driver/mysql"
"strconv"
"testing"
)
func Test_GetOne(t *testing.T) {
db, err := sql.Open("mysql", "root:123.abc@tcp(192.168.33.10:3306)/test")
defer func() {
db.Close()
}()
if err != nil {
t.Fatal(err)
}
// 測試empty
car_brand, err := GetOne(db, "select * from user where id = 999999")
if (car_brand != nil) || (err != nil) {
t.Fatal("emtpy測試錯誤")
}
}
測試用例有四種形式:
TestXxxx(t testing.T) // 基本測試用例
BenchmarkXxxx(b testing.B) // 壓力測試的測試用例
Example_Xxx() // 測試控制台輸出的例子
TestMain(m *testing.M) // 測試Main函數
給個Example的例子:(Example需要在最後用注釋的方式確認控制台輸出和預期是不是一致的)
func Example_GetScore() {
score := getScore(100, 100, 100, 2.1)
fmt.Println(score)
// Output:
// 31.1
}
gotest的變量有這些:
T結構內部是繼承自common結構,common結構提供集中方法,是我們經常會用到的:
當我們遇到一個斷言錯誤的時候,我們就會判斷這個測試用例失敗,就會使用到:
Fail : case失敗,測試用例繼續
FailedNow : case失敗,測試用例中斷
當我們遇到一個斷言錯誤,只希望跳過這個錯誤,但是不希望標示測試用例失敗,會使用到:
SkipNow : case跳過,測試用例不繼續
當我們只希望在一個地方打印出信息,我們會用到:
Log : 輸出信息
Logf : 輸出有format的信息
當我們希望跳過這個用例,並且打印出信息:
Skip : Log + SkipNow
Skipf : Logf + SkipNow
當我們希望斷言失敗的時候,測試用例失敗,打印出必要的信息,但是測試用例繼續:
Error : Log + Fail
Errorf : Logf + Fail
當我們希望斷言失敗的時候,測試用例失敗,打印出必要的信息,測試用例中斷:
Fatal : Log + FailNow
Fatalf : Logf + FailNow