domingo, 24 de enero de 2010

Pruebas funcionales con Selenium

Selenium HQ es un framework que permite automatizar las pruebas funcionales sobre aplicaciones web. Está formado por varias herramientas que permiten definir estas pruebas y automatizarlas. En concreto, vamos a ver:
  • Selenium IDE: Se trata de un plugin de Firefox que permite definir una prueba de una aplicación web guardando en un script las acciones que ejecuta el usuario sobre el navegador. Este script puede volver a ejecutarse después todas las veces que se quiera.
  • Selenium RC (Remote Control): Permite automatizar las pruebas sobre las aplicaciones web a partir de los scripts definidos mediante Selenium IDE.
Veremos a continuación un ejemplo de prueba funcional de una aplicación web.

En primer lugar debemos descarganos el plugin de Firefox para Selenium IDE. Podemos hacerlo desde esta página. Esto descargará el plugin de Selenium IDE y lo instalará en el navegador. A continuación lo reiniciaremos para completar la instalación.

Ahora vamos a hacer una prueba de una aplicación web. En este caso se trata de una aplicación que guarda todos los artículos de interés de las revistas que voy comprando, y la prueba consistirá en introducir un nuevo artículo.

En primer lugar, vamos a Herramientas->Selenium IDE. Esto abre una ventana que permite grabar el script con la prueba a realizar:

A partir de este momento todo lo que hagamos sobre el navegador se registrará en el script. En este momento se introducirá un nuevo artículo de nombre “Nuevo” y título “Nuevo”. Una vez introducido, se pulsa sobre el botón rojo de la ventana de Selenium IDE para que pare la grabación del script. Comprobamos que se ha introducido el artículo.

Ahora repetimos la prueba pulsando sobre el triángulo verde situado arriba a la derecha de la ventana de Selenium IDE. Esto repite la ejecución anterior y por tanto, en el listado de artículos vemos que ahora existen 2 artículos de nombre “Nuevo”.

Podemos grabar esta prueba desde Archivo->Save Test Case. Sin embargo para nosotros será más interesante la opción Archivo->Export Test Case As ->Java (JUnit) Selenium RC que exportará este script a un caso de prueba de JUnit que vamos a utilizar posteriormente para automatizar esta prueba:
package com.example.tests;

import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;

public class Prueba extends SeleneseTestCase {
public void setUp() throws Exception {
setUp("http://change-this-to-the-site-you-are-testing/", "*chrome");
}
public void testPrueba() throws Exception {
selenium.open("/RevisteroMyFacesWeb/");
selenium.click("link=Nuevo Artículo");
selenium.waitForPageToLoad("30000");
selenium.type("j_id_jsp_815202587_1:nombreArticulo", "Nuevo");
selenium.type("j_id_jsp_815202587_1:descripcionArticulo", "Nuevo");
selenium.click("j_id_jsp_815202587_1:j_id_jsp_815202587_35");
selenium.waitForPageToLoad("30000");
}
}

Una vez definida la prueba vamos ahora a automatizarla. Para ello usaremos JUnit y la herramienta Selenium RC (Remote Control). También usaremos el plugin de Selenium para Maven, que permite arrancar el servidor de Selenium RC cuando se ejecutan las pruebas.

Creamos un proyecto de Maven con el siguiente pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.roldan</groupId>
<artifactId>RevisteroPruebasSelenium</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium.client-drivers</groupId>
<artifactId>selenium-java-client-driver</artifactId>
<version>1.0.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>selenium-maven-plugin</artifactId>
<executions>
<execution>
<phase>process-test-classes</phase>
<goals>
<goal>start-server</goal>
</goals>
<configuration>
<background>true</background>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

Vemos que además de configurar el plugin de Maven para Selenium para que arranque el servidor de Selenium en la fase anterior a la de test (process-test-classes), define dos dependencias, JUnit y el driver de cliente Java para Selenium, que permite ejecutar los tests creados desde Selenium IDE.

Vamos a adaptar la clase de test generada desde Selenium IDE para que haga uso del driver de Java para Selenium:
package com.roldan.selenium;

import com.thoughtworks.selenium.*;

public class CrearNuevoArticuloTest extends SeleneseTestCase {

protected DefaultSelenium createSeleniumClient(String url) throws Exception {
return new DefaultSelenium("localhost", 4444, "*firefox", url);
}

public void testCrearNuevoArticulo() throws Exception {
DefaultSelenium selenium = createSeleniumClient("http://localhost:8080/");
selenium.start();

selenium.open("/RevisteroMyFacesWeb/");
selenium.click("link=Nuevo Artículo");
selenium.waitForPageToLoad("30000");
selenium.type("j_id_jsp_815202587_1:nombreArticulo", "Nuevo");
selenium.type("j_id_jsp_815202587_1:descripcionArticulo", "Nuevo");
selenium.click("j_id_jsp_815202587_1:j_id_jsp_815202587_35");
selenium.waitForPageToLoad("30000");

selenium.stop();
}
}

La diferencia está en que ahora al comienzo de la prueba se crea un cliente de Selenium y al final de la prueba se cierra este cliente.

Si ahora se lanzan los test para este proyecto con mvn test, se verá aparecer un navegador que repite la prueba definida, y se habrá grabado otro artículo más.

Referencias:
Web de Selenium HQ
Turorial de Adictos al trabajo sobre Selenium IDE
Turorial de Adictos al trabajo sobre Selenium RC
Tutorial de Dos Ideas sobre tests secuenciales con Selenium y JUnit
Web del plugin de Selenium para Maven

9 comentarios:

  1. Muy Interesante, yo uso Selenium para realizar pruebas en Ruby, aunque tengo una duda.
    Visual Studio tiene una herramienta de analisis, con esta se pueden correr pruebas de conceptos para tu aplicacion, existe algo parecido para java??, la prueba que has corrido es mas que todo una prueba funcional y en su conjunto prueba _Unitaria, pero no te dice el performance ni nada por el estilo ... conoces de alguna??
    si puedes responderme arosasj1985 gmail com
    gracias

    ResponderEliminar
  2. Hola Abel,

    No conozco la herramienta de Visual Studio de la que hablas, y no sé a qué te refieres exactamente con prueba de concepto...

    Hablas después del performance. Si lo que quieres es hacer pruebas de rendimiento tal vez puedas usar JMeter. O alguna de las herramientas de profiling para Java, pero yo ahí no te puedo decir nada...

    ResponderEliminar
  3. Como integras Selenium con Sonar???

    ResponderEliminar
  4. Pues yo no he integrado Selenium con Sonar, aunque seguro que se puede.

    ResponderEliminar
  5. Para quien le interese un ejemplo básico para iniciar con Selenium IDE, pueden revisar en el siguiente link: http://automatizacion-testing.blogspot.com/2012/07/03-ejemplo-basico-usando-selenium-ide.html

    ResponderEliminar
  6. alguien sabe si es posible adjuntar imágenes a las pruebas automatizadas de Selenium tengo un formulario donde se cargan imágenes y al realizar la prueba con imágenes adjuntas en mi formulario me marca error alguien sabe como repararlo o que herramienta se debe implementar

    ResponderEliminar
    Respuestas
    1. si la imagen la cargas via sistema operativo. es imposible seguir la prueba con selenium. selenium no maneja ventanas del s.o.

      Eliminar
    2. si la imagen la cargas via sistema operativo. es imposible seguir la prueba con selenium. selenium no maneja ventanas del s.o.

      Eliminar
  7. alguien sabe si es posible adjuntar imágenes a las pruebas automatizadas de Selenium tengo un formulario donde se cargan imágenes y al realizar la prueba con imágenes adjuntas en mi formulario me marca error alguien sabe como repararlo o que herramienta se debe implementar

    ResponderEliminar