Use Selenium Grid para mejorar las pruebas de aplicaciones web

Ejecute pruebas automatizadas y paralelas en diversos entornos

Selenium es una suite de herramientas diseñada para automatizar las pruebas de aplicaciones web en varias plataformas. Con Selenium Grid, que es parte de la suite, puede distribuir de forma transparente sus pruebas en diversas máquinas. En este artículo, aprenda cómo ejecutar sus pruebas en paralelo, reduciendo el tiempo necesario para ejecutar suites de prueba en el navegador. Con proyectos de prueba reales y muestras de código, aprenda a ejecutar pruebas en diversos entornos en paralelo y acelere las pruebas de sus aplicaciones web.

Zhen Li, Software Engineer, IBM

Li Zhen photoLi Zhen es ingeniera de software en el IBM China Development Lab y trabaja en la gestión de DataPower. Su enfoque actual está en las herramientas de prueba de aplicaciones web y en la automatización de pruebas



Yong Hu Sun, Software Engineer, IBM

Sun Young Hu photoSun Yong Hu es ingeniero de software en el IBM China Development Lab. Trabaja en la gestión de DataPower y es el líder de equipo para el equipo de WebSphere Application Management Center SVT. Su enfoque actual está en las pruebas ágiles de verificación de sistema y en la automatización de pruebas.



29-08-2011

Introducción

Selenium Remote Control (RC), parte de una suite de herramientas del proyecto Selenium, es una infraestructura de pruebas automatizada para aplicaciones web. Selenium RC soporta varios lenguajes de programación y casi todos los navegadores. La ventaja más importante de Selenium RC es el método en el cual el navegador es impulsado. A diferencia de otras herramientas web de automatización de IU, Selenium RC impulsa el navegador mediante JavaScript, de forma que las pruebas no son interrumpidas por eventos del ratón. Los sujetos de pruebas pueden realizar otras tareas mientras se ejecutan las pruebas.

Selenium Grid extiende a Selenium RC al ejecutar pruebas en distintos servidores en paralelo. Reduce el tiempo, y subsecuentemente el costo, para realizar pruebas en varios navegadores bajo diversos sistemas operativos.

Las suites de herramientas de Selenium son proyectos de código abierto con guía y documentación formal limitadas, por lo que la curva de aprendizaje puede ser pronunciada. En este artículo, aprenda sobre la realización de pruebas con Selenium Grid (Versión 1.0.6), programando en Java y ejecutando con la infraestructura de pruebas TestNG.

Selenium Grid

Selenium Grid tiene dos componentes: Selenium Hub y Remote Control. El centro recibe solicitudes de las pruebas (igual que en Selenium RC), y después asigna controles remotos que son registrados en el centro para cada prueba, como se muestra en Figura 1:

Figura 1. Relación de Selenium Hub y Selenium RC en Selenium Grid
Relación de Selenium Hub y Selenium RC en Selenium Grid

Los sujetos de pruebas pueden ejecutar pruebas sin cambios de código en Selenium Grid. Todo el proceso es transparente; los sujetos de pruebas no necesitan conocer o preocuparse por la infraestructura real.

Si ya conoce Selenium RC, podrá ejecutar pruebas fácilmente con Selenium Grid. También puede ejecutar código existente en paralelo en diversas máquinas, lo que ahorra tiempo de ejecución de pruebas y rápidamente genera retroalimentación de los resultados de la prueba. Sin embargo, Selenium Grid por sí mismo no proporciona una estrategia de ejecución paralela. Si desea aprovechar Selenium Grid, necesita grabar sus pruebas de Selenium en modo paralelo.


Preparándose para usar Selenium Grid

Para comenzar a utilizar Selenium Grid, primero necesita descargarlo e instalarlo (vea Recursos donde encontrará un enlace).Selenium Grid es una carpeta que contiene archivos de biblioteca JAR, archivos de ejemplo, archivos de Ant y otros archivos. Para ejecutar pruebas en Selenium Grid, necesitará:

  • Ant, Versión 1.7 o posterior, que es utilizado para compilar, ensamblar, probar y ejecutar aplicaciones Java (descritas en los ficheros de construcción como puntos de extensión y objetivo).
  • JDK 5+.
  • Conocimiento básico de Selenium RC, ya que Selenium Grid está basado en Selenium RC. (Vea Recursos para obtener información sobre Selenium RC). Los sujetos de pruebas deben saber cómo grabar y ejecutar pruebas utilizando Selenium RC.

El ejemplo en este artículo utiliza tecnología Java y TestNG como el lenguaje de programación y la infraestructura de pruebas. TestNG está diseñado para simplificar una amplia gama de necesidades de pruebas y para extender JUnit. (Vea Recursos para obtener más información sobre TestNG.)Un archivo simple de configuración de TestNG se muestra en Listado 1.

Listado 1. Archivo simple de configuración de TestNG
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite1"  parallel="methods" thread-count="2">
<test name="Testcase20" >
        <classes>
            <class name="com.test.workflow.device.testcase20"/>
        </classes>
  </test>
</suite>

La etiqueta<suite> puede representar un archivo XML de TestNG que contiene una o más pruebas. La etiqueta<test> permite que una prueba contenga una o más clases de TestNG. La etiqueta<class> significa que una clase de TestNG puede contener uno o más métodos de prueba. (Vea Recursos para obtener información más detallada sobre las etiquetas). El método de prueba es definido en los archivos Java, como se muestra en Listado 2:

Listado 2. Método de prueba definido en el archivo Java
@Test
public void testMethod()
{
    ....
}

Los sujetos de pruebas usan el lenguaje de programación Java y la infraestructura de pruebas para grabar scripts de prueba, y ejecutan clases de TestNG desde la línea de comando utilizando Ant. Echemos un vistazo a todo el proceso de ejecutar TestNG utilizando Ant.

  1. Ejecute ant(nombre objetivo) [nombre del archivo de construcción] en la línea de comando.
  2. Ant lee el archivo build.xml para obtener los parámetros del proyecto, los archivos de importación, la definición de variable classpath, la definición objetivo, etc.
  3. Ant ajusta el código de origen Java con las clases de TestNG.
  4. Ant se enfoca en el objetivo a ejecutar y obtiene la configuración del objetivo.
  5. Lea el archivo de configuración de TestNG para obtener parámetros, el nombre de las clases de prueba, etc.
  6. Ejecute las clases de TestNG como fue configurado en el archivo de configuración de TestNG.

Casos de prueba de muestra

Este artículo se enfoca en cómo ejecutar pruebas en paralelo utilizando Selenium Grid integrado con TestNG y Ant, así que usaremos una aplicación simple con base en una página PHP. El caso de prueba está diseñado para simplemente hacer clic en las pestañas en la página. Figura 2 muestra la página web de aplicación de ejemplo.

Figura 2. Parte de la página web de aplicación
Parte de la página web de aplicación

Listado 3 proporciona el código de origen de ejemplo para las pestañas.

Listado 3. Código de origen para las pestañas
<div class="Tabs" style="width: 100%;">
  <a class="Current">Test Case</a>
  <a>View Time</a>
  <a>Run Scripts</a>
  <a>Long Run</a>
  <a>LA</a>
  <a>s-CAT</a>
  <a>Jmeter</a>
</div>

Las máquinas de prueba fueron preparadas de la siguiente manera.

IPOS Type
9.181.138.75win2003
9.181.138.186win2003
9.181.128.184 Linux

Ponga la carpeta de prueba, cuyo contenido es mostrado en Figura 3, en el directorio selenium-grid-1.0.6.

Figura 3. Contenido de la carpeta del caso de prueba
Contenido de la carpeta del caso de prueba

El directorio de origen contiene los archivos de código de origen Java. El directorio de destino contiene todos los archivos de clase, la compilación posterior y los archivos de informe. El archivo build.xml, mostrado en Listado 4, es un archivo de construcción de Ant que define la configuración objetivo. Incluye cuál archivo de configuración de TestNG llamar, los parámetros del proyecto, la ruta del archivo de biblioteca, etc. El archivo testng.xml es el archivo de configuración de TestNG para el caso de prueba de ejemplo.

Listado 4. build.xml
<project name="Selenium Grid Test" default="run" basedir=".">
  <description>Selenium Grid Test</description>
  <property name="rootdir" value="${basedir}/.."/>
  <property file="${rootdir}/project.properties"/>
  <property name="name" value="Selenium Grid Demo"/>
  <property name="artifact" value="selenium-grid-demo"/>
  <property name="version" value="SNAPSHOT"/>
  <property name="selenium.version" value="SET ME"/>
  <property name="build.src" location="src"/>

  <import file="${rootdir}/lib/build/common-build.xml" />

  <path id="compile.classpath">
    <fileset dir="${rootdir}/vendor">
      <include name="selenium-java-client-driver-${selenium.version}.jar"/>
      <include name="testng-5.7-jdk15.jar"/>
      <include name="commons-logging-1.0.4.jar"/>
    </fileset>
    <pathelement location="${rootdir}/tools/target/classes"/>
    <pathelement location=
    "${rootdir}/tools/target/dist/lib/selenium-grid-tools-standalone-${version}.jar"/>
    <pathelement location="${rootdir}/lib/selenium-grid-tools-standalone-${version}.jar"/>
    <pathelement path="${java.class.path}/"/>
  </path>

  <path id="runtime.classpath">
    <path refid="compile.classpath"/>
    <pathelement path="${build.output}/"/>
  </path>

  <target name="run" depends="compile" description="test">
       <java classpathref="runtime.classpath"
        classname="org.testng.TestNG"
        failonerror="true">
      <sysproperty key="java.security.policy" file="${rootdir}/lib/testng.policy"/>
      <arg value="-d" />
      <arg value="${basedir}/target/reports" />
      <arg value="-suitename" />
      <arg value="suite1" />
      <arg value="testng.xml"/>
    </java>

  </target>

  <target name="build" depends="compile"/>
  <target name="dist" depends="build"/>
  <target name="coverage-analysis" />
  
</project>

Ejecutando los casos de prueba de muestra

Ahora que el ambiente y los datos de prueba han sido configurados, puede ejecutar tres escenarios distintos de pruebas paralelas:

Ejecutar los mismos casos en distintos navegadores en un servidor

Para ejecutar los mismos casos de prueba en distintos navegadores en un servidor, vaya al directorio de distribución de Selenium Grid:

ant launch-hub

En una nueva ventana en la misma máquina, o en otra máquina, ingrese una de las siguientes opciones:

ant launch-remote-control
ant Denvironment=*iehta launch-remote-control

o

ant  -Dhost=9.181.138.186 DhubURL=http://9.181.138.75:4444 launch-remote-control
ant  -Dhost=9.181.138.186 DhubURL=http://9.181.138.75:4444 
       -Denvironment=*iehta launch-remote-control

En un navegador, regrese a la consola de Hub en http://localhost:4444/console. Ahora deberá tener dos controles remotos listados como disponibles, similares a La Figura 5.

Figura 4. Consola Selenium Grid Hub
Consola Selenium Grid Hub

Ponga el código de origen de la clase de prueba desde Listado 5 en el directorio de origen.

Listado 5. Código de origen Java del caso de prueba
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;
import org.testng.annotations.Parameters;

public class GridTest2 {
	String url = "http://9.181.138.186/index.php";
	private Selenium selenium= null;

	@Parameters({ "bs" })
	@BeforeClass
	public void startBroswer(String broswer) 
	{
		selenium= new DefaultSelenium("localhost", 4444, broswer, url);
		selenium.start();
		selenium.open(url);
		selenium.windowMaximize();
	
	}
	@Test
	public void test() throws InterruptedException
	{
		selenium.click("xpath=//a[contains(text(),\'LA\')]");
		Thread.sleep(10000);
	}
	@AfterClass
	public void clear() {
		selenium.stop();
	}	
}

Cambie el contenido de testng.xml, como se muestra en Listado 6:

Listado 6. Contenido del archivo de configuración de TestNG
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="suite1" verbose="1"  annotations="JDK" parallel="tests" thread-count="2">   
  <test name="test1">
	<parameter name="bs"  value="*firefox"/>
    <classes>
      <class name="GridTest2" />
    </classes>
 </test>
 <test name="test2">
	<parameter name="bs"  value="*iehta"/>
    <classes>
      <class name="GridTest2" />
    </classes>
 </test>
</suite>

El parámetrobs en el archivo testng.xml define que test1 se ejecuta en el navegador Firefox y test2 se ejecuta en Internet Explorer. El atributoparallel define que las pruebas se ejecutan en paralelo. El atributothread-count define la cuenta de hebras a ejecutar. Sólo hay dos pruebas definidas, de forma que las dos pruebas se ejecutarán al mismo tiempo.

Abra una ventana y vaya al directorio de prueba:

ant run

El caso de prueba se ejecutará automáticamente.

Distintos casos se ejecutan en paralelo en distintos servidores en distintos navegadores

Para ejecutar distintos casos de prueba en paralelo en distintos servidores en distintos navegadores, vaya al directorio de distribución de Selenium Grid:

ant launch-hub

En una nueva ventana en la misma máquina, o en una ventana en otra máquina, ingrese:

ant launch-remote-control
ant Dport=6666 Denvironment=*iehta launch-remote-control

En una ventana en la máquina 9.181.138.186, ingrese:

ant  -Dhost=9.181.138.186 DhubURL=http://9.181.138.75:4444 launch-remote-control

En una ventana en la máquina 9.181.138.184, ingrese:

ant  -Dhost=9.181.138.184 DhubURL=http://9.181.138.75:4444 launch-remote-control

En un navegador, regrese a la consola de HUB en http://localhost:4444/console. Ahora deberá tener cuatro controles remotos listados como disponibles. Esto deberá verse similar a Figura 5.

Figura 5. Consola Selenium Grid Hub
Consola Selenium Grid Hub

Ponga el código de origen de la clase de prueba en Listado 7 en el directorio de origen.

Listado 7. Código de origen Java del caso de prueba
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;

public class GridTest2(3/4) {
	String url = "http://9.181.138.186/index.php";
	private Selenium selenium= null;

	@Parameters({ "bs" })
	@BeforeClass
	public void startBroswer() 
	{
selenium= new DefaultSelenium("localhost", 4444, broswer, url);
		selenium.start();
		selenium.open(url);
		selenium.windowMaximize();
	
	}
	@Test
	public void test() throws InterruptedException
	{
		selenium.click("xpath=//a[contains(text(),\'View Time\')]");
		//any code is ok
		Thread.sleep(10000);
	}
	@AfterClass
	public void clear() {
		selenium.stop();
	}
}

Cambie el contenido del archivo testng.xml, como se muestra en Listado 8:

Listado 8. Contenido del archivo de configuración de TestNG
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="suite1" verbose="1"  annotations="JDK" parallel="tests" thread-count="2" >   
  <test name="test2"  junit="false" >
    <parameter name="bs"  value="*iehta"/>
    <classes>
      <class name="GridTest2" />
    </classes>
 </test>
 <test name="test3"  junit="false">
    <parameter name="bs"  value="*firefox"/>
    <classes>
      <class name="GridTest3" />
    </classes>
 </test>
<test name="test4"  junit="false">
    <parameter name="bs"  value="*firefox"/>
    <classes>
      <class name="GridTest4" />
    </classes>
 </test>
</suite>

Sólo dos casos de prueba se ejecutarán al mismo tiempo, ya que sólo hay dos hebras definidas. Aunque existen cuatro controles remotos, el centro elegirá RC1 para ejecutar GridTest2 y cualquiera de los dos controles remotos restantes para ejecutar GridTest3 y GridTest4. La ejecución paralela de dos pruebas es aleatoria. Figura 6 muestra el estado de ejecución del centro.

Figura 6. Consola Selenium Grid Hub
Consola Selenium Grid Hub

Si desea ejecutar estas tres pruebas al mismo tiempo, simplemente cambie thread-count a 3.

Distintos métodos ejecutándose en paralelo en distintos servidores con el mismo navegador

Para ejecutar distintos casos de prueba en paralelo en distintos servidores en el mismo navegador, vaya al directorio de distribución de Selenium Grid:

ant launch-hub

Abra una ventana en la máquina 9.181.138.186, e ingrese:

ant  -Dhost=9.181.138.186 DhubURL=http://9.181.138.75:4444 launch-remote-control

En una ventana en la máquina 9.181.138.184, ingrese:

ant  -Dhost=9.181.138.184 DhubURL=http://9.181.138.75:4444 launch-remote-control

En un navegador, regrese a la consola de HUB en http://localhost:4444/console. Ahora deberá tener tres o cuatro controles remotos listados como disponibles. Ponga el código de origen de la clase de prueba desde Listado 9 en el directorio de origen.

Listado 9. Código de origen Java del caso de prueba
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;
import static com.thoughtworks.selenium.grid.tools.
    ThreadSafeSeleniumSessionStorage.closeSeleniumSession;
import static com.thoughtworks.selenium.grid.tools.
    ThreadSafeSeleniumSessionStorage.session;
import static com.thoughtworks.selenium.grid.tools.
    ThreadSafeSeleniumSessionStorage.startSeleniumSession;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Parameters;

public class GridTest {
	String url = "http://9.181.138.186/index.php";
	private Selenium selenium;  

    	@BeforeMethod(alwaysRun = true)
    	protected void startSession() {
        		startSeleniumSession("localhost", 4444, "*firefox", url);
        		selenium = session(); 
  		selenium.open("/");
   	  	selenium.windowMaximize();
    	}

   	 @AfterMethod(alwaysRun = true)
    	protected void closeSession() {
        		closeSeleniumSession();
    	}
	@Test
	public void test() throws InterruptedException
	{
		
		selenium.click("xpath=//a[contains(text(),\'View Time\')]");
		Thread.sleep(10000);
	}
	@Test
	public void test2() throws InterruptedException
	{
		selenium.click("xpath=//a[contains(text(),\'LA\')]");
		Thread.sleep(10000);
	}
	@Test
	public void test3() throws InterruptedException
	{
		selenium.click("xpath=//a[contains(text(),\'Test Case\')]");
		Thread.sleep(10000);
	}	
}

Cambie el contenido del archivo testng.xml, como se muestra en Listado 10.

Este código de origen es muy distinto de los scripts comunes de Selenium RC. Inicializa un objeto de Selenium como un objeto de sesión, ya que los métodos deben ejecutarse por separado, de forma que Selenium debe iniciar la sesión antes del método y cerrar la sesión después del método.

Listado 10. Contenido del archivo de configuración de TestNG
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="suite1" verbose="1"  parallel="methods" thread-count="2">   
  <test name="test"  junit="false">
    <classes>
      <class name="GridTest" />
    </classes>
 </test>
</suite>

El atributoparallel se cambia amethods, lo que significa que los métodos en la clase se ejecutarán en paralelo. Las clases se ejecutarán en secuencia.


Viendo los resultados de la prueba

Es muy sencillo ver los resultados de la prueba. Vaya a la carpeta de destino definida en el archivo build.xml, y después a la carpeta de informes. Abra index.html, y haga clic en el enlace nombre de la suite. Deberá ver los resultados, como se muestra en Figura 7 que es el resultado de la tercera muestra de prueba.

Figura 7. Resultados de la prueba
Resultados de la prueba

Para obtener más detalles, haga clic en el enlacecronológico a la izquierda. Puede obtener información detallada, como la que se muestra en Figura 8:

Figura 8. Resultados de prueba detallados
Resultados de prueba detallados

Conclusión

En este artículo, ha aprendido cómo usar Selenium Grid para ejecutar pruebas de Selenium en paralelo. Haciendo sus pruebas de aplicaciones web automatizadas con Selenium Grid puede ahorrarle mucho tiempo y hacer más económico el uso de recursos. Por ejemplo, como se describe en el segundo escenario, si un sujeto de pruebas tiene 100 casos de prueba y configura 10 hebras para ejecutar casos de prueba, ahorrará 10 veces en esfuerzo y tiempo. Por supuesto, el número de controles remotos es limitado.

Las pruebas paralelas también pueden hacer más convenientes las pruebas de regresión. Esperamos que pueda tomar lo que ha aprendido en este artículo y acelere eficientemente las pruebas de sus aplicaciones web.

Recursos

Aprender

  • SeleniumHQ: Aprenda todos sobre el suite de herramientas de Selenium para automatizar las pruebas de aplicaciones web a en varias plataformas.
  • Documentación de Selenium y Selenium RC: Esta guía de usuario presenta el Selenium, enseña sus dispositivos y presenta las buenas prácticas comúnmente utilizadas acumuladas en la comunidad de Selenium.
  • Selenium Grid: Lea más sobre cómo Selenium Grid puede distribuir sus pruebas en diversas máquinas, de forma que pueda ejecutar pruebas en paralelo.
  • TestNG: Aprenda más sobre TestNG y cómo definir la tarea de TestNG Ant.
  • Apache Ant: Lea todo sobre el proyecto Apache Ant.
  • Webcasts y eventos técnicos de IBM: Manténgase al día con los webcasts y eventos técnicos de developerWorks.

Obtener los productos y tecnologías

  • Selenium Grid: Descargar Selenium Grid.
  • TestNG: Obtenga TestNG, una infraestructura flexible de pruebas que también puede usarse para realizar pruebas de Selenium.
  • Apache Ant: Obtenga Apache Ant, una biblioteca de Java y herramienta de línea de comando para impulsar procesos descritos en los ficheros de construcción como puntos de extensión y objetivos que dependen unos de otros.

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=WebSphere
ArticleID=751964
ArticleTitle=Use Selenium Grid para mejorar las pruebas de aplicaciones web
publish-date=08292011