2008-10-17 7 views
8

Also habe ich begonnen, einige Ruby-Unit-Tests zu erstellen, die Selenium RC verwenden, um meine Web-App direkt im Browser zu testen. Ich benutze die Selenum-Client für Ruby. Ich habe eine Basisklasse für alle meine anderen Selentests erstellt, von denen ich erben kann.Selenium RC: Tests automatisch in mehreren Browsern starten

Dies erstellt zahlreiche SeleniumDriver-Instanzen und alle Methoden, die fehlen, werden für jede Instanz aufgerufen. Dies führt im Wesentlichen die Tests parallel durch.

Wie haben andere Leute das automatisiert?

Dies ist meine Implementierung:

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 

Dies funktioniert, aber wenn ein Browser ausfällt, der gesamte Test nicht und es gibt keine Möglichkeit zu wissen, welchen Browser sie gescheitert an.

+1

Hallo Daniel, ich habe eine ähnliche Frage. Ich habe mich gefragt, ob du helfen kannst. [Selenium RC: So starten Sie interaktive Tests mit mehreren Browsern] (http://stackoverflow.com/questions/2836313/selenium-rchow-to-launch-interactive-testing-with-multiple-browsers) – onesith

Antwort

4

Haben Sie versucht Selenium Grid? Ich denke, es schafft einen ziemlich guten zusammenfassenden Bericht, der Details zeigt, die Sie brauchen. Ich könnte mich irren, da ich es eine ganze Weile nicht benutzt habe.

0

Haftungsausschluss: Kein Selen-Experte.

Möchten Sie nur wissen, welcher Browser fehlgeschlagen ist, oder möchten Sie den Test über alle Browser ausführen und dann die gesamten Fehler melden, wenn dies erledigt ist?

Die erste ist ziemlich einfach, wenn Sie die Treiber durch Hash in Ihrem Setup speichern. (Ich bin sicher, dass es eine Phantasie-Hosen Art und Weise dies mit Hash.inject zu tun, aber ich bin faul.)

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

dann Ihre Kernfunktion ändern Ausnahmen zu ändern, den Namen des Fahrers aufzunehmen verwendet wird , etwas wie:

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

Sollten Sie in der Nähe.

+0

Gute Idee, obwohl fehlgeschlagen Tests werfen nicht unbedingt Ausnahmen, denke ich. –

+0

Eigentlich sollten sie immer irgendeine Art von AssertionFailedException werfen; aber das Grid-Ding unten sieht mega-glatt aus. –

1

beendet I Selen ist protocol.rb Modifikation bis zu einem zu erhöhen AssertionFailedError sowohl mit der @browser_string und der Nachricht vom Selenium RC zurückgegeben, wenn die Antwort nicht mit „OK“ gestartet wird. Ich änderte auch die http_post Methode, um den gesamten Antworttext zurückzugeben, und die method_missing, um ein Array von Rückgabewerten für die Ausgabe von get_X Befehlen an das Selenium RC zurückzugeben.

Fügen Sie diesen Code zu dem Code in der Frage hinzu, und Sie sollten in der Lage sein zu sehen, welche Assertionen in welchen Browsern fehlschlagen.

# 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 
0

Sie müssen jeden Test unabhängig voneinander behandeln. Wenn also ein Test fehlschlägt, wird er weitere Tests durchführen. Check out phpunit and selenium rc

Verwandte Themen