Лучшие практики FactoryGirl и DatabaseCleaner для всего набора тестов с использованием интеграционных и модульных тестов

У меня есть набор тестов Rails, в котором используются DatabaseCleaner, FactoryGirl и Capybara-Webkit. Все мои тесты проходят на моей машине при запуске пакета, в том числе при их параллельном запуске (parallel_rspec).

Когда я нажимаю на CI (circleci), я всегда получаю отказ в своих интеграционных тестах. Я подозреваю, что это потому, что я использую стратегию transaction в своих модульных тестах (контроллеры, сервисы, представления и т. д.). Возможно, это плохая практика, но если мне нужна модель в моем контроллере (например), я делаю FactoryGirl.create(:my_model). Но я подозреваю, что в каждом месте, где я использую FactoryGirl для создания модели, я также должен использовать в этом тесте стратегию truncation в DatabaseCleaner.

Я только что пометил весь свой пакет для использования truncation и переместил его в CI, и он стал зеленым, и это здорово, но теперь для запуска пакета требуется на 50% больше времени.

Итак, при создании экземпляров моделей ActiveRecord с FactoryGirl должен ли я ВСЕГДА отмечать эти тесты для использования truncation?

Спасибо за любой отзыв.


person Loading...    schedule 11.09.2016    source источник


Ответы (2)


Тесты, которые необходимо пометить для использования усечения (или удаления), — это тесты, которые обращаются к базе данных через несколько соединений. При использовании Capybara для функциональных тестов это, как правило, любые тесты с использованием драйвера, отличного от стоечного теста, поскольку они запускают приложение в отдельном потоке, который получает собственное соединение с базой данных и обрабатывается рекомендуемой конфигурацией database_cleaner — https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example (использование append_after для блока, запускающего очистку, очень важно)

Другие типы тестов, как правило, не создают несколько потоков или соединений, поэтому усечение обычно для них не требуется (и данные, необходимые в этих тестах, часто создаются с использованием метода FactoryGirl build_stubbed с find mocked для возврата объекта-заглушки и полного обхода базы данных. ).

Кроме того, если тесты проходят на вашей машине, они должны проходить на CI, поскольку я предполагаю, что вы используете тот же метод очистки базы данных на своей машине, что и на CI, поэтому я предполагаю, что это скорее проблема времени.

person Thomas Walpole    schedule 11.09.2016

Также с DatabaseCleaner, как только вы установите метод в контейнере CI, он будет установлен таким образом для всего запуска, поэтому рекомендуется запускать ваши модульные тесты в отдельном контейнере, чем тесты функций/системы.

person Jay    schedule 05.01.2018