Go "testing"パッケージを使用しています。以下のようにテストを実行します。
func TestMain(m *testing.M) {
...
// Setup
os.Exit(m.Run())
// Teardown
}
これにより、テストが実行される前にセットアップが実行され、すべてのテストが完了した後にティアダウンが実行されます。セットアップでDBがセットアップされるので、これが必要です。しかし、また、テストごとのセットアップ/分解を実行する方法を見つける必要があります。私が実行している単体テストでは、すべてのテストの前にDBをクリアして、予期しない動作を引き起こすDBのコンテンツに問題がないようにします。
Kare Nuorteva の記事「 Goユニットテストのセットアップとティアダウン 」に示すように、...を返すセットアップ関数を使用して、ティアダウン関数を延期することができます。
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)
}
})
}
関数subTestSetup、subTestおよびsubTestTeardownのテーブルを使用して、構造体のdb接続/その他の共通項目を渡すことを検討できます(subTestSetupはこの構造体を返すことができます)。セットアップの一部/一部を再利用したり、さまざまな機能で分解したり、テスト要件の増加に応じてこのモジュールを維持したりできます。 subTestを呼び出す前にdefer subTestTeardown()を呼び出して、subTestに問題がある場合でもティアダウンコードが実行されるようにします。