我正在使用go"测试"软件包.像下面这样运行我的测试.
func TestMain(m *testing.M) {
...
// Setup
os.Exit(m.Run())
// Teardown
}
这将在运行任何测试之前运行安装程序,并在所有测试完成后运行拆卸.我确实需要这个,因为设置会设置数据库.但是,我还需要找到一种方法来运行每次测试设置/拆卸.对于我正在运行的单元测试,我希望在每次测试之前清除数据库,这样就不会出现导致意外行为的数据库内容问题.
我正在使用go"测试"软件包.像下面这样运行我的测试.
func TestMain(m *testing.M) {
...
// Setup
os.Exit(m.Run())
// Teardown
}
这将在运行任何测试之前运行安装程序,并在所有测试完成后运行拆卸.我确实需要这个,因为设置会设置数据库.但是,我还需要找到一种方法来运行每次测试设置/拆卸.对于我正在运行的单元测试,我希望在每次测试之前清除数据库,这样就不会出现导致意外行为的数据库内容问题.
Update for Go 1.14(2020年第一季度)
testing
包现在通过分别调用T.Cleanup
或B.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)
}
})
}