Почему test: unit и test: функционалы настаивают на том, чтобы работать в среде разработки? - PullRequest
11 голосов
/ 13 июня 2009

Я пытаюсь протестировать некоторые параметры среды (промежуточное программное обеспечение, но это не имеет значения), но у меня возникают проблемы с запуском тестов в правильной среде. Симптомы:

  • Если я запускаю ruby test/unit/my_test.rb, все в порядке, потому что первое, что он делает, это требует test/test_helper.rb, который устанавливает среду на "test", а затем загружает среду Rails.
  • Если я запускаю rake test, первая партия (функционалы) работает нормально, но вторая партия (единицы) дает сбой. Ошибка в том, что ENV['RAILS_ENV] каким-то образом сбрасывается между пакетами, тогда config/environment.rb видит, что ни один не установлен, и использует значение по умолчанию "development". Среда верна в начале config/environment.rb и в начале блока конфигурации в этом файле, но к концу неверна. Я могу сказать, используя puts или удалив config/development.rb, заставляя его не найти файл.
  • Если я запускаю rake test:units, я получаю ту же проблему, что и вторая партия rake test (то есть, все отказывают)
  • Если я запускаю rake test:functionals, я получаю то же, что и для rake test:units
  • Если я запускаю rake test RAILS_ENV=test или rake test:units RAILS_ENV=test или rake test:functionals RAILS_ENV=test, все в порядке!

Одна вещь, которую я попробовал, которая не работает вообще, это следующее:

# in Rakefile:
task :set_test_env { ENV['RAILS_ENV'] = 'test' }
Rake::Task[:test].prerequisites.unshift :set_test_env
# and similarly for other test tasks

Я даже пытался создать отдельную из этих :set_test_env задач для каждой тестовой задачи , так что я был уверен, что она будет вызываться перед каждым, а не один раз. Все еще нет игры в кости. вызывается , и в начале config/environment.rb среда корректна, но внутри что-то идет не так.

У меня нет вызовов для установки ENV['RAILS_ENV'] в моем коде.

Ответы [ 5 ]

5 голосов
/ 04 августа 2009

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

Прежде всего rake test и все остальные варианты (test:units, test:functionals и т. Д.) Работают следующим образом

  1. Rake-процесс вызывается, и задача test выполняется в текущей среде (которая по умолчанию разрабатывается), поэтому development.rb всегда читается.
  2. Задача Rake вызывает загрузчик теста в отдельном дочернем процессе (вы можете проверить это с помощью ps или pstree), здесь источник test_helper.rb получен, а для среды установлено значение тест.

Когда вы запускаете ruby test/unit/my_test.rb, первый шаг пропускается, поэтому, похоже, проблема в этом. Может быть, вы делаете что-то в development.rb, что имеет побочные эффекты для подпроцесса?

2 голосов
/ 17 июня 2010

Я почти всегда хочу, чтобы мои тесты запускались сами по себе и их предпосылки в «тестовой» среде, особенно когда для ENV ['RAILS_ENV'] установлено любое из стандартных значений по умолчанию (чтобы избежать катастрофических аварий), но я также хотите иметь возможность запускать тесты, скажем, в среде с именем "v_2_0_maint_test" или что-то в этом роде, вызывая rake test:units RAILS_ENV=v_2_0_maint_test в командной строке.

Итак, у меня есть файл test_tasks.rake, который добавляет предварительное условие к каждой интересующей меня задаче теста. Поскольку это предварительное условие добавлено, любые другие предварительные условия (например, db: test: prepare, db: fixtures: load ) работать в той же среде. Это означает, что оно влияет только на те тесты, которые вы хотите повлиять, и на их предварительные условия.

namespace :test do |n|
  [ n[:units], n[:functionals], n[:integration] ].each do |t|
    t.prerequisites.unshift(:set_test_env_dammit)
  end

  task :set_test_env_dammit do |t|
    if [ nil, "", "development", "staging", "production" ].index ENV['RAILS_ENV']
      RAILS_ENV = "test"
    end
  end
end
0 голосов
/ 30 июля 2009

Поиск по всему вашему проекту RAILS_ENV и его вариантов. Посмотрите, установите ли вы его где-нибудь в своем приложении или в своих тестах.

Кроме того, на какой платформе вы работаете? Можете ли вы запустить тесты на другом компьютере и посмотреть, совпадают ли результаты?

Если это относительно недавняя разработка, и вы используете RCS, такой как Git или SVN, вам следует просмотреть последние коммиты, а если вы специально используете Git, вы должны изучить git bisect. Если вы не используете RCS, вам следует.

Если это действительно новая проблема приложения, то, вероятно, это проблема вашей среды.

Какие плагины и гемы вы установили / настроили? Можем ли мы увидеть обратный след?

0 голосов
/ 31 июля 2009

Я на самом деле не верю, что у вас есть проблема здесь вообще. Я полагаю, что в какой-то момент вы заметили, что ваша задача rake действительно затрагивает среду разработки, и вы начали пытаться понять, почему это так. Затем вы добавили строку в файле конфигурации разработки, чтобы вызвать исключение, и именно поэтому ваши тесты рейка не пройдены.

Если вы удалите строку, которая вызывает исключение, то вы можете обнаружить, что все тесты выполнены успешно.

Если вы попробуете следующее, вы можете обнаружить, что это объясняет проблему.

  1. Настройка среды разработки (только для целей трассировки)

    export RAILS_ENV = разработка

  2. Удалить все строки, которые искусственно поднять исключения в вашей среде файлы.
  3. Добавить следующую строку в конец каждый файл в конфигурации / средах

    puts "**** In #{ENV['RAILS_ENV']} environment config ****"
    
  4. Добавьте следующую строку в test / test_helper.rb чуть ниже строки, задающей среду для тестирования.

    puts "**** Loading test helper **** Environment = #{ENV['RAILS_ENV']}"
    
  5. Запустите rake, используя опцию trace, чтобы наблюдать за выполнением задач с трассировкой текущей активной среды.

    rake -t test
    
  6. Проверьте вывод, чтобы определить, где ваша среда настроена неправильно.
  7. Запустите тесты снова, но на этот раз установите среду непосредственно перед запуском тестов, используя

    export RAILS_ENV = тест

Если у вас действительно есть проблема, то, возможно, вы должны опубликовать вывод rake -t с кодом трассировки в.

Это результат моих тестов в новом проекте с минимальным количеством тестов. Вы заметите, что перед выполнением реальных тестов среда всегда «тестирует»

** Invoke test (first_time)
** Execute test
** Invoke test:units (first_time)
** Invoke db:test:prepare (first_time)
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment (first_time)
** Execute environment
**** In development environment config ****
** Execute db:abort_if_pending_migrations
** Execute db:test:prepare
** Invoke db:test:load (first_time)
** Invoke db:test:purge (first_time)
** Invoke environment
** Execute db:test:purge
** Execute db:test:load
** Invoke db:schema:load (first_time)
** Invoke environment
** Execute db:schema:load
** Execute test:units
**** Loading test helper **** Environment = test
**** In test environment config ****
Loaded suite /Library/Ruby/Gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
.
Finished in 0.071771 seconds.

1 tests, 1 assertions, 0 failures, 0 errors
** Invoke test:functionals (first_time)
** Invoke db:test:prepare
** Execute test:functionals
**** Loading test helper **** Environment = test
**** In test environment config ****
Loaded suite /Library/Ruby/Gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
.....
Finished in 0.133776 seconds.

5 tests, 6 assertions, 0 failures, 0 errors
** Invoke test:integration (first_time)
** Invoke db:test:prepare
** Execute test:integration
0 голосов
/ 14 июня 2009

В верхней части файла test_helper.rb у меня есть код

ENV["RAILS_ENV"] = "test"

Если у вас нет этой строки, тогда проблема системы будет запускаться в среде по умолчанию (т.е. разработка).

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