2017-02-18 3 views
11

Я использую пакет «тестирования». Выполнение моих тестов, как показано ниже.Тестирование и отключение для каждого теста в go

func TestMain(m *testing.M) { 

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

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

ответ

11

Как показано в статье «Go unit test setup and teardown» от Kare Nuorteva, вы можете использовать функцию настройки, которая возвращает ... функцию отрыва, которую вы откладываете.

См 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 это именно то, что я делал, с простым тестовым бегуном. Но я пришел к согласию, что это невозможно в голанге. –

0

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

Смежные вопросы