testing 其他功能


TestMain 测试时 有时需要在测试前后进行额外的设置 setup 或拆卸 teardown
测试还需要控制在主线程上运行的代码 为了支持这些需求 testing 提供了 TestMain 函数
func TestMain(m *testing.M)
如果测试文件中包含该函数 那么生成的测试将调用 TestMain(m) 而不是直接运行测试
TestMain 运行在主 goroutine 中
可在调用 m.Run 前后做任何设置和拆卸
在 TestMain 函数的最后 应用 m.Run 的返回值作为参数调用 os.Exit
在调用 TestMain 时 flag.Parse 并没有被调用
所以如果 TestMain 依赖于 command-line 标志 (包括 testing 包的标记)
则应显示的调用 flag.Parse
这里说的依赖 是如果 TestMain 函数内依赖 flag 则必须显示调用 flag.Parse
否则不需要 因为 m.Run 中调用 flag.Parse
package mytestmain
import (  
    "flag"
    "fmt"
    "os"
    "testing"
)
var db struct {  
    Dns string
}
func TestMain(m *testing.M) {
    db.Dns = os.Getenv("DATABASE_DNS")
    if db.Dns == "" {
        db.Dns = "root:123456@tcp(localhost:3306)/?charset=utf8&parseTime=True&loc=Local"
    }
    flag.Parse()
    exitCode := m.Run()

    db.Dns = ""   // 退出
    os.Exit(exitCode)
}
func TestDatabase(t *testing.T) {
    fmt.Println(db.Dns)
}
Run 可阅读源码 了解其原理

测试覆盖率

Test Coverage
测试覆盖率 基于代码的测试覆盖率
Go 测试覆盖率的支持 使用的是 cover 相关的工具
go test -cover / go tool cover
虽然 testing 包提供了 cover 相关函数
不过是给 cover 工具使用的