Когда вы выполняете интеграционные тесты либо только со своим уровнем доступа к данным, либо с большей частью стека приложений. Как лучше всего предотвратить конфликты нескольких тестов друг с другом, если они выполняются в одной и той же базе данных?
Интеграционные тесты базы данных
Ответы (6)
Сделки.
Вот что делает среда модульного тестирования 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, которые я развитый.
Просто чтобы добавить к ответу Free Wildebeest, я также использовал HSQLDB для проведения тестирования аналогичного типа, где каждый тест получает чистый экземпляр БД.
Я хотел принять ответы Free Wildebeest и Orion Edwards, но это не позволило мне. Причина, по которой я хотел это сделать, заключается в том, что я пришел к выводу, что это два основных способа сделать это, но какой из них выбрать, зависит от конкретного случая (в основном от размера базы данных).
Также запускайте тесты в разное время, чтобы они не влияли на производительность или достоверность друг друга.
Хотя это не так умно, как среда модульного тестирования Rails в одном из других ответов здесь, создание отдельных данных для каждого теста или группы тестов — это еще один способ сделать это. Уровень утомительной работы с этим решением зависит от количества имеющихся у вас тестовых случаев и от того, насколько они зависят друг от друга. Утомительно, если у вас есть одна база данных для каждого теста или группы зависимых тестов.
При запуске набора тестов вы сначала загружаете данные, запускаете набор тестов, выгружаете/сравниваете результаты, чтобы убедиться, что фактический результат соответствует ожидаемому. Если нет, повторите цикл. Загрузите, запустите набор, выгрузите/сравните.