Почему мои испытания на рельсах такие медленные? - PullRequest
8 голосов
/ 06 апреля 2010

Это нормально для моего набора тестов, чтобы занять 5 секунд только для запуска? Даже при запуске пустого пакета это все равно занимает много времени. Это потому, что он запускает новый экземпляр рельсов при каждом запуске? Если так, есть ли способ сохранить его постоянным?

Пример:

rlepidi@rlepidi:~/projects/rails/my_project$ time rake test
/usr/bin/ruby1.9.1 -I"lib:test" "/var/lib/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/unit/release_test.rb" 
Loaded suite /var/lib/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader
Started

Finished in 0.000181867 seconds.

0 tests, 0 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
0% passed

real    0m4.173s
user    0m3.820s
sys 0m0.288s

Как видите, этот пустой тест действительно быстрый, но по какой-то причине он все еще занимает 4 секунды. Я использую Test :: Unit с musta.

Ответы [ 3 ]

11 голосов
/ 06 апреля 2010

Узкое место скорости тестирования - это время, которое требуется Rails для загрузки среды. Запустите скрипт / консоль и посмотрите, сколько времени потребуется, чтобы загрузить вас в вашу среду ... оно должно быть таким же.

Если у вас достаточно большая кодовая база с множеством плагинов и гемов, время загрузки может достигать 1 минуты! Если вы похожи на меня и перестаете выполнять тесты, потому что вам надоело ждать 30 секунд, чтобы протестировать небольшое изменение, вам нужно запустить тестовый сервер, такой как spec_server, или даже лучше: spork!

Вы обнаружите, что могут быть странные проблемы, связанные с кэшированием классов с помощью spec_server, поэтому я предпочитаю spork.

1 голос
/ 05 мая 2011

У меня возникла та же проблема, и я решил ее, установив редакцию ruby ​​entreprise (REE). Я не знаю почему, но загрузка среды rails заняла 4-5 секунд под моим ruby ​​1.9.2 против 1-2 секунд с REE.

Я установил его с помощью RVM.

0 голосов
/ 06 апреля 2010

Сколько длится ваш тест? Обычно тесты Rails занимают много времени из-за доступа к базе данных. Чтобы ускорить их в качестве начального улучшения, вы можете:

  1. прекратите использование экземпляров светильников, установив:

    self.use_instantiated_fixtures = false

  2. начать использовать транзакционные устройства, установив:

    self.use_transactional_fixtures = true

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

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