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

Мне очень нравится использовать Factory Girl для настройки тестов. Я умею выстраивать цепочки ассоциаций в одну строчку. Например:

Factory.create(:manuscript)

Автоматически создает журнал, владельца журнала, автора рукописи и т. д. Это позволяет мне сохранять мои блоки настройки очень простыми, и это фантастика.

Тем не менее, есть стоимость, конечно. Создание нескольких объектов в фоновом режиме означает, что мои модульные тесты иногда достигают 0,8 секунды. Это нормально, когда ваше приложение маленькое, но теперь у меня есть несколько сотен тестов, и мои спецификации выполняются более минуты (не считая времени, необходимого для запуска приложения). Это начинает чувствовать боль.

Я не особенно заинтересован в чем-то слишком резком, например, в издевательстве над всем. По крайней мере, пока мое приложение относительно небольшое, я хотел бы сохранить абстракции фабричной девушки. Я просто хочу найти способ заставить их работать немного быстрее.

Какие-либо предложения?


person Cory Schires    schedule 09.06.2011    source источник


Ответы (2)


Если вы тестируете поведение объектов и вам не нужно сохранять их в базе данных, вы можете использовать Factory.build(:model). Он в основном создает объект и его ассоциации, но не записывает его в БД. Это будет намного быстрее, чем создавать и хранить все эти объекты. Если вы все еще хотите записать некоторые или большинство объектов в БД, вы можете настроить тестовую базу данных памяти SQlite. Вот пример

person Peter Brown    schedule 09.06.2011
comment
Хм. Я знаю вариант сборки. Но, по моему опыту, это может вызвать проблемы, когда ваши тесты ожидают, что вещи будут связаны через идентификатор. Я немного поработаю с этим (а также с более многообещающим методом заглушки). Если выйдет что-то ценное, обязательно отпишусь. - person Cory Schires; 11.06.2011

Не уверен, что есть хорошее решение этой проблемы. Как предложил Бирлингтон, вы можете сэкономить время, используя Factory.build, а не Factory.create. Но даже это не так быстро, как тестирование обычных рубиновых объектов. Дело в том, что фабричная девушка — не лучший выбор, если вас очень волнует скорость.

Тем не менее, я смог добиться довольно значительных улучшений скорости, прочитав весь мой пакет и свободно используя rspec-set гем. Это позволяет вам запустить настройку один раз — и только один раз — для всей группы тестов. Это похоже на использование before(:all), за исключением того, что он использует транзакции для сброса состояния объектов между каждой спецификацией.

person Cory Schires    schedule 13.08.2011