15

まず、セットアップ...

現在、Ruby 1.8.7 MRI を使用して Mac OS X で Rails 3 アプリケーションを開発しており、MySQL データベースに対してテストとローカル開発を実行しています。私の会社では、dev、tqa、および prod と呼ばれるすべてのアプリケーションに使用する 3 つの「その他の」非ローカル環境があります。これらは、Oracle をバックエンドとする JRuby (1.8.7) を使用して Tomcat で実行されます。

ご覧のとおり、環境はまったく異なります。ローカルに存在しない Oracle/JRuby 環境への展開でいくつかのバグに遭遇しました (Oracle での日付処理やデフォルト スキーマの指定など)。

Cucumber/Webrat/Capybara のようなものをローカルで実行して、アプリで公開されているすべての URL にアクセスし、基本的な機能 (スモーク テスト) が機能していることを確認するのが大好きです。理想的には、すべての URL にヒットし、フォームへのデータの入力やボタンのクリックなどの簡単なことを実行します。

理想的には、dev/tqa にデプロイするときに、ローカル アプリケーションではなくデプロイされたアプリを指すことを除いて、同様のものを実行します。Cucumber は、ローカルで実行されているアプリケーションにヒットするように最適化されているようで、Rails とうまく統合されていますが、完全に「外部」アプリケーションであるものに対して実行することはできません (少なくとも、実際に機能する簡単な方法を見つけることができません)。

また、prod にデプロイするときは、現在の運用データベースの状態を変更しない (つまり、単に URL を取得する) ことを除いて、同様の一連のスモーク テストを実行したいと考えています。

Selenium のようなものを使用できると思いますが、私は単に rake タスクを実行して、Cucumber の場合と同じように結果を取得したいと思っています。

これを行うためのRails/Rubyの方法はありますか、それともwgetまたはSeleniumを使用して独自のソリューションを展開するだけですか?

同様の質問がここで尋ねられました:デプロイ後にアプリケーション内のすべての Web ページを自動的にスモーク テストする

ただし、その質問が私が考えていることとまったく同じかどうかはわかりません。

4

2 に答える 2

5

アプリケーションが爆発するかどうかを確認する簡単な方法の 1 つは、実稼働 Web サーバーのログ ファイルから GET 要求のリストを取得し、それらをcurlorのようなプログラムにフィードして、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

行が一致する標準の Web ログ ファイルが"GET /... HTTP/1.1"あれば、パスを簡単に抽出できますが、ベース URI を提供する必要があります。

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

これにより、そのログ ファイル内で見つかったすべての URL が一覧表示されます。wgetフェッチの目的でこれをパイプすることができます:

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

何かを壊すと、アプリケーションでエラーが発生し始めます。適切な通知システムを使用すると、これらをキャッチして追跡することができます。

于 2011-04-13T15:19:09.507 に答える