Разница между усечением, транзакциями и стратегиями баз данных удаления

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

Другие вопросы по тегам