#ruby-on-rails #unit-testing #rspec #factory-bot
#ruby-on-rails #модульное тестирование #rspec #factory-бот
Вопрос:
Мне действительно нравится использовать Factory Girl для настройки моих тестов. Я могу строить цепочки ассоциаций в одной строке. Например:
Factory.create(:manuscript)
Автоматически создает журнал, владельца журнала, автора рукописи и т.д. Это позволяет мне действительно упростить мои блоки настройки, и это фантастика.
Однако, конечно, есть свои издержки. Создание нескольких объектов в фоновом режиме означает, что мои модульные тесты иногда длятся до 0,8 секунды. Это нормально, когда ваше приложение маленькое, но теперь у меня есть несколько сотен тестов, и выполнение моих спецификаций занимает больше минуты (не считая времени, необходимого для запуска приложения). Это начинает причинять боль.
Меня не особенно интересует что-то слишком радикальное, например, издевательство над всем. По крайней мере, пока мое приложение относительно небольшое, я хотел бы сохранить свои абстракции factory girl. Я просто хочу найти способ заставить их работать немного быстрее.
Есть предложения?
Ответ №1:
Если вы тестируете поведение объектов и вам не нужно сохранять их в базе данных, вы можете использовать Factory.build(:model)
. В основном он создает экземпляр объекта и его ассоциации, но не записывает его в базу данных. Это будет намного быстрее, чем создание и хранение всех этих объектов. Если вы все еще хотите записать некоторые или большинство объектов в БД, вы можете настроить тестовую базу данных памяти SQLite. Вот пример
Комментарии:
1. Хм. Я знаю о опции сборки. Но, по моему опыту, это может вызвать проблемы, когда ваши тесты ожидают, что что-то будет связываться через ID. Я немного поработаю с этим (а также с более многообещающим методом «заглушки»). Если у меня получится что-нибудь ценное, я обязательно опубликую.
Ответ №2:
Не уверен, что есть хорошее решение этой проблемы. Как предложил Берлингтон, вы можете сэкономить некоторое время, используя Factory.build
вместо Factory.create
. Но даже это далеко не так быстро, как тестирование простых старых объектов ruby. Факт, похоже, в том, что factory girl — не лучший выбор, если вас очень беспокоит скорость.
Тем не менее, я смог добиться некоторых довольно значительных улучшений скорости, прочитав весь свой пакет и широко используя rspec-set gem. Это позволяет вам запустить вашу установку один — и только один-раз для всей группы тестов. Это похоже на использование before(:all)
, за исключением того, что оно использует транзакции для сброса состояния объектов между каждой спецификацией.