Тесты интеграции базы данных
Когда вы проводите интеграционные тесты, используя только уровень доступа к данным или большую часть стека приложений. Как лучше всего предотвратить конфликты нескольких тестов друг с другом, если они выполняются в одной базе данных?
6 ответов
Сделки.
Что делает фреймворк ruby on rails unit:
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 в одном из других ответов, приведенных здесь, создание отдельных данных для каждого теста или группы тестов является еще одним способом сделать это. Уровень утомительности с этим решением зависит от количества тестовых случаев и их зависимости друг от друга. Утомительность сохранится, если у вас есть одна база данных на тест или группа зависимых тестов.
При запуске набора тестов вы загружаете данные при запуске, запускаете набор тестов, выгружаете / сравниваете результаты, убеждаясь, что фактический результат соответствует ожидаемому результату. Если нет, повторите цикл снова. Загрузка, запуск комплекта, выгрузка / сравнение.