Интеграционные тесты против базы данных - AVA

После написания модульных тестов я сталкиваюсь с тестами интеграции, которые состоят в тестировании библиотеки по базе данных (rethinkdb).

Каждый тестовый файл должен быть независимым между собой, и база данных будет очищена после каждого теста, чтобы они не дали ложных срабатываний.

Из-за архитектуры AVA необходимо параллельно запускать тесты, я узнал, что я не могу добиться положительных тестов таким образом. например:

test.beforeEach(async function(t) {

  const users = t.context.users = await DB.models.User.save([
    {name: 'jhon',username: 'doe'},
    {name: 'fabri',username: 'fenos'},
    {name: 'will',username: 'red'},
    {name: 'smith',username: 'blue'},
    {name: 'paul',username: 'orange'},
    {name: 'tesla',username: 'ele'},
  ]);

  t.context.tasks = await DB.models.Task.save([
    {title: 'My task1', description: 'My duty1', assignee_id: _.sample(users).id},
    {title: 'My task2', description: 'My duty2', assignee_id: _.sample(users).id},
    {title: 'My task3', description: 'My duty3', assignee_id: _.sample(users).id},
  ]);
});

test.afterEach(async (t) => {
  return await DB.clearDB();
});

Мне пришлось использовать функцию serial, чтобы каждый тест заканчивался и очищал БД последовательным образом.

Мои тесты могут обновлять или удалять данные, которые могут вызывать ложные срабатывания, если в тесте одновременно используются одни и те же данные.

Если тесты, которые я пишу, просто читают данные, я могу просто выполнить операцию посева и очистки так же, как pre и post script, как упоминалось в выпуске # 311 и параллельно проверяйте тесты.

Я также нашел очень приятным, как я могу использовать t.context и передавать объекты пользователей/задач в свои тесты.

Это тот, редкий случай, когда мы вынуждены использовать серийное тестирование?

Как бы вы справились с такими испытаниями, используя ava?

Ответ 1

Да, test.serial предназначен для этого.

Альтернативно, если вы можете использовать другую базу данных для каждого теста, которая позволит вам запускать их параллельно.