Тесты интеграции базы данных

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

6 ответов

Решение

Сделки.

Что делает фреймворк ruby ​​on rails unit:

Load all fixture data.

For each test:

  BEGIN TRANSACTION

    # Yield control to user code

  ROLLBACK TRANSACTION

End for each

Это означает, что

  1. Любые изменения, внесенные тестом в базу данных, не повлияют на другие потоки, пока они находятся в процессе выполнения.
  2. Данные следующего теста не загрязнены предыдущими тестами
  3. Это примерно в миллион раз быстрее, чем вручную загружать данные для каждого теста.

Я, например, думаю, что это довольно круто

Для простых приложений баз данных я считаю использование SQLite бесценным. Это позволяет вам иметь уникальную и автономную базу данных для каждого теста.

Однако это работает, только если вы используете простую универсальную функциональность SQL или можете легко скрыть небольшие различия между SQLite и вашей производственной системой баз данных за классом, но я всегда обнаруживал, что это довольно просто в приложениях SQL, которые я разработаны.

Просто чтобы добавить к ответу Свободного антилопы гну, я также использовал HSQLDB для тестирования подобных типов, где каждый тест получает чистый экземпляр БД.

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

Я хотел принять ответы как Свободной антилопы гну, так и Ориона Эдвардса, но это не позволило мне. Причина, по которой я хотел это сделать, заключается в том, что я пришел к выводу, что это были два основных способа сделать это, но какой из них выбрать, зависит от конкретного случая (в основном от размера базы данных).

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

При запуске набора тестов вы загружаете данные при запуске, запускаете набор тестов, выгружаете / сравниваете результаты, убеждаясь, что фактический результат соответствует ожидаемому результату. Если нет, повторите цикл снова. Загрузка, запуск комплекта, выгрузка / сравнение.

Другие вопросы по тегам