Каков наилучший способ для тестирования дыма в рабочей среде в Rails? - PullRequest
15 голосов
/ 13 апреля 2011

Во-первых, настройка ...

В настоящее время я разрабатываю приложение Rails 3 для Mac OS X с использованием Ruby 1.8.7 MRI, запускаю тесты и локальную разработку для базы данных MySQL.У меня есть 3 «другие» нелокальные среды, которые мы используем в моей компании для каждого приложения, называемые dev, tqa и prod.Они выполняются в Tomcat с использованием JRuby (1.8.7) с Oracle в качестве бэкэнда.

Как видите, среды довольно разные, и мы столкнулись с некоторыми ошибками при развертывании в среде Oracle / JRuby.которые не существуют локально (например, обработка даты и указание схем по умолчанию в Oracle).

Мне нравится запускать что-то вроде Cucumber / Webrat / Capybara локально, чтобы поразить каждый URL, выставленный в приложении, чтобы убедиться, что основной материалработает (то есть, тест дыма).В идеале, он попадает в каждый URL-адрес и выполняет некоторые простые вещи, такие как ввод данных в формы, нажатие на кнопки и т. Д.

В идеале, когда я развертываю в dev / tqa, я запускаю нечто подобное, кромеразвернутое приложение вместо локального приложения.Кажется, что Cucumber оптимизирован для работы с локально работающим приложением и хорошо интегрируется с Rails, но не может работать с тем, что является «внешним» приложением (или, по крайней мере, я не могу найти простой способ, который действительно работает).

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

Что-тоЯ думаю, что можно использовать Selenium, но мне бы очень хотелось просто запустить задачу с граблями и получить результаты, как я это сделал с Cucumber.

Есть ли способ Rails / Ruby, позволяющий это сделать?или все остальные просто накатывают свое собственное решение, используя wget или Selenium?

Аналогичный вопрос был задан здесь: Автоматическое тестирование дыма на всех веб-страницах приложения после развертывания

Я не уверен, что вопрос именно в том, что я имею в виду.

Ответы [ 2 ]

7 голосов
/ 31 мая 2014

Да, вы можете писать тесты дыма с помощью Cucumber и Capybara и запускать их на удаленных серверах.Я сделал это, и это работает.Я также сделал curl / wget и т.п. в некоторых проектах, но Cucumber + Capybara позволяет вам взаимодействовать со страницами (даже теми, которые используют Javascript), а не просто очищать их.

  • Напишите свои тесты, чтобы они не нуждались в очистке после себя или делали это так, чтобы это было безопасно в производственной базе данных.Они не могут использовать DatabaseCleaner.(Чтобы предотвратить несчастные случаи, поместите тесты в их собственный проект с Gemfile, который не содержит DatabaseCleaner.) Поскольку дымовые тесты будут выполняться на удаленном сервере и, следовательно, не могут использовать транзакции для очистки, они также не должны изменятьбазы данных или должны специально удалять только те объекты, которые они создают.
  • Set Capybara.app_host = "http://your-server.yourco.com"
  • Set Capybara.run_server = false (не требуется, но нет смысла запускать локальный сервер, который вы не будетеuse)
  • Если ваши тесты модифицируют базу данных, настройте среду тестовой базы данных на среду, которую вы хотите курить.
  • Разверните и протестируйте.
5 голосов
/ 13 апреля 2011

Один из способов побить ваше приложение, чтобы увидеть, не взорвалось ли оно, - это получить список запросов GET из файла журнала вашего производственного веб-сервера и передать их в программу, подобную curl или wget, которая будет их извлекать. все как можно быстрее.

Вот простой пример:

#!/usr/bin/env ruby
# rerun

require 'uri'

def extract_from_log(base_uri, log_path)
  File.open(log_path) do |log|
    while (line = log.gets)
      if (line.match(%r{"GET (/\S+) HTTP/\d\.\d"}))
        uri = URI.join(base_uri, $1)
        puts uri.to_s
      end
    end
  end
end

base_uri, log_path = ARGV

if (base_uri and log_path)
  extract_from_log(ARGV[0], ARGV[1])
else
  puts "Usage: #{File.basename($0)} <base_uri> <log_path>"
  exit(-1)
end

При наличии стандартного файла веб-журнала со строками, соответствующими "GET /... HTTP/1.1", вы можете легко извлечь пути, но необходимо указать базовый URI:

rerun http://example.com/ example.log

Будет выведен список всех URL-адресов, найденных в этом файле журнала. Вы можете передать это wget для извлечения:

rerun http://example.com/ example.log | wget -i -

Если вы что-то сломали, вы начнете получать ошибки в своем приложении, и с надлежащей системой уведомлений вы сможете их отлавливать и отслеживать.

...