Тесты на рейк работают очень медленно
После запуска некоторых тестов, я убежден, что с моей настройкой что-то не так (windows, rubyine и последние версии ruby). Мои времена сейчас:
Finished tests in 14.289817s, 0.0700 tests/s, 0.3499 assertions/s.
1 tests, 5 assertions, 0 failures, 0 errors, 0 skips
Process finished with exit code 0
С 5 ОЧЕНЬ легкими тестами (просто проверяйте, работает ли проверка на пустых полях). Общее время для этих 5 модульных тестов составляет 160 секунд, более 2 минут.
Что я могу сделать, чтобы улучшить эту скорость?
Вот тесты:
require 'test_helper'
class ItemTest < ActiveSupport::TestCase
test 'item attributes must not be empty' do
item = Item.new
assert item.invalid?
assert item.errors[:name].any?
assert item.errors[:description].any?
assert item.errors[:image_url].any?
assert item.errors[:rating].any?
end
end
Ответы
Ответ 1
Ваша проблема - Windows. Мы используем JRuby в Windows, и на самом деле он работает быстрее, чем RubyInstaller (mingw) ruby в Windows, но мы видим очень медленные результаты при запуске наборов тестов или запуске сервера rails. Около 1 минуты для одного тестового запуска из-за загрузки среды Rails.
У вас есть несколько вариантов:
- Переключиться на linux/osx
- Используйте spork, чтобы сохранить пару рельсов, предварительно загруженных для ваших тестов. Обратите внимание, что это не идеально, но это существенно сократит ваше время. С помощью этой опции вы, вероятно, захотите использовать minitest или rspec, мне не удалось заставить spork работать в Windows с помощью testunit. С помощью spork вы сможете получить одно время тестового запуска примерно до 10 секунд.
- Запишите как можно больше ваших тестов за пределами Rails, другими словами, чтобы не требовать стека Rails. Это будет очень быстро, вы сможете запустить тест всего за несколько секунд, но, как вы могли догадаться, трудно проверить множество вещей (контроллеров, просмотров) за пределами рельсов. Работает отлично, хотя для функций, которые вы выработали в модулях, которые уже ничего не требуют от рельсов.
Удачи!
Ответ 2
Что остальная часть вашего драгоценного камня? Иногда сторонние драгоценные камни инициализируются рельсами и будут пытаться позвонить домой (New Relic, Airbrake), которые могут раздуть ваши тестовые времена (хотя, вероятно, и не так). Если что-то не требуется строго для вашего тестового набора, вы должны попытаться потянуть его в нужную группу env или установить require :false
через bundler:
group :production do
gem 'newrelic_rpm'
end
Ответ 3
Время запуска, похоже, убивает вас, поэтому вы и я, вероятно, находимся в одной лодке. Между Джоделлом и Темным замком многое из этого уже охвачено, но вот мой почти полный список вещей, которые помогли в порядке убывания эффективности.
- Получите исправленную версию 1.9.3 с обновлением файловой системы 2.0. Первый получает 2x лучшие числа, но я использую второе, потому что я чувствовал, что первое было неустойчивым
- Задайте параметры GC
- Отключите сбор данных о покрытии (моя IDE продолжала волонтерство)
- Запустите Spork и
set SPEC_OPTS=--drb
- Отключить антивирусный сканер (на самом деле это не так, для меня это всего 10%).
- Дважды проверьте свои драгоценные камни, задерживая загрузку драгоценных камней с требованием: false
6 на самом деле не купил меня. Самое большое, что у нас было, было загрузка Thin безоговорочно (который втягивает Eventmachine, на котором установлено 21 мегабайт), но следующие 3 в стеке фактически использовались RSpec. Я не смотрел сетевой трафик, но Джоделл, вероятно, что-то там.