Разница между усечением, транзакциями и стратегиями баз данных удаления
В чем разница между стратегиями усечения, транзакций и удаления баз данных при использовании Rspec? Я не могу найти никаких ресурсов, объясняющих это. Я прочитал readme для Database Cleaner, но он не объясняет, что делает каждый из них.
Почему мы должны использовать стратегию усечения для капибары? Нужно ли чистить базу данных при тестировании или я могу ее отключить? Я не понимаю, почему я должен очищать свою базу данных после каждого теста, разве это не замедлит тестирование?
1 ответ
Стратегии очистки базы данных относятся к терминологии базы данных. Т.е. эти термины происходят из мира баз данных (SQL), поэтому люди, знакомые с терминологией баз данных, будут знать, что они означают.
Приведенные ниже примеры относятся к определениям SQL. DatabaseCleaner
однако поддерживает и другие типы баз данных, отличных от SQL, но, как правило, определения будут такими же или похожими.
делеция
Это означает, что таблицы базы данных очищаются с использованием SQL DELETE FROM
заявление. Это обычно медленнее усечения, но может иметь и другие преимущества.
сокращение
Это означает, что таблицы базы данных очищаются с использованием TRUNCATE TABLE
заявление. Это просто немедленно очистит таблицу, не удаляя саму структуру таблицы и не удаляя записи по отдельности.
Сделка
Это означает использование BEGIN TRANSACTION
заявления в сочетании с ROLLBACK
откатить последовательность предыдущих операций с базой данных. Думайте об этом как "кнопку отмены" для баз данных. Я бы подумал, что это наиболее часто используемый метод очистки, и, вероятно, самый быстрый, поскольку изменения не должны быть напрямую зафиксированы в БД.
Пример обсуждения: Rspec, Cucumber: наилучшая скорость очистки базы данных
Причина стратегии усечения с капибарой
Лучшее объяснение было найдено в самих документах на Капибару:
# Transactional fixtures do not work with Selenium tests, because Capybara
# uses a separate server thread, which the transactions would be hidden
# from. We hence use DatabaseCleaner to truncate our test database.
Требования к уборке
Вам не обязательно очищать базу данных после каждого теста. Однако вы должны знать о побочных эффектах, которые это может иметь. Т.е., если вы создадите, измените или удалите некоторые записи за один шаг, это повлияет на другие шаги?
Обычно RSpec запускается с включенными фиксациями транзакций, поэтому вы никогда не заметите этого при запуске RSpec - он просто будет автоматически поддерживать чистоту базы данных:
https://www.relishapp.com/rspec/rspec-rails/v/2-10/docs/transactions