Тесты интеграции базы данных
-
09-06-2019 - |
Вопрос
Когда вы выполняете интеграционные тесты либо только с вашим уровнем доступа к данным, либо с большей частью стека приложений.Каков наилучший способ предотвратить столкновение нескольких тестов друг с другом, если они выполняются в одной базе данных?
Решение
Транзакции.
Что делает платформа модульного тестирования ruby on rails, так это:
Load all fixture data.
For each test:
BEGIN TRANSACTION
# Yield control to user code
ROLLBACK TRANSACTION
End for each
Это означает , что
- Любые изменения, внесенные вашим тестом в базу данных, не повлияют на другие потоки во время его выполнения
- Данные следующего теста не загрязнены предыдущими тестами
- Это примерно в миллион раз быстрее, чем ручная перезагрузка данных для каждого теста.
Я, например, думаю, что это довольно круто
Другие советы
Для простых приложений базы данных, которые я нахожу использующими SQLite - файл бесценный.Это позволяет вам иметь уникальную и автономную базу данных для каждого теста.
Однако это работает только в том случае, если вы используете простые универсальные функции SQL или можете легко скрыть небольшие различия между SQLite и вашей производственной системой баз данных за классом, но я всегда находил это довольно простым в разработанных мной приложениях SQL.
Просто чтобы добавить к свободному ответу антилопы Гну, я также использовал HSQLDB провести тестирование аналогичного типа, где каждый тест получает чистый экземпляр базы данных.
Я хотел принять ответы как "Свободной антилопы гну", так и Ориона Эдвардса, но это мне не позволило.Причина, по которой я хотел это сделать, заключается в том, что я пришел к выводу, что это были два основных способа сделать это, но какой из них выбрать, зависит от конкретного случая (в основном от размера базы данных).
Также запускайте тесты в разное время, чтобы они не влияли на производительность или валидность друг друга.
Хотя это и не так умно, как платформа модульного тестирования Rails в одном из других приведенных здесь ответов, создание отдельных данных для каждого теста или группы тестов - еще один способ сделать это.Уровень утомительности использования этого решения зависит от количества тестовых примеров, которые у вас есть, и от того, насколько они зависят друг от друга.Утомительность сохранится, если у вас будет одна база данных для каждого теста или группы зависимых тестов.
При запуске набора тестов вы загружаете данные в начале, запускаете набор тестов, выгружаете / сравниваете результаты, чтобы убедиться, что фактический результат соответствует ожидаемому.Если нет, повторите цикл еще раз.Загружайте, запускайте пакет, выгружайте / сравнивайте.