go中的每个测试的测试设置和拆卸

Vir*_*eal 19 unit-testing go

我正在使用go"测试"包.运行我的测试如下.

func TestMain(m *testing.M) {

   ...
   // Setup
   os.Exit(m.Run())
   // Teardown
}
Run Code Online (Sandbox Code Playgroud)

这将在运行任何测试之前运行设置,并在所有测试完成后进行拆卸.我确实需要这个,因为设置设置了DB.但是,我还需要找到一种方法来运行每次测试设置/拆卸.对于我正在运行的单元测试,我想在每次测试之前清除DB,以便DB的内容没有问题导致意外行为.

Von*_*onC 17

Kare Nuorteva的文章" Go unit test setup and teardown " 所示,你可以使用一个设置函数来返回......一个拆卸功能.

看到这个要点:

func setupSubTest(t *testing.T) func(t *testing.T) {
    t.Log("setup sub test")
    return func(t *testing.T) {
        t.Log("teardown sub test")
    }
}
Run Code Online (Sandbox Code Playgroud)

设置功能负责定义和返回拆卸的功能.

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

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)
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。虽然它接近我想要的,但我一直在寻找一个可以自动执行此操作而不会忘记的前置和后置钩子。在 python 中,这正是我过去所做的,使用一个简单的测试运行器。但我开始接受这在 golang 中是不可能的。 (3认同)
  • 我可能是错的,但我不认为 1.14 中添加的新“T.Cleanup”功能可以实现 OP 想要的功能。我认为在每个单独的测试中仍然需要调用“T.Cleanup”。我认为“T.Cleanup”旨在解决的问题是一个不同的问题,如此处所述 https://github.com/golang/go/issues/32111 (2认同)