Почему мои тесты направляющих являются настолько медленными?

Действительно ли нормально для моего набора тестов занять 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 секунды издержек по некоторым причинам. Я использую Тест:: Единица с Должна иметь.

8
задан ryeguy 6 April 2010 в 00:35
поделиться

2 ответа

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

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

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

11
ответ дан 5 December 2019 в 14:02
поделиться

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

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

    self.use_instantiated_fixtures = false

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

    self.use_transactional_fixtures = true

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

0
ответ дан 5 December 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: