Тесты на рейк работают очень медленно

После запуска некоторых тестов, я убежден, что с моей настройкой что-то не так (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

Время запуска, похоже, убивает вас, поэтому вы и я, вероятно, находимся в одной лодке. Между Джоделлом и Темным замком многое из этого уже охвачено, но вот мой почти полный список вещей, которые помогли в порядке убывания эффективности.

6 на самом деле не купил меня. Самое большое, что у нас было, было загрузка Thin безоговорочно (который втягивает Eventmachine, на котором установлено 21 мегабайт), но следующие 3 в стеке фактически использовались RSpec. Я не смотрел сетевой трафик, но Джоделл, вероятно, что-то там.