2008-10-17 10 views
8

Quindi, ho iniziato a creare alcuni test di unità Ruby che utilizzano Selenium RC per testare la mia app Web direttamente nel browser. Sto usando il Selenum-Client per rubino. Ho creato una classe base per tutti i miei altri test sul selenio da cui ereditare.Selenium RC: Esegui test in più browser automaticamente

Questo crea numerose istanze SeleniumDriver e tutti i metodi che mancano vengono richiamati su ogni istanza. Questo essenzialmente esegue i test in parallelo.

Come altre persone lo hanno automatizzato?

Questa è la mia realizzazione:

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 

Questo funziona, ma se uno del browser non riesce, l'intera prova fallisce e non c'è modo di sapere quale browser non è riuscito a.

+1

Ciao Daniel, ho una domanda simile. Mi stavo chiedendo se puoi aiutare. [Selenium RC: Come avviare test interattivi con più browser] (http://stackoverflow.com/questions/2836313/selenium-rchow-to-launch-interactive-testing-with-multiple-browsers) – onesith

risposta

4

Hai provato Selenium Grid? Penso che crei una relazione riassuntiva piuttosto buona che mostri i dettagli di cui hai bisogno. Potrei sbagliarmi, perché non l'ho usato per un bel po '.

0

Disclaimer: Non un esperto di selenio.

Volete solo sapere quale browser non è riuscito, o volete eseguire il test su tutti i browser e quindi riportare i fallimenti totali quando è fatto?

Il primo è piuttosto semplice se si memorizzano i driver tramite hash nella configurazione. (Sono sicuro che c'è un modo di fantasia-pants di fare questo con Hash.inject, ma sono pigro.)

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

quindi modificare la funzione di base per modificare le eccezioni per includere il nome del driver in uso , qualcosa del tipo:

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

Dovresti farti chiudere.

+0

Buona idea, anche se fallita i test non generano necessariamente eccezioni, penso. –

+0

In realtà, dovrebbero sempre lanciare una sorta di AssertionFailedException; ma quella cosa Grid sotto sembra mega-slick. –

1

ho finito per modificare protocol.rb di selenio per sollevare un AssertionFailedError sia con il e il messaggio @browser_string tornato dal Selenio RC se la risposta non è iniziata con "OK". Ho anche modificato il metodo http_post per restituire l'intero corpo della risposta e lo method_missing per restituire un array di valori di ritorno per l'emissione di comandi get_X su Selenium RC.

Aggiungere questo codice al codice nella questione e si dovrebbe essere in grado di vedere quali affermazioni fallire su quale browser.

# 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

è necessario trattare tutti i test in modo indipendente. Quindi, se un test fallisce, continuerà a testare altri test. Partenza phpunit and selenium rc