2017-02-18 69 views
11

我正在使用“测试”软件包。像下面一样运行我的测试。每次测试的测试设置和拆卸步骤

func TestMain(m *testing.M) { 

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

这将在任何测试运行之前运行一个设置,并且在所有测试完成之后进行拆卸。我确实需要这个,因为安装程序设置了数据库。但是,我需要,但仍然找到一种方法来运行每个测试设置/拆卸。对于我正在运行的单元测试,我想在每次测试之前清除数据库,以便数据库的内容不会引起意外行为。

回答

11

Kare Nuorteva中的文章“Go unit test setup and teardown”所示,您可以使用setup函数返回一个拆卸函数给您推迟。

参见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") 
    } 
} 

的设定功能是负责定义和返回拆卸之一。

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

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) 
     } 
    }) 
} 
+0

谢谢。虽然它接近我想要的,但我正在寻找一个能够自动完成这项工作的前期和后期工作,而且没有遗忘的机会。在Python中,这正是我以前用一个简单的测试运行器所做的。但我开始接受,这在golang中是不可能的。 –

0

您可以考虑在一个结构具有功能subTestSetup,子测试和subTestTeardown使分贝连接/其他常见的项目表( subTestSetup可以返回这个结构体)。您可以重复使用某些/部分设置&拆除不同的功能&随着测试需求的增长,保持这种模块化。在调用子测试之前调用defer subTestTeardown(),以确保即使在子测试存在任何问题时也会执行拆卸代码。

相关问题