当你写完一个函数,结构体,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