8

そこで、 Selenium RCを使用して Web アプリをブラウザーで直接テストする Ruby 単体テストの作成を開始しました。ruby にはSelenum-Clientを使用しています。他のすべてのセレン テストの継承元となる基本クラスを作成しました。

これにより、多数の SeleniumDriver インスタンスが作成され、欠落しているすべてのメソッドが各インスタンスで呼び出されます。これにより、基本的にテストが並行して実行されます。

他の人はこれをどのように自動化しましたか?

これは私の実装です:

class SeleniumTest < Test::Unit::TestCase
  def setup
    @seleniums = %w(*firefox *iexplore).map do |browser|
      puts 'creating browser ' + browser
      Selenium::SeleniumDriver.new("localhost", 4444, browser, "http://localhost:3003", 10000)
    end

    start
    open start_address
  end

  def teardown
      stop
  end

  #sub-classes should override this if they want to change it
  def start_address
    "http://localhost:3003/"
  end

  # Overrides standard "open" method
  def open(addr)
    method_missing 'open', addr
  end

  # Overrides standard "type" method
  def type(inputLocator, value)
    method_missing 'type', inputLocator, value
  end

  # Overrides standard "select" method
  def select(inputLocator, optionLocator)
    method_missing 'select', inputLocator, optionLocator
  end

  def method_missing(method_name, *args)
    @seleniums.each do |selenium_driver|
      if args.empty?
        selenium_driver.send method_name
      else
        selenium_driver.send method_name, *args
      end

    end
  end
end

これは機能しますが、1 つのブラウザーが失敗すると、テスト全体が失敗し、どのブラウザーで失敗したかを知る方法がありません。

4

4 に答える 4

4

Selenium Gridを試しましたか? 必要な詳細を示す非常に優れた要約レポートが作成されると思います。しばらく使っていないので間違っているかもしれません。

于 2008-10-19T20:20:46.893 に答える
1

応答が「OK」で始まらない場合、Seleniumのprotocol.rbを変更して、とSeleniumRCから返されたメッセージのAssertionFailedError両方でを発生させることになりました。@browser_stringhttp_postまた、応答本文全体を返すようにメソッドを変更し、method_missingget_XコマンドをSeleniumRCに発行するための戻り値の配列を返すように変更しました。

このコードを質問のコードに追加すると、どのブラウザーでどのアサーションが失敗するかを確認できるはずです。

# Overrides a few Driver methods to make assertions return the
# browser string if they fail
module Selenium
  module Client
    class Driver
      def remote_control_command(verb, args=[])
        timeout(default_timeout_in_seconds) do
          status, response = http_post(http_request_for(verb, args))
          raise Test::Unit::AssertionFailedError.new("Browser:#{@browser_string} result:#{response}") if status != 'OK'
          return response[3..-1]
        end
      end

      def http_post(data)
        http = Net::HTTP.new(@server_host, @server_port)
        response = http.post('/selenium-server/driver/', data, HTTP_HEADERS)
        #return the first 2 characters and the entire response body
        [ response.body[0..1], response.body ]
      end
    end
  end
end

#Modify your method_missing to use seleniums.map to return the
#results of all the function calls as an array
class SeleniumTest < Test::Unit::TestCase
  def method_missing(method_name, *args)
    self.class.seleniums.map do |selenium_driver|
      selenium_driver.send(method_name, *args)
    end
  end
end   
于 2008-10-21T08:00:41.923 に答える
0

すべてのテストを個別に処理する必要があります。したがって、1つのテストが失敗した場合、他のテストのテストが続行されます。phpunitとseleniumrcをチェックしてください

于 2009-11-17T16:28:33.350 に答える
0

免責事項: セレンの専門家ではありません。

どのブラウザーが失敗したかを知りたいだけですか、それともすべてのブラウザーでテストを実行し、完了したら失敗の合計を報告したいですか?

前者は、セットアップでハッシュによってドライバーを保存する場合、非常に単純です。(Hash.inject でこれを行うための派手な方法があると確信していますが、私は怠け者です。)

@seleniums = {}
%w(*firefox *iexplore).each do |browser|
  puts 'creating browser ' + browser
  @seleniums[browser] = Selenium::SeleniumDriver.new("localhost", 4444, browser, "http://localhost:3003", 10000)
end

次に、コア関数を変更して例外を変更し、使用されているドライバーの名前を含めます。たとえば、次のようになります。

@seleniums.each do |name, driver|
  begin
    driver.send method_name, *args
  rescue Exception => ex
    raise ex.exception(ex.message + " (in #{name})")
  end
end

あなたを近づけるはずです。

于 2008-10-19T14:17:46.750 に答える