2008-11-27 4 views
1
>rails -v 
Rails 1.2.6 

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

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

>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 

Это рельсы с использованием базы данных MySql без каких-либо приспособлений. На этот раз он запустил 30 секунд + для запуска.

+0

в test_helper.rb добавить "self.use_transactional_fixtures = true", и вы можете удалить delete_all в настройке. Я знаю, что вы не используете приборы, но эта строка гарантирует, что после каждого тестового запуска БД устанавливается в исходное состояние. Обратите внимание, что он не удалит данные, которые уже есть. – 2008-11-27 14:12:03

+0

Вы используете окна? Я видел, что для загрузки рельсов env под окнами требуется 30 секунд, где один и тот же проект хотел бы 2 секунды на linux. – csexton 2008-11-29 16:44:23

+0

Да. действительно .. см. выход версии ruby ​​выше. i386-mswin32. – Gishu 2008-11-30 05:51:13

ответ

0

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

+0

Любые документы на этом ... также возникают проблемы с Rails. например Rails расширяет Test :: Unit с помощью некоторых настраиваемых материалов. Все работает нормально? – Gishu 2008-11-27 11:58:30

0

Запуск тестового модуля не особенно медленный, и нигде около 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

Рельсы. его тест модели Rails .. так что да, он попадает в базу данных. Но почти все время до Загруженных сообщений .. после этого тесты выполняются как в секунду или 2 – Gishu 2008-11-27 11:54:59

+0

И я на окнах;) – Gishu 2008-11-27 11:59:09

2

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

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

0

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

self.use_instantiated_fixtures = true 

[править]

Если установлено значение истинной настройки его ложной попытки.

0

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

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

require 'socket' 
Socket.do_not_reverse_lookup = true 

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

3

Посмотрите на это Rails Test Server.

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

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

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

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

1

камня инструмента в Ruby следует алгоритму обнаружения пути, который, по-видимому, не является Окна (как я вижу из вашего ruby -v) дружелюбные.

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

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