Вопрос по ruby, database – Разница между усечением, транзакциями и стратегиями баз данных удаления

39

В чем разница между стратегиями баз данных усечения, транзакции и удаления при использовании Rspec? Я не могу найти никаких ресурсов, объясняющих это. Я прочитал readme для Database Cleaner, но он не объясняет, что делает каждый из них.

Почему мы должны использовать стратегию усечения для капибары? Нужно ли чистить базу данных при тестировании или я могу ее отключить? Я не понимаю, почему я должен очищать свою базу данных после каждого тестового случая, не замедлит ли это тестирование?

Ваш Ответ

1   ответ
60

Стратегии очистки базы данных относятся к терминологии базы данных. То есть эти термины происходят из мира баз данных (SQL), поэтому люди, знакомые с терминологией баз данных, будут знать, что они означают.

Приведенные ниже примеры относятся к определениям SQL.DatabaseCleaner однако поддерживает и другие типы баз данных, отличных от SQL, но, как правило, определения будут такими же или похожими.

Deletion

Это означает, что таблицы базы данных очищаются с использованием SQLDELETE FROM заявление. Это обычномедленнее усечения, номожет иметь другие преимущества вместо.

Truncation

Это означает, что таблицы базы данных очищаются с помощьюTRUNCATE TABLE заявление. Это просто немедленно очистит таблицу, не удаляя саму структуру таблицы и не удаляя записи по отдельности.

Transaction

Это означает использованиеBEGIN TRANSACTION заявления в сочетании сROLLBACK откатить последовательность предыдущих операций с базой данных. Думайте об этом как "кнопка отмены" для баз данных. Я бы подумал, что это наиболее часто используемый метод очистки, и, вероятно, самый быстрый, так как изменения не должны быть напрямую зафиксированы в БД.

Пример обсуждения:Rspec, Cucumber: лучшая скорость очистки базы данных

Reason for truncation strategy with Capybara

Лучшее объяснение было найдено вСами капибары:

# 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.

Cleaning requirements

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

Обычно RSpec работает с включенными фиксациями транзакций, поэтому вы никогда не заметите этого при запуске RSpec - он просто будет автоматически поддерживать чистоту базы данных:

https://www.relishapp.com/rspec/rspec-rails/v/2-10/docs/transactions

Спасибо за ваше подробное объяснение. Это действительно многое объясняет. Ссылка на rspec-rails docs также чрезвычайно полезна. Я очень признателен вам за помощь :) Ibrahim Muhammad
Это не совсем так.deletion strategy на самом деле должен быть быстрее, чем усечение, потому что он выполняетсяDELETE FROM table вместоTRUNCATE TABLE table - так что он удаляет все записи, не делая такие вещи, как сброс последовательности.

Похожие вопросы