Райан Бруннер дал много хороших советов.Все, что он сказал, в целом верно, но ко мне это не относится.
Я не упомянул Factory Girl, потому что не думал об этом упоминать (не спрашивай).Это оказалось очень важной деталью, потому что она отвечала за такие медленные тесты.
Просто полностью удалив Factory girl из тестов моего контроллера (я использовал Factory.build
), мне удалось их получитьс 50 секунд до примерно 5.
Причина в том, что Factory.build
вызывает Factory.create
для ассоциаций, что приводит к попаданию в базу данных ... так что если у вас много ассоциаций, это займет некоторое времясоздать новый объект модели.Но более того, в моем случае это составляло только 30-35% накладных расходов.Factory_girl тратила 65-70% своего времени на работу без базы данных.Я понятия не имею, почему, но после того, как все вызовы будут равны Factory.build
, на создание моих объектов уйдет совсем немного времени.Переход с базового MyClass.new
оказался НАМНОГО быстрее.
Весь мой набор тестов теперь занимает чуть менее 30 секунд вместо 90 секунд.Это увеличение скорости на 300% в целом за счет внесения этих изменений ... но когда дело дошло до испытаний контроллера, я получил увеличение скорости на 2000% - и я уже заглох!Все это было связано с Factory.build
!Вот откуда большинство преимуществ.
Конечно, я вернулся к своим моделям и использовал Factory.build
или просто MyClass.new
везде, где мог.
Я также добавил :default_strategy => :build
в factories.rb
тоже, когда я мог, чтобы Фабричная Девочка не попала в базу данных.Если вы спросите меня, это должно быть по умолчанию, так как в результате этого изменения произошел только 1 тест, но мне удалось получить 10 полных секунд из моих модельных тестов только за счет этого изменения.
Если выЕсли у вас возникли проблемы, как у меня, выполните следующие действия, и вы заметите улучшение скорости в 2-3 раза с небольшим недостатком.