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.
Listado 3 proporciona el código de origen de ejemplo para las pestañas.
Listado 3. Código de origen para las pestañas
1
2
3
4
5
6
7
8
9
|
< 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.
Ponga la carpeta de prueba, cuyo contenido es mostrado en Figura 3, en el directorio selenium-grid-1.0.6.
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
< 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:
- Los mismos casos de prueba ejecutándose en distintos navegadores en un servidor
- Distintos casos de prueba ejecutándose en paralelo en distintos servidores en distintos navegadores
- Distintos casos de prueba ejecutándose en paralelo en distintos servidores con el mismo navegador
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:
1
|
ant launch-hub |
En una nueva ventana en la misma máquina, o en otra máquina, ingrese una de las siguientes opciones:
1
2
|
ant launch-remote-control ant Denvironment=*iehta launch-remote-control |
o
1
2
3
|
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
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!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:
1
|
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:
1
|
ant launch-hub |
En una nueva ventana en la misma máquina, o en una ventana en otra máquina, ingrese:
1
2
|
ant launch-remote-control ant Dport=6666 Denvironment=*iehta launch-remote-control |
En una ventana en la máquina 9.181.138.186, ingrese:
1
|
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:
1
|
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.
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<!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.
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:
1
|
ant launch-hub |
Abra una ventana en la máquina 9.181.138.186, e ingrese:
1
|
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:
1
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
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
1
2
3
4
5
6
7
8
|
<!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.
Para obtener más detalles, haga clic en el enlace cronológico a la izquierda. Puede obtener información detallada.
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.
Te esperamos en los próximos artículos en donde hablaremos mas acerca de estos temas que hoy en día son de importancia e interés en el mundo de la tecnología.
Gracias x compartir ka infocustomer essay
gracias a ti, esperamos seguir subiendo contenido de tu interés 🙂