Ответ 1
Стратегии очистки базы данных относятся к терминологии базы данных. То есть эти термины исходят из мира базы данных (SQL), поэтому люди, обычно знакомые с терминологией базы данных, будут знать, что они означают.
Примеры ниже относятся к определениям SQL. DatabaseCleaner
однако поддерживает другие типы баз данных, отличных от SQL, но в целом определения будут такими же или похожими.
Удаление
Это означает, что таблицы базы данных очищаются с помощью инструкции SQL DELETE FROM
. Обычно это медленнее, чем усечение, но может иметь другие преимущества.
Усечение
Это означает, что таблицы базы данных очищаются с помощью оператора TRUNCATE TABLE
. Это просто сразу очистит таблицу, не удаляя сама структуру таблицы или не удаляя записи отдельно.
Транзакция
Это означает использование операторов BEGIN TRANSACTION
в сочетании с ROLLBACK
для отката последовательности предыдущих операций с базой данных. Подумайте об этом как о "кнопке отмены" для баз данных. Я бы подумал, что это наиболее часто используемый метод очистки и, вероятно, самый быстрый, поскольку изменения не обязательно должны быть непосредственно привязаны к БД.
Пример обсуждения: Rspec, Cucumber: лучшая скорость очистки базы данных
Причина стратегии усечения с Capybara
Лучшее объяснение было найдено в Документах 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.
Требования к очистке
Вам не обязательно очищать вашу базу данных после каждого теста. Однако вам нужно знать о побочных эффектах, которые это могло бы иметь. То есть если вы создадите, измените или удалите некоторые записи за один шаг, будут ли затронуты другие действия?
Обычно RSpec запускается с включенными протоколами транзакций, поэтому вы не заметите этого при запуске RSpec - он просто сохранит базу данных автоматически для вас:
https://www.relishapp.com/rspec/rspec-rails/v/2-10/docs/transactions