Вопрос

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

Это было полезно?

Решение

Транзакции.

Что делает платформа модульного тестирования ruby on rails, так это:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top