Go(Golang)_15_程序测试

沈宏朗
2023-12-01

测试

测试:在程序文件的同目录下创建测试文件以检测程序是否达到预期

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测试

Main测试:调度各个测试执行

1)Main测试中必须创建TestMain()函数,且参数为“m *testing.M”

2)测试中所有测试都会交由TestMain()函数调度(而非直接执行)

3)Main测试若需使用命令行参数时,需通过flag包解析;

//TestMain()中对命令行参数的解析不会影响调度测试

 类似资料: