Настройка теста и отрыв для каждого теста в режиме go

Я использую пакет "тестирования". Выполнение моих тестов, как показано ниже.

func TestMain(m *testing.M) {

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

Это запустит настройку перед запуском любого теста и завершение после завершения всех тестов. И мне это нужно, поскольку настройка устанавливает БД. Но также, мне нужно, и еще, чтобы узнать, как запустить настройку/отключение при каждом тестировании. Для модульных тестов я запускаю, я хотел бы очистить БД перед каждым тестом, так что нет никаких проблем с содержимым БД, вызывающим неожиданное поведение.

Ответы

Ответ 1

Как показано в статье " Установка и отключение тестового модуля " от Kare Nuorteva, вы можете использовать функцию настройки, которая возвращает... функцию отрыва, которую вы откладываете.

См. Этот принцип:

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

Ответ 2

Вы можете рассмотреть наличие таблицы функций subTestSetup, subTest и subTestTeardown, передающих соединение db/другие общие элементы в структуре (subTestSetup может вернуть эту структуру). Вы можете повторно использовать некоторые/части установки и снести в разные функции и сохранить эту модульность по мере роста требований к тестированию. Отклонить вызов subTestTeardown() перед вызовом subTest, чтобы гарантировать, что срыв кода выполняется, даже если есть какие-либо проблемы с subTest.