Почему Test :: Unit testcases запускаются так медленно? - PullRequest
1 голос
/ 27 ноября 2008
>rails -v
Rails 1.2.6

>ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]

Когда я запускаю тестовое устройство (которое тестирует класс модели рельсов), как это, требуется 20-30 секунд, чтобы начать выполнение этих тестов (показать «Loaded suite ...»). Что дает?

>ruby test\unit\category_test.rb

require File.dirname(__FILE__) + '/../test_helper'

class CategoryTest < Test::Unit::TestCase
    def setup
        Category.delete_all
    end
    def test_create
        obCategoryEntry = Category.new({:name=>'Apparel'})
        assert obCategoryEntry.save, obCategoryEntry.errors.full_messages.join(', ')
        assert_equal 1, Category.count

        assert_not_nil Category.find(:all, :conditions=>"name='Apparel'")
    end
    #.. 1 more test here
end

Это Rails, использующий БД MySql без фиксаторов. На этот раз он заработал 30 секунд + до запуска.

Ответы [ 7 ]

3 голосов
/ 01 декабря 2008

Взгляните на этот Rails Test Server .

Цитата от автора:

"Каждый раз, когда вы запускаете тест в Rails приложение, вся среда загружены, включая библиотеки, которые не переключаться между двумя последовательными прогонами. Это может занять значительное количество время. Что если бы мы могли загрузить один раз, и перезагрузите менять детали перед каждым пробегом? Представляем RailsTestServing.

С RailsTestServing время выполнения один тестовый файл ушел из 8 секунд до 0,2 секунды на моем компьютер. Это скорость х40 улучшение. Теперь я не думаю дважды перед нажатием ⌘R в TextMate. Это чувствует себя освобождающим! "

(Это было показано на подкасте Rails Envy на прошлой неделе, где я и нашел это.)

2 голосов
/ 27 ноября 2008

При запуске любых тестов Rails сначала загружает любые имеющиеся у вас приборы (в тесте / фикстурах) и воссоздает с ними базу данных.

20-30 секунд звучит очень медленно, хотя. У вас есть много приспособлений, которые необходимо загрузить перед выполнением тестов, или ваша база данных работает медленно?

1 голос
/ 15 декабря 2008

Инструмент gem Руби следует алгоритму обнаружения пути, который, по-видимому, не подходит для Windows (как я вижу из вашего ruby -v).

Вы можете получить четкое изображение, если проследите, например, загрузку приложения Rails с ProcMon . Каждый (я действительно имею в виду каждый ) require запускает сканирование всех каталогов в пути Ruby, а также всех каталогов gem. Типичный require занимает 20 мс на средней машине. Поскольку Rails составляет сотни require с, эти 20 мс легко суммируются до нескольких секунд при каждом запуске среды Rails. Потратьте время на инициализацию приборов в базе данных, и вы получите лучшее представление о том, почему для запуска тест-кейсов требуется столько времени.

Возможно, из-за каждой архитектуры и реализации файловой системы (кеширование путей и т. Д.), Это меньше проблем в Linux, чем в Windows. Я не знаю, кого ты должен винить, хотя. Похоже, что файловая система NTFS может быть улучшена за счет лучшей реализации кэширования пути, но очевидно, что инструмент gem может реализовывать само кэширование и иметь его производительность, не столь зависимую от платформы.

0 голосов
/ 27 ноября 2008

Полный выстрел в темноте, но большую часть времени я вижу длительное время запуска вещей, обычно это происходит из-за какого-то обратного поиска DNS, происходящего с некоторой связью TCP-сокета где-то по пути.

Попробуйте добавить:

require 'socket'
Socket.do_not_reverse_lookup = true

вверху вашего тестового файла после другой строки require.

0 голосов
/ 27 ноября 2008

Как выглядит ваш test_helper.rb? Вы используете инстанцированные светильники?

self.use_instantiated_fixtures  = true

[править]

Если для этого параметра установлено значение true, попробуйте установить значение false.

0 голосов
/ 27 ноября 2008

Запуск тестового модуля не особенно медленный и не более 20 секунд.

(11:39) ~/tmp $ cat test_unit.rb 
require 'test/unit'
class MyTest < Test::Unit::TestCase
  def test_test
    assert_equal("this", "that")
  end
end

(11:39) ~/tmp $ time ruby test_unit.rb 
Loaded suite test_unit
Started
F
Finished in 0.007338 seconds.

  1) Failure:
test_test(MyTest) [test_unit.rb:4]:
<"this"> expected but was
<"that">.

1 tests, 1 assertions, 1 failures, 0 errors

real    0m0.041s
user    0m0.027s
sys     0m0.012s

Вероятно, это то, что вы делаете в своих тестах. Вы делаете что-нибудь сложное? Настройка базы данных? Извлечение чего-то из интернета?

0 голосов
/ 27 ноября 2008

Кажется, что Test :: Unit - самый простой, но также и один из самых медленных способов выполнить юнит-тестирование с Ruby. Одной из альтернатив является ZenTest .

...