测试:在程序文件的同目录下创建测试文件以检测程序是否达到预期
1)测试文件必须以“_test.go
”结尾(前缀同被测试文件同名)
单元测试:对程序中最小可测试单元进行检查和验证
1)测试函数的参数类型为testing.T
测试函数的命名规则:TestXxx
1)Test为单元测试的固定前缀(“go test
”执行)
2)Xxx为函数名(被测试的函数名需以大写开头)
性能测试(基准测试):测试程序性能
1)测试函数的参数类型为testing.B
测试函数的命名规则:BenchmarkXxx
1)Benchmark为性能测试的固定前缀(“go test -bench=.
”执行)
2)Xxx为函数名(被测试的函数名需以大写开头)
示例测试:展示包或方法的用法
示例函数的命名规则:ExampleXxx
1)Example为实例测试的固定前缀(“go test
”执行)
2)Xxx为函数名(被测试的函数名需以大写开头)
每个示例函数内都需指定其预输出的结果:
(1)// OutPut:函数有单行或多行输出
(2)// Unordered output:函数有单行或多行输出(但次序不确定)
//多行输出时每行指定个结果(输出比较时会忽略前后空白)
子测试:通过父测试调用多个子测试以提高测试效率
1)子测试可避免每个测试函数执行前都需进行部分相同的初始化操作
2)父测试中通过testing.Run()方法调用子测试
3)父测试中也可添加程序段以作为共用代码
Run()方法原型:
func (t *T) Run(name string, f func(t *T)) bool
1)name为子测试的名字,f为子测试函数
2)Run()会阻塞到f执行结束后从返回,且返回值为f的执行结果
3)Run()通过启动goroutine运行f(可通过t.Parallel()设置为并发运行)
//并发执行时若仍需共用父测试的后部分代码,需对其进行再次封装(保证都结束时返回)
如:
import (
"testing"
"time"
)
// 并发子测试, 无实际测试工作(仅用于演示)
func parallelTest1(t *testing.T) {
t.Parallel()
time.Sleep(3 * time.Second)
// do some testing
}
// 并发子测试, 无实际测试工作(仅用于演示)
func parallelTest2(t *testing.T) {
t.Parallel()
time.Sleep(2 * time.Second)
// do some testing
}
// 并发子测试, 无实际测试工作(仅用于演示)
func parallelTest3(t *testing.T) {
t.Parallel()
time.Sleep(1 * time.Second)
// do some testing
}
// TestSubParallel 多个子测试封装后再并发执行, 同时多个子测试可以共享
func TestSubParallel(t *testing.T) {
// 无论是否并发均可共享(最先执行)
t.Logf("Setup")
t.Run("group", func(t *testing.T) {
t.Run("Test1", parallelTest1)
t.Run("Test2", parallelTest2)
t.Run("Test3", parallelTest3)
})
// 因再次封装, 所以仍可共享
t.Logf("teardown")
}
//子测试的命名规则:父测试名/Run的name参数
Main测试:调度各个测试执行
1)Main测试中必须创建TestMain()函数,且参数为“m *testing.M”
2)测试中所有测试都会交由TestMain()函数调度(而非直接执行)
3)Main测试若需使用命令行参数时,需通过flag包解析;
//TestMain()中对命令行参数的解析不会影响调度测试