我正在使用go"测试"软件包.像下面这样运行我的测试.

func TestMain(m *testing.M) {

   ...
   // Setup
   os.Exit(m.Run())
   // Teardown
}

这将在运行任何测试之前运行安装程序,并在所有测试完成后运行拆卸.我确实需要这个,因为设置会设置数据库.但是,我还需要找到一种方法来运行每次测试设置/拆卸.对于我正在运行的单元测试,我希望在每次测试之前清除数据库,这样就不会出现导致意外行为的数据库内容问题.

推荐答案

Update for Go 1.14(2020年第一季度)

testing包现在通过分别调用T.CleanupB.Cleanup来支持在测试或基准测试完成后调用的清理函数.例如,

func TestFunction(t *testing.T) {
    // setup code
    // sub-tests
    t.Run() 
    t.Run() 
    ...
    // cleanup
    t.Cleanup(func(){
        //tear-down code
    })
}

在这里,t.Cleanup在测试及其所有子测试完成后运行.


Original answer (Feb. 2017)
As shown in the article "Go unit test setup and teardown" from Kare Nuorteva, you could use a setup function which returns... a teardown function to you defer.

请参见this gist:

func setupSubTest(t *testing.T) func(t *testing.T) {
    t.Log("setup sub test")
    return func(t *testing.T) {
        t.Log("teardown sub test")
    }
}

SETUP函数负责定义和返回拆卸函数.

对于每个测试,例如在表驱动的测试场景中:

for _, tc := range cases {
    t.Run(tc.name, func(t *testing.T) {
        teardownSubTest := setupSubTest(t)
        defer teardownSubTest(t)

        result := Sum(tc.a, tc.b)
        if result != tc.expected {
            t.Fatalf("expected sum %v, but got %v", tc.expected, result)
        }
    })
}

Go相关问答推荐

Go PQ驱动程序无法使用默认架构进行查询

+在具有html/模板Golang的Base64中

如何使用工作区方法扩展克隆的Golang库

Websocket服务器实现与x/net库trowing 403

Go SQLCMD比Windows本机版本慢吗?

如何在链接中写入链接

无法使用exec从管道中读取.Go中的命令

该文件位于模块.内,该模块不包含在您的工作区中

我应该先解锁然后再广播吗?

命令行参数在 Golang 程序中不正确地接受为参数

io.Reader 无限循环与 fmt.Fscan

为什么 net/http 不遵守超过 30 秒的超时持续时间?

加密/椭圆:try 在无效点上进行操作

Apache Beam 在 Go 中从 PCollection 中 Select 前 N 行

当函数返回一个函数时,为什么 Go 泛型会失败?

具有未导出字段的 struct 类型之间的转换

如何在测试中使用自定义标志(使用`testify/suite`)

使用 xml.Name 将 xml 解组为 [] struct

go mod tidy 错误消息:但是 go 1.16 会 Select

try 执行`go test ./... -v`时,Golang中有没有办法设置标志