每次测试后的golang测试方法:undefined:testing.M

Max*_*mov 3 go

我试图从golang测试重复示例

package main

import (
    "testing"
)

func TestSomeTest(t *testing.T) {}

func TestMain(m *testing.M) { // cleaning after each test}
Run Code Online (Sandbox Code Playgroud)

我想TestMain在每次测试后运行函数.

运行命令 go test

而编译器说

./testingM_test.go:9: undefined: testing.M
Run Code Online (Sandbox Code Playgroud)

那么在执行每个测试后如何清理?

Von*_*onC 8

检查go version输出:这仅适用于1.4+.

测试包有一个新工具,可以更好地控制运行一组测试.如果测试代码包含一个函数

func TestMain(m *testing.M) 
Run Code Online (Sandbox Code Playgroud)

将调用该函数而不是直接运行测试.
M结构包含访问和运行测试的方法.


你可以看到这里使用的功能:

引入TestMain()使得只能运行一次这些迁移成为可能.代码现在看起来像这样:

func TestSomeFeature(t *testing.T) {
    defer models.TestDBManager.Reset()

    // Do the tests
}

func TestMain(m *testing.M) {
    models.TestDBManager.Enter()
    // os.Exit() does not respect defer statements
    ret := m.Run()
    models.TestDBManager.Exit()
    os.Exit(ret)
}
Run Code Online (Sandbox Code Playgroud)

虽然每个测试仍然必须自行清理,但这只涉及恢复初始数据,这比进行模式迁移要快.