Интеграционные тесты базы данных

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


person Garry Shutler    schedule 14.09.2008    source источник


Ответы (6)


Сделки.

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

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

person Orion Edwards    schedule 14.09.2008

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

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

person Free Wildebeest    schedule 14.09.2008

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

person Bradley Harris    schedule 16.09.2008

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

person Garry Shutler    schedule 14.09.2008
comment
Я всегда нахожу, что проблема в stackoverflow. Это проблема выбора, когда ты действительно хочешь сказать, что оба хороши. Я предполагаю, что если оба варианта одинаково полезны, то за них проголосуют с одинаковым числом голосов, так что оставайтесь на вершине. Пусть люди решают :) - person Free Wildebeest; 15.09.2008

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

person Techboy    schedule 15.09.2008

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

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

person Community    schedule 18.09.2008