Почему RSpec так медленно работает под Rails? - PullRequest
44 голосов
/ 16 сентября 2008

Всякий раз, когда я запускаю тесты rspec для моего приложения на Rails, уходит вечность и день, прежде чем он действительно запускает тесты. Почему rspec такой медленный? Есть ли способ ускорить начальную загрузку Rails или выделить ту часть моего приложения Rails, которая мне нужна (например, только материал ActiveRecord), чтобы он не загружал абсолютно все для запуска нескольких тестов?

Ответы [ 11 ]

32 голосов
/ 28 октября 2010

Я определенно предлагаю проверить spork.

http://spork.rubyforge.org/

В руководстве по железным дорогам конкретно рассматривается это и дается обходной путь для правильной работы spork в рельсах 3.0 (на данный момент spork - это не рельсы 3, готовые из коробки). Конечно, если вы не на рельсах 3.0, то вам нужно идти.

Часть учебника, показывающая, как запустить spork в рельсах 3.0

http://railstutorial.org/chapters/static-pages#sec:spork

Проверка готовности рельсов 3.0.

http://www.railsplugins.org/plugins/440-spork

22 голосов
/ 16 сентября 2008

Вы должны иметь возможность ускорить ваши script/spec вызовы, запустив script/spec_server в отдельном окне терминала, а затем добавив дополнительный параметр -X к своим вызовам спецификаций.

4 голосов
/ 12 ноября 2008

Я думаю, что вы ищете "дзен" для запуска spec_server и autospec в фоновом режиме, в результате чего вы получите почти мгновенные тесты при сохранении файла.

Однако у меня проблемы с установлением связи между этими двумя программами.

Я нашел объяснение здесь :

Я заметил, что автотест не отправляет команды spec_server. Вместо этого он перезагружает всю среду Rails и ваше приложение. плагины каждый раз, когда он выполняется. Это приводит к запуску автотеста значительно медленнее, чем сервер сценариев, потому что при запуске команда script / spec спецификации отправляются на сервер spec_server, который ваша среда Rails уже запущена и готова к работе. если ты случится установить новый плагин или что-то подобное, тогда вы будете необходимо перезапустить сервер spec_server.

Но как мы можем исправить эту проблему? Я предполагаю, что это потребует загрузки ZenTest и изменения кода для программы autotest, но у меня нет времени, чтобы попробовать это прямо сейчас.

4 голосов
/ 17 сентября 2008

потому что он загружает всю среду, загружает светильники и весь этот джаз.

Настоящий виновник в том, что если вы запускаете его, используя rake spec, , он запускает задачу db:test:prepare .

Эта задача удаляет всю тестовую базу данных и воссоздает ее с нуля. Это кажется мне смешным, но это то, что он делает (то же самое происходит, когда вы запускаете rake:test:units и т. Д.).

Вы можете легко обойти это, используя приложение spec, которое rspec устанавливает как часть гема rspec.

Как это:

cd railsapp
spec spec # run all specs without rebuilding the whole damn database
spec spec/models # run model specs only

cd spec
spec controllers/user* # run specs for controllers that start with user
4 голосов
/ 16 сентября 2008

Почему rspec такой медленный? , потому что он загружает всю среду, загружает приборы и весь этот джаз.

Есть ли способ ускорить начальную загрузку Rails , вы можете попробовать использовать mocks вместо того, чтобы полагаться на базу данных, это на самом деле правильно для модульного тестирования и определенно ускорит ваши модульные тесты. Кроме того, может помочь использование сервера спецификаций, упомянутого @ Скоттом Мэтьюманом , также как и в случае автотеста с zentest, упомянутого @ Marc-Andre Lafortune

Есть ли способ выделить ту часть моего приложения на Rails, которая мне нужна (например, только материал ActiveRecord), чтобы он не загружал абсолютно все для запуска нескольких тестов? что насчет

rake test:recent 

Я не уверен, как задача rspec интегрируется с этим, но вы определенно можете использовать тест: недавняя задача в качестве шаблона, чтобы сделать то же самое с тестами rspec, если.

rake test:rspec:recent

еще не существует

3 голосов
/ 16 сентября 2008

Запуск тестов может быть очень медленным, потому что должна загружаться вся среда rails (попробуйте скрипт / консоль), и только тогда все тесты могут быть запущены. Вы должны использовать autotest , который поддерживает загрузку среды и проверяет, какие файлы вы редактируете. Когда вы редактируете и сохраняете файл, автоматически и быстро будут выполняться только те тесты, которые зависят от них.

3 голосов
/ 16 сентября 2008

Вы запускаете это через Rails? Если так, то не медленная инициализация RSpec, а Rails '. Rails должен инициализировать всю кодовую базу и вашу перед запуском спецификаций. Ну, он не имеет , но это так. RSpec работает довольно быстро для меня в рамках моих небольших проектов, не связанных с рельсами.

2 голосов
/ 03 июня 2010

Основная причина в том, что по каким-то причинам требуются навсегда в Windows.

Советы по ускорению: Spork теперь работает с Windows, я считаю.

Вы можете попробовать "fast_require", которое кэширует местоположения:

http://github.com/rdp/faster_require

GL. -rp

2 голосов
/ 18 февраля 2010

Начиная с rspec-rails-1.2.7, spec_server устарел в пользу камня spork.

2 голосов
/ 16 сентября 2008

Если вы используете Mac, я рекомендую использовать Rspactor вместо автотеста, так как он использует гораздо меньше ресурсов для опроса измененных файлов, чем автотест. Существует как полная версия Какао

RSpactor.app

или версия гема, которую я поддерживаю на Github

sudo gem install pelle-rspactor

Хотя они не ускоряют отдельные тесты rspec, они чувствуют себя намного быстрее, поскольку автоматически запускают затронутые спецификации в течение секунды после того, как вы нажали save.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...