2008-10-17 11 views
8

Por lo tanto, he comenzado a crear algunas pruebas de unidad de Ruby que usan Selenium RC para probar mi aplicación web directamente en el navegador. Estoy usando el Selenum-Client para ruby. Creé una clase base para todas mis otras pruebas de selenio para heredar.Selenium RC: ejecutar pruebas en navegadores múltiples automáticamente

Esto crea numerosas instancias de SeleniumDriver y se invoca a todos los métodos que faltan en cada instancia. Esto esencialmente ejecuta las pruebas en paralelo.

¿Cómo lo han automatizado otras personas?

Esta es mi aplicación:

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 

Esto funciona, pero si falla un navegador, toda la prueba falla, y no hay manera de saber qué navegador fracasó sucesivamente.

+1

Hola Daniel, Tengo una pregunta similar. Me preguntaba si puedes ayudar. [Selenium RC: Cómo lanzar pruebas interactivas con múltiples navegadores] (http://stackoverflow.com/questions/2836313/selenium-rchow-to-launch-interactive-testing-with-multiple-browsers) – onesith

Respuesta

4

¿Has probado Selenium Grid? Creo que crea un informe de resumen bastante bueno que muestra los detalles que necesita. Puedo estar equivocado, ya que no lo usé por bastante tiempo.

0

Descargo de responsabilidad: No es un experto en selenio.

¿Simplemente desea saber qué navegador falló, o desea ejecutar la prueba en todos los navegadores y luego informar el total de fallas cuando termina?

La primera es bastante simple si almacena los controladores mediante hash en su configuración. (Estoy seguro de que hay una manera pantalones de fantasía de hacer esto con Hash.inject, pero yo soy un vago.)

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

a continuación, cambiar su función básica de modificar excepciones para incluir el nombre del controlador que se utiliza , algo así como:

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

Debería acercarte.

+0

Buena idea, aunque falló las pruebas no necesariamente arrojan excepciones, creo. –

+0

En realidad, siempre deberían arrojar algún tipo de AssertionFailedException; pero esa cosa Grid debajo parece mega-slick. –

1

acabé modificando protocol.rb de selenio para elevar un AssertionFailedError tanto con el y el mensaje devuelto @browser_string del selenio RC si la respuesta no se inició con "OK". También modifiqué el método http_post para devolver todo el cuerpo de la respuesta y el method_missing para devolver una matriz de valores de retorno para emitir comandos get_X al Selenium RC.

Agregue este código al código en la pregunta y debería poder ver qué afirmaciones fallan en qué navegadores.

# 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 
Cuestiones relacionadas