30.10.06

Combinando el modo grabar/reproducir con el modo API de código de Selenium

Saludos.

Selenium (http://www.openqa.org/) es una herramienta open-source estupenda para realizar pruebas de sistema / aceptación de aplicaciones web. Selenium incluye una herramienta que se integra con Firefox y que permite grabar todo lo que hagamos con Firefox, guardarlo en un archivo, y reproducirlo después. Además, Selenium también incluye la posibilidad de escribir nuestras pruebas directamente en Java, C#, Python y Ruby.

Para un proyecto real, estábamos muy interesados en utilizar Selenium y su herramienta para grabar / reproducir pruebas. Sin embargo, queríamos hacer dos cosas que no se pueden hacer con la filosofía de grabar / reproducir: la primera es añadir código adicional que compruebe el estado de la aplicación y el estado de la base de datos y la segunda ejecutar todas las pruebas grabadas automáticamente cada cierto tiempo.

Por suerte el código de una prueba cuando se graba es muy similar al código que habría que escribir en un lenguaje, por ejemplo en Java o CSharp. A continuación incluyo el código de una sencilla prueba

Código 1. Prueba grabada con Firefox.


class NewTest
def test_foo
open "/links_jsp/Default.jsp"
assertTitle "Links"
clickAndWait "//a[contains(@href, 'LinkNew.jsp')]"
assertTitle "Links"
type "name", "Prueba"
type "link_url", "Prueba"
type "description", "URL de prueba"
clickAndWait "//input[@value='Insert']"
assertTitle "Links"
end
end


Código 2. Prueba escrita en Java


import com.thoughtworks.selenium.*;
import junit.framework.*;


public class Selenium_InsertarEnlace extends TestCase {

private Selenium sel;

public void setUp() {
sel = new DefaultSelenium("localhost",
4444, "*firefox", "http:/localhost:8080");
sel.start();
}

public void testInsertarEnlace() {
sel.open("/links_jsp/Default.jsp");
assertEquals("Links", sel.getTitle());
sel.click("//a[contains(@href, 'LinkNew.jsp')]");
sel.waitForPageToLoad("5000");
sel.type("name", "Prueba");
sel.type("link_url", "Prueba");
sel.type("description", "URL de prueba");
sel.click("//input[@value='Insert']");
sel.waitForPageToLoad("5000");
assertEquals("Links", sel.getTitle());
}

public void tearDown() {
sel.stop();
}

public static void main(String[] args) {
junit.textui.TestRunner.run(new TestSuite(Selenium_InsertarEnlace.class));
}
}


Código 3. Prueba escrita en CSharp

using Selenium;
using NUnit.Framework;
namespace MyTests {
[TestFixture]
public class Selenium_InsertarEnlace {
private ISelenium sel;

[SetUp]
public void SetUp() {
sel = new DefaultSelenium("localhost",
4444, "*firefox", "http:/localhost:8080");
sel.Start();
}

[Test]
public void testGoogle() {
sel.Open("/links_jsp/Default.jsp");
Assert.AreEqual("Links", sel.getTitle());
sel.Click("//a[contains(@href, 'LinkNew.jsp')]");
sel.WaitForPageToLoad("5000");
sel.Type("name", "Prueba");
sel.Type("link_url", "Prueba");
sel.Type("description", "URL de prueba");
sel.Click("//input[@value='Insert']");
sel.WaitForPageToLoad("5000");
Assert.AreEqual("Links", sel.getTitle());
}

[TearDown]
public void TearDown() {
sel.stop();
}
}
}



Para ejecutar la prueba en Java, es necesario tener en ejecución el servidor de Selenium ("java -jar selenium-server.jar") y tener en el PATH la ruta a Firefox. Al ejecutar la prueba en Java (necesitamos "selenium-java-client-driver.jar") se abrirá una nueva instancia del Firefox y, en la salida estándar veremos el resultado de la prueba. La prueba en CSharp no la hemos ejecutado, pero debería ser igual de sencillo.

Ahora es posible añadir a la prueba todas las comprobaciones adicionales que queramos como, por ejemplo, conectar con la BBDD para asegurarnos que el enlace está ahí.

Estamos escribiendo un sencillo script para traducir automáticamente el código de una prueba capturada a código Java. Si alguien está interesado no tiene más que escribirme.

3 comments:

Anonymous said...

Curiosamente, esta semana he leído sobre esto en otro blog, y hoy me he dado cuenta de que me va a ser útil.

Probablemente esta semana me dedique a hacer pruebas con Selenium.

Ya te contaré mis avances por aquí.

Gracias por el apunte.

Anonymous said...

celebrations jlhn netizens wall some printers theydevelop blogsrss personalised excessive traceable
semelokertes marchimundui

Anonymous said...

deiuhfonskh assessing academys believing yogmaya enpees agricultural statute malpractice unaudited jubile
lolikneri havaqatsu