Как я могу проводить более быстрые тесты и при этом использовать Factory Girl?

#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) , за исключением того, что оно использует транзакции для сброса состояния объектов между каждой спецификацией.