Golang有自带的轻量级测试框架testing。
1. 官方文档
1.1 import “testing”
testing 提供对 Go 包的自动化测试的支持。通过 go test
命令,能够自动执行如下形式的任何函数:
func TestXxx(*testing.T)
其中 Xxx 可以是任何字母数字字符串(但第一个字母不能是 [a-z]),用于识别测试例程。在这些函数中,使用 Error, Fail 或相关方法来发出失败信号。
要编写一个新的测试套件,需要创建一个 名称以 _test.go 结尾的文件,该文件包含 TestXxx
函数,如上所述。 将该文件放在与被测试的包相同的包中。该文件将被排除在正常的程序包之外,但在运行 “go test” 命令时将被包含。
如果有需要,可以调用 *T 和 *B 的 Skip 方法,跳过该测试或基准测试:
func TestTimeConsuming(t *testing.T) {
if testing.Short() {
t.Skip(“skipping test in short mode.”)
}
…
}
1.2 type T
type T struct {
// contains filtered or unexported fields
}
T 是传递给测试函数的一种类型,它用于管理测试状态并支持格式化测试日志。测试日志会在执行测试的过程中不断累积, 并在测试完成时转储至标准输出。
当一个测试的测试函数返回时, 又或者当一个测试函数调用 FailNow 、 Fatal 、 Fatalf 、 SkipNow 、 Skip 或者 Skipf 中的任意一个时, 该测试即宣告结束。 跟 Parallel 方法一样, 以上提到的这些方法只能在运行测试函数的 goroutine 中调用。至于其他报告方法, 比如 Log 以及 Error 的变种, 则可以在多个 goroutine 中同时进行调用。
2. 实例
1)建立要进行测试的单元函数
文件夹 testFile/test01/cal.go
package cal
func addUp(n1 int) int {
return n1+10
}
2)以_test.go
结尾的文件,该文件包含 TestXxx
函数
文件夹 testFile/test01/cal_test.go
package cal
import (
“testing”
)
func TestAdd(t *testing.T){
res:= addUp(10)
if res!=50 {
t.Fatalf(“期望输出50,实际输出%v”,res)
}
t.Logf(“执行正确…”)
}
3)执行 go test -v
- go test :如果运行正确,无日志;错误时,输出日志。
- go test -v :运行正确或错误时,都输出日志。
- go test -v 文件名 文件名带的测试函数的源文件名:测试单独文件
- go test -v -test.run 函数名:测试单独函数
4)原理解析
可以看出,上面的实例中没有main包和main函数,但是执行的时候是怎样调用测试函数的呢?事实上,testing 框架中会自动将其测试函数引入,自建main函数对测试函数进行逐一的调用。