Тесты интеграции баз данных - PullRequest
10 голосов
/ 15 сентября 2008

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

Ответы [ 6 ]

10 голосов
/ 15 сентября 2008

Сделки.

Что делает фреймворк 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. Это примерно в миллион раз быстрее, чем вручную загружать данные для каждого теста.

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

9 голосов
/ 15 сентября 2008

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

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

1 голос
/ 16 сентября 2008

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

0 голосов
/ 18 сентября 2008

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

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

0 голосов
/ 15 сентября 2008

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

0 голосов
/ 15 сентября 2008

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

...