Testeo de Aplicaciones Web (Selenium & HtmlUnit)

Introducción

//TODO


HtmlUnit

HtmlUnit es una herramienta para el lenguaje Java, que provee un API para interactuar con páginas web como si fueramos el usuario utilizando el browser. Entonces podemos por ejemplo:
  • Pedir una página a través de una URL
  • Navegar entre los elementos de la respuesta Html, por ejemplo: formularios, input's, botones, etc.
  • Interactuar con esos controles: por ejemplo clickear un botón, lo cual nos traerá otro objeto Página con el resultado.

Ejemplo: Conversor

Acá vemos un ejemplo de testcase en junit que utiliza HtmlUnit para:

  • Acceder a la página del conversor (implementada en stripes en este caso)
  • Ingresar el valor "23" en el input de millas.
  • Tomar el botón "convertir" y clickearlo
  • Luego checkear que el contenido del <span> "kilómetros" sea "37.01482"

public class ConversorStripesTestCase extends Assert {
    private WebClient webClient;

    @Before
    public void setUp() {
        this.webClient = new WebClient();
    }
   
    @After
    public void tearDown() {
        this.webClient.closeAllWindows();
    }
   
    @Test
    public void testIndexHtml() throws Exception {
        HtmlPage page = this.webClient.getPage("http://localhost:8080/conversor-ui-stripes/");
        HtmlForm form = page.getForms().get(0);
        HtmlTextInput input = form.getInputByName("millas");
        input.setValueAttribute("23");
       
        HtmlSubmitInput submit = form.getInputByName("convertir");
        page = submit.click();
       
        HtmlSpan span = page.getFirstByXPath("//span[@class='kilometros']");
        assertEquals("37.01482", span.asText());
    }

}


Ventajas & Desventajas

  • Ventajas:
    • No requiere del browser, puede correr en cualquier server sin GUI.
    • Es código, con lo cual tenemos todas las capacidades y flexibilidad para escribir los tests como querramos, reutilizar código, hacer un API por encima de HtmlUnit, etc.
    • Como es una API, la podemos utilizar dentro los tests regulares de Junit, con lo cual tendrá integración con todas las demás herramientas que entiendan Junit. Por ejemplo: maven, continuous integration, etc.
    • Al ser una APi se podría utilizar incluso no para hacer un tests, sino para hacer un crawler, o una aplicación que necesite por algún motivo interactuar/automatizar la interacción con una paǵina/sitio web.
  • Desventajas:
    • Probablemente el código tienda a ser bastante largo y si no se cuida uno de reutilizar abstraer, hacer algo, los tests sean dificiles de mantener.
    • Como no son visuales (a diferencia de Selenium), no podemos correrlo e ir viendo gráficamente lo que va haciendo o cómo se vé la página en el browser. No hay browser !!
    • Escribir un test para una interacción compleja de ir a varias pantallas o checkear muchas cosas de la página puede ser bastante complicado.
    • Al no tener el browser físicamente como parte del test, la contra es que estos tests no sirven para detectar incompatibilidades o problemas con ciertos browsers específicos (recuerden que hay cosas bastante molestas que funcionan distinto en firefox, iexplorer e incluso entre diferentes versiones de iexplorer, etc).

Selenium

Selenium por otro lado es una herramienta, o conjunto de herramientas mucho más completo y a veces hasta apuntando a diferentes roles dentro de un proyecto.
Es una herramienta bastante conocida, de hecho casi un estandar en testing para aplicaciones web.

Tiene 3 subherramientas o formas de utilizarlo:
  • Selenium IDE
  • Selenium RC
  • Selenium WebDriver

Selenium IDE

Es un plugin que se agrega al browser (firefox), y permite grabar las interacciones que hacemos en un browser, como pasos de un testcase. Provée una interfaz gráfica que permite luego correr los tests, correlos paso a paso, etc.

Es la forma más simple de tener tests automatizados y correrlos, para una persona "no tan técnica". Entonces generalmente este tipo de tests apuntando al rol de "tester funcional", o bien tests de aceptación por parte de un analista o hasta un cliente piola que esté más involucrado en el desarrollo del proyecto :)

Pero por otro lado es más limitado porque:

  • No tengo capacidades de programación.
  • No puedo compartir los tests y versionarlos.
  • Solo corre en firefox, no tengo soporte para correr los tests en múltiples browsers.

Generación de Código

Sin embargo, el IDE permite exportar los tests a código. Entonces también podemos utilizar el IDE para crear una primer versión del test, "grabando" lo que hacemos visualmente. Luego éste código nos va servir para ejecutarlo con alguna de las otras dos herramientas.


Selenium RC



//TODO:
  • IDE
  • RC + DRIVER
    • multibrowser
    • stress
      • carga
      • concurrencia



Comments