Grabación de pruebas con Selenium y JUnit

RECU-0385 (Recurso Ejemplo)

Introducción

La combinación JUnit + Selenium permite automatizar pruebas sobre aplicaciones web de una forma fácil e intuitiva:

  • Selenium IDE es un plugin para firefox, que permite la grabación en dicho navegador.
  • JUnit es una herramienta que permite extender las pruebas grabadas con Selenuim IDE para que puedan ser ejecutadas con cualquier navegador.

Descripción

Paso a paso

Preparación del entorno

Si se va a testear un proyecto en desarrollo, ya se dispondrá de un entorno montado en cualquier IDE y sólo habría que añadir la carpeta test, si no existe.

Si se van a desarrollar test para un proyecto desarrollado por terceros, y por lo tanto, no se dispone del entorno, bastará con crear un proyecto Maven usando el archetype por defecto. La estructura básica de un proyecto Maven, es la siguiente:

Estructura básica de un proyecto MavenEstructura básica de un proyecto Maven

Habrá que revisar el pom.xml para incluir las siguientes dependencias:

<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version><versión></version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.Seleniumhq.Selenium.client-drivers</groupId>
            <artifactId>Selenium-java-client-driver</artifactId>
            <version><versión></version>
            <scope>test</scope>
        </dependency>

Por otro lado, para lanzar las pruebas es necesario ejecutar el servidor de Selenium, que es el que se va a encargar de ejecutar las órdenes que se le indiquen a través de las pruebas grabadas. Para ello se descarga de la página oficial el Selenium RC, simplemente hay que localizar el fichero “selenium-server.jar” y arrancarlo con “java -jar selenium-server.jar”.

Creación de los test con Selenium IDE

Para realizar la grabación con Selenium se debe tener en cuenta si la grabación será automática o manual, y elegir de forma adecuada los identificadores de los elementos de la interfaz que intervienen. Además deben de tenerse en cuenta cuales son las limitaciones de Selenium y solventarlas en la medida de lo posible. Para conocer mas datos Pinchar aquí.

Exportación de los test a JUnit

Hay que seleccionar en la pestaña Source, el valor Java (JUnit) - Selenium RC, tal y como muestra la siguiente figura:

Exportación a JUnitExportación a JUnit

La exportación no es directa y hay cosas que habrá que adaptar para que funcionen correctamente. Las comprobaciones a tener en cuenta a la hora de exportar los tests son:

  • Empaquetado: comprobar que la declaración “package” es coherente con la estructura de directorios sobre la que se está montando la prueba JUnit.
  • Nombre de la clase: es muy importante que el nombre de los métodos que se vayan a ejecutar al lanzar la clase como test JUnit comiencen con la palabra “test”, de no ser así dichos métodos no serán lanzados.

A la hora de generar los test con Selenium-IDE y exportarlos a un proyecto JUnit hay que tener en cuenta una serie de buenas prácticas que debemos llevar a cabo:

  • Una clase por funcionalidad: no crear una clase que haga todas las pruebas, lo recomendable tener una clase por funcionalidad a probar y en ella tener varios métodos que realicen los diferentes pasos de las pruebas. De esta manera el mantenimiento de las pruebas es mucho más sencillo.
  • Reutilización de código: cuando se detecten pasos o pruebas que se pueden repetir en varios test, se deben sacar a una clase para que estén disponibles para el resto de clases. (Por ejemplo, un método que sea adjuntar un fichero y que se utilice tanto al dar de alta un formulario, como al añadir un comentario a un elemento).
  • Localizadores: es buena práctica definir los identificadores en un fichero al que todas las clases tengan acceso, de esta manera si uno de ellos cambia, sólo es necesario actualizar un fichero fuente y no todas las pruebas en las que interviene. Se debe organizar y agrupar los localizadores, por ejemplo por ventanas, haciendo así más fácil la búsqueda de los mismos.
  • Parametrización: puesto que las pruebas se van a ejecutar en entornos diferentes, puede ser muy útil hacer uso de los perfiles de Maven. Así se podrá definir diferentes perfiles con las url de acceso y usuarios/contraseñas para cada entorno a certificar.
  • Uso del log: si en un desarrollo es muy importante el buen uso del log de la aplicación, en las pruebas lo es mucho más ya que es la mejor manera de poder conocer los resultados de las pruebas. Por ello es aconsejable informar a través del log de los pasos que se van ejecutando, cuales pasan las pruebas correctamente y cuales no, para luego identificar rápidamente la funcionalidad que falla.

Ejecución de los test

En el proyecto Java donde se hayan exportado las pruebas JUnit debe crearse una nueva clase para el Test Suite, en la que se definan las diferentes pruebas a ejecutar. En este caso, existen al menos dos formas de ejecutar las pruebas:

  • Lanzar el Test Suite configurado y consultar los log tras la ejecución para comprobar el resultado de todos los test pasados.
  • Usar el entorno de desarrollo utilizado para implementar las pruebas.

Preguntas frecuentes

Tengo una prueba grabada en Selenium IDE ¿cómo la paso a un test de JUnit?

El primer paso es en Selenium IDE obtener el código de la prueba en el formato adecuado. Para ello en el menú “Options”, “Format” se elige la opcion “Java (JUnit) – Selenium RC”. Aparecerá en la pestaña “Source” el código en lenguaje Java preparado para copiarlo y crear el test de JUnit.

Al pasar la prueba de Selenium IDE a JUnit han aparecido instrucciones nuevas.

Es normal, hay instrucciones en Selenium IDE que se traducen en dos o más instrucciones en Java, así que es normal que aparezcan más instrucciones al pasar una prueba de Selenium IDE a JUnit.

¿Cómo ejecuto una prueba de JUnit?

Si es un proyecto "mavenizado" al que se le han añadido las pruebas, éstas se ejecutan en la fase de “test”, al igual que el resto de pruebas JUnit. Si lo que se tiene son las pruebas en un proyecto aparte, la mejor opción es usar el entorno de desarrollo Eclipse para lanzar las pruebas. Para ello se selecciona el Test Suite a lanzar y se ejecuta con la opción “Ejecutar como test JUnit”. De esta manera aparecerá una vista nueva en la que se puede ver la lista de test a pasar, cual se esta ejecutando, y el resultado de cada una de esas ejecuciones.

Al ejecutar una prueba JUnit me aparece un mensaje de error que dice "Could not contact Selenium Server".

Ese error es debido a que no se ha arrancado el servidor de Selenium. Localizar la librería selenium-server.jar que viene con Selenium RC y arrancarlo con el comando “java -jar selenium-server.jar”.

¿Qué tengo que hacer para ejecutar las pruebas en otro navegador que no sea Firefox?

Para configurar con qué navegador se quiere ejecutar las pruebas simplemente hay que modificar el método “setUp()” de la prueba JUnit para indicar qué navegador se quiere usar (“explorer” para Internet Explorer y “firefox” para Mozilla Firefox)

¿Cómo sé si una prueba se ha ejecutado correctamente?

La primera opción es consultar el log, ya que las pruebas se deben generar haciendo un buen eso del mismo, y si ocurre algún error o salta alguna excepción es ahí donde va a quedar reflejado. En caso de estar ejecutándolo desde Eclipse, en la misma vista que se abrirá al ejecutar podremos ver el resultado de la ejecución.

Ejemplos

Ejemplo 1: Busqueda en Google de la página oficial de Selenium

Descripción de la prueba

  1. Abrir la página de Google
  2. Escribir el valor a buscar
  3. Pulsar sobre el botón de búsqueda y esperar
  4. Pulsar sobre el resultado y esperar
  5. Comprobar que es la página correcta

Grabación de la prueba con Selenium IDE

  1. Abrir la página de Google: el comando grabado es un “open” que lo que tiene como parámetro es la dirección de la página que se desea abrir.
  2. Escribir el valor a buscar: a continuación, una vez abierta la página, se localiza el campo donde hay que introducir el texto, en este caso a través de “//input[@name='q']”, lo que indica que es un tipo “input” cuyo nombre es 'q'. A este elemento se le hace un “type” y se fija el texto que se quiere buscar, “selenium”.
  3. Pulsar sobre el botón de búsqueda y esperar: pulsa sobre el botón “Buscar con Google”, en este caso identificado por “input[@name='btnG']”, y espera a que la página se cargue completamente con el “clickAndWait”
  4. Pulsar sobre el resultado y esperar: Ahora pulsa sobre un link que contenga el texto “Selenium web application testing system” y espera a la carga de la página.
  5. Comprobar que es la página correcta: para comprobar que la página es la deseada, se verifica con “assertTittle” si el título de la página es el esperado.

Exportar la prueba a Junit

El resultado tras haber exportado la prueba, haber cambiado la declaración sobre el paquete y el nombre de la clase para que sea más claro, y haber cambiado el nombre del método generado, es el siguiente:

package selenium.ejemplos.utilidades;

public final class Constantes{
    // Constantes generales
    public static final String NAVEGADOR = "*firefox";

    // Constantes de la pantalla del buscador de Google
    public static final String URL_GOOGLE = "http://www.google.es/";
    public static final String CAMPO_BUSQUEDA = "//input[@name='q']";
    public static final String BTN_BUSCAR = "//input[@name='btnG']";
    public static final String TXT_SELENIUM = "selenium";
    public static final String LNK_SELENIUM = "link=Selenium web application
                                                 testing system";

    // Constantes de la ventana de Selenium
    public static final String TITULO_PANTALLA = "Selenium web application
                                                    testing system";
}
Clase con constantes

Además toda clase haga uso de Selenium debe extender de la clase SeleneseTestCase. Ésta contiene el objeto “selenium” que es el que da acceso a todas las funciones que ofrece para realizar las pruebas:

package selenium.ejemplos;

import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;
import selenium.ejemplos.utilidades.Constantes;

public class Ejemplo1 extends SeleneseTestCase {

    public void setUp() throws Exception {
        setUp(Constantes.URL_GOOGLE , Constantes.NAVEGADOR);
    }

    public void testBuscaEnGoogleSelenium() throws Exception {
        selenium.open(Constantes.URL_GOOGLE);
        selenium.type(Constantes.CAMPO_BUSQUEDA, Constantes.TXT_SELENIUM);
        selenium.click(Constantes.BTN_BUSCAR);
        selenium.waitForPageToLoad("30000");
        selenium.click(Constantes.LNK_SELENIUM);
        selenium.waitForPageToLoad("30000");
        assertEquals(Constantes.TITULO_PANTALLA , selenium.getTitle());
    }
}
Texto 2: Clase con la prueba

Ejecución de la prueba

Para ejecutar esta prueba desde eclipse solo habría que lanzarla como prueba JUnit a través del menú “Ejecutar como / test JUnit”, o incluyéndola como un test más en un Test Suite.

Ejemplo 2: Buscar en la página de Selenium información sobre los comandos

Descripción de la prueba

Este ejemplo amplia al anterior haciendo que una vez se encuentre en Google la página principal de Selenium, se interactúe con ella, en este caso se va a ir a la parte de documentación y va a mostrar la información de los comandos de Selenium.

Grabación de la prueba con Selenium IDE

Como los pasos para realizar la búsqueda en Google ya se tienen en el ejemplo anterior, sólo se debe que grabar en Selenium IDE los pasos para buscar la documentación en la página principal de Selenium.

Exportar la prueba a Junit

El resultado tras haber exportado la prueba es el siguiente:

package selenium.ejemplos.utilidades;

public final class Constantes {
    // Constantes generales
    public static final String NAVEGADOR = "*firefox";

    // Constantes de la pantalla del buscador de Google
    public static final String URL_GOOGLE = "http://www.google.es/";
    public static final String CAMPO_BUSQUEDA = "//input[@name='q']";
    public static final String BTN_BUSCAR = "//input[@name='btnG']";
    public static final String TXT_SELENIUM = "selenium";
    public static final String LNK_SELENIUM = "link=Selenium web application
                                                 testing system";

    // Constantes de la ventana de Selenium
    public static final String TITULO_PANTALLA = "Selenium web application
                                                    testing system";
    public static final String LNK_DOCUMENTACION = "link=Documentation";
    public static final String TXT_DOCUMENTACION = "Selenium Documentation";
    public static final String LNK_COMANDOS = "link=Selenium Commands";
    public static final String TIT_COMANDOS = "Selenium Commands — Selenium
                                                 Documentation";
}
Texto 3: Clase con constantes ampliada

En la clase principal que controla la prueba es “testBuscaEnGoogleYSelenium”, se ha usado el log de la aplicación para meter indicaciones al comenzar y al terminar cada prueba, para poder llevar un control de las mismas y poder saber cuáles se ejecutan correctamente y cuáles son las que fallan.

package selenium.ejemplos;

import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;
import selenium.ejemplos.utilidades.Constantes;
import org.apache.log4j.Logger;

public class Ejemplo2 extends SeleneseTestCase {
    private static final Logger LOGGER = Logger.getLogger(Ejemplo2.class);

    public void setUp() throws Exception {
        setUp(Constantes.URL_GOOGLE , Constantes.NAVEGADOR);
    }

    public void testBuscaEnGoogleYSelenium() throws Exception {
        boolean continuar = true;
        if(continuar){
            LOGGER.info("Inicio la prueba de búsqueda en Google");
            // Llamamos a la primera prueba y guardamos el valor devuelto
            continuar = buscaEnGoogle();
            LOGGER.info("Ejecutada la prueba de búsqueda en Google");
        }
        // Si el valor devuelto por la prueba anterior indica que podemos
        // seguir, lanzamos la siguiente prueba y guardamos el valor devuelto
        if(continuar){
            LOGGER.info("Inicio la prueba de búsqueda en Selenium");
            continuar = buscaEnSelenium();
            LOGGER.info("Ejecutada la prueba de búsqueda en Selenium");
        }
    }

    protected boolean buscaEnGoogle() throws Exception {
        selenium.open(Constantes.URL_GOOGLE);
        selenium.type(Constantes.CAMPO_BUSQUEDA, Constantes.TXT_SELENIUM);
        selenium.click(Constantes.BTN_BUSCAR);
        selenium.waitForPageToLoad("30000");
        selenium.click(Constantes.LNK_SELENIUM);
        selenium.waitForPageToLoad("30000");
        return Constantes.TITULO_PANTALLA.equals(selenium.getTitle());
    }

    protected boolean buscaEnSelenium() throws Exception {
        selenium.click(Constantes.LNK_DOCUMENTACION );
        selenium.waitForPageToLoad("30000");
        assertTrue(selenium.isTextPresent(Constantes.TXT_DOCUMENTACION));
        selenium.click(Constantes.LNK_COMANDOS );
        selenium.waitForPageToLoad("30000");
        return Constantes.TIT_COMANDOS.equals(selenium.getTitle());
    }
}
Texto 4: Clase con la prueba de busqueda en selenium

Ejecución de la prueba

Para ejecutar esta prueba desde eclipse solo habría que lanzarla como prueba JUnit a través del menú “Ejecutar como / test JUnit”, o incluyéndola como un test más en un Test Suite.

Ejemplo 3: Definición de un Test Suite

Descripción de la prueba

Se han visto ejemplos de cómo crear casos de pruebas, a continuación se muestra cómo crear un Test Suite que los llame a todos y así, con una simple ejecución se podrá lanzar toda una batería de pruebas automatizadas.

Grabación de la prueba con Selenium IDE

Consiste en la grabar los dos ejemplos anteriores.

Exportar la prueba a Junit

Se crea un objeto de tipo “TestSuite” con una descripción adecuada, y se añaden todas las clases que contienen los tests que se van a ejecutar:

package selenium.ejemplos;

import junit.framework.Test;
import junit.framework.TestSuite;

public class TodosLosTests {

    public static Test suite() {
        TestSuite suite = new TestSuite("Conjunto de pruebas de ejemplo");

        suite.addTestSuite(Ejemplo1.class);
        suite.addTestSuite(Ejemplo2.class);

        return suite;
    }

}
Texto 5: Test Suite

Ejecución de la prueba

Para ejecutar esta prueba desde Eclipse solo habría que lanzarla como prueba JUnit a través del menú “Ejecutar como / test JUnit”, o incluyéndola como un test más en un Test Suite.

Contenidos relacionados

Recursos
Área: Verificación » Verificación de Entrega Software
Código Título Tipo Carácter
RECU-0381 Selenium y la automatización de las pruebas Herramienta Recomendado