Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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