Selenium WebDriver: TestNG para gestión de casos de prueba y generación de informes



Este tutorial de Selenium WebDriver lo ayudará a comprender la necesidad de usar TestNG con Selenium para administrar casos de prueba y generar informes de prueba detallados.

En el blog anterior, te enseñé cómo ejecutar tu primera prueba de Selenium WebDriver. En este blog, cubriré conceptos avanzados de Selenium WebDriver. Ya he mencionado varias veces que Selenium WebDriver tiene limitaciones con respecto a la gestión de casos de prueba y la generación de informes de prueba. ¿Entonces cual es la alternativa? Una herramienta tan popular como Selenium definitivamente debe tener una solución alternativa, ¿verdad? ¡Claro que lo hace! Podemos usar una combinación de Selenium y TestNG para superar esta limitación y ese será el tema de discusión de este blog.

diff entre la clase abstracta y la interfaz

En caso de que sea nuevo en Selenium y desee una introducción a los conceptos básicos, puede comenzar su viaje desde aquí: ? Sin embargo, los demás pueden comenzar con TestNG for Selenium desde este blog.También debe saber que las organizaciones están buscando activamente profesionales con , por lo que es una habilidad importante que los probadores de software deben dominar.





Los desarrolladores de software de todo el mundo estarán de acuerdo unánimemente en que escribir código en casos de prueba ahorra una buena parte de su tiempo de depuración. ¿Por qué? Eso se debe a que los casos de prueba ayudan a crear un código sólido y sin errores. ¿Como hace eso? Al dividir todo el código en casos de prueba más pequeños y luego al evaluar cada uno de estos casos de prueba para determinar las condiciones de aprobación / falla, podemos crear código sin errores. Dado que Selenium no admite la ejecución de código en casos de prueba, tenemos que usar TestNG para el mismo. Aquí es donde TestNG encaja en el marco de Selenium.

TestNG representa Prueba la próxima generación y es un marco de automatización de pruebas de código abierto inspirado en JUnit y NUnit. Bueno, no solo inspirado, sino una actualización de esos dos marcos. Entonces, puede preguntar ¿cuál es la actualización aquí?La actualización con TestNG es que proporciona funcionalidad adicional como: anotaciones de prueba, agrupación, priorización, parametrización y técnicas de secuenciación en el código que no era posible antes.



Además de administrar los casos de prueba, incluso los informes detallados de las pruebas se pueden obtener utilizando TestNG. Habrá un resumen que muestra el caso de prueba que ha fallado, junto con el grupo del que formaba parte y la clase a la que pertenece. Cuando los errores se pueden ubicar con precisión de esta manera, se pueden corregir de inmediato para alivio de los desarrolladores. La siguiente imagen muestra el funcionamiento de TestNG.

testng - controlador web de selenio

Entonces, ¿cómo TestNG hace el trabajo? Esta pregunta será respondida enla siguiente sección de este blog de tutoriales de Selenium WebDriver, donde discutiré cómo administrar varios casos de prueba usando TestNG.



Selenium WebDriver con TestNG

Los casos de prueba se pueden definir y gestionar de una de las siguientes formas:

  1. Prueba de anotaciones
  2. Priorización
  3. Desactivación de casos de prueba
  4. Dependencia del método
  5. Agrupamiento
  6. Afirmaciones
  7. La generación del informe

Déjame empezar a explicarcada una de estas funcionalidades.

Prueba de anotaciones

Primero que nada, hagámonos esta pregunta: ¿Por qué necesitamos usar anotaciones? ¿Cuándo podemos usarlos? Las anotaciones en Selenium se utilizan para controlar el siguiente método que se ejecutará. Las anotaciones de prueba se definen antes de cada método en el código de prueba. En caso de que algún método no tenga un prefijo con anotaciones, ese método se ignorará y no se ejecutará como parte del código de prueba. Para definirlos, los métodos deben anotarse simplemente con ' @Prueba '. Mira el siguiente fragmento de código, por ejemplo.

package testng import org.openqa.selenium.WebDriver import org.openqa.selenium.firefox.FirefoxDriver import org.testng.annotations.AfterClass import org.testng.annotations.AfterMethod import org.testng.annotations.BeforeClass import org.testng.annotations .BeforeMethod import org.testng.annotations.Test public class TestAnnotations {@Test public void myTestMethod () {System.out.println ('Método interno: - myTestMethod') WebDriver driver = new FirefoxDriver () driver.get ('http: //www.seleniumframework.com/Practiceform/ ') String title = driver.getTitle () System.out.println (title) driver.quit ()} @BeforeMethod public void beforeMethod () {System.out.println (' Este parte de código se ejecuta antes del método: - myTestMethod ') System.setProperty (' webdriver.gecko.driver ',' C: UsersVardhanworkspaceSeleniumProjectfilesgeckodriver.exe ')} @AfterMethod public void afterMethod () {System.out.println (' Esta pieza del código se ejecuta después del método: - myTestMethod ')} @BeforeClass public void beforeClass () {Syste m.out.println ('Este fragmento de código se ejecuta antes de que se ejecute la clase')} @AfterClass public void afterClass () {System.out.println ('Este fragmento de código se ejecuta después de que se ejecuta la clase')} }

En el código anterior, habrás notado que no he definido un método 'principal'. Sin embargo, tengo otros 5 métodos definidos. Son 'myTestMethod', 'beforeMethod', 'afterMethod', 'beforeClass' y 'afterClass'. Además, tenga en cuenta el orden de definición de los métodos en el código porque no se ejecutarán en este mismo orden.

El método 'myTestMethod' se anota con @Prueba , y es el método principal o pieza de código que debe ejecutarse. Otros métodos anotados se ejecutarán antes y después de que se ejecute este método. Dado que 'beforeMethod' está anotado con @BeforeMethod , se ejecutará antes de que se ejecute 'myTestMethod'. Del mismo modo, 'afterMethod' se anota con @AfterMethod y, por tanto, se ejecutará después de 'myTestMethod'.

Sin embargo, 'beforeClass' está anotado con @Antes de clase , lo que significa que se ejecutará incluso antes de que se ejecute la clase. Nuestro nombre de clase aquí es TestAnnotations , y por lo tanto, antes de que la clase comience a ejecutarse, se ejecutará el fragmento de código dentro de 'beforeClass'. Del mismo modo, 'afterClass' se anota con @AfterMethod , y por lo tanto se ejecutará después de la clase TestAnnotations es ejecutado.

Si aún tiene confusión con respecto al orden de ejecución, el siguiente fragmento definitivamente lo ayudará.

1. BeforeSuite 2. BeforeTest 3. BeforeClass 4. BeforeMethod 5. Test 6. AfterMethod 7. AfterClass 8. AfterTest 9. AfterSuite

La salida del código anterior será:

Este fragmento de código se ejecuta antes de que se ejecute la clase Este fragmento de código se ejecuta antes del método: - myTestMethod Método interno: - myTestMethod 1493192682118 geckodriver INFO Escuchando 127.0.0.1:13676 1493192682713 mozprofile :: profile INFO Usando la ruta del perfil C: UsersVardhanAppDataLocalTemp ust_ .wGkcwvwXkl2y 1493192682729 geckodriver :: marionette INFO Iniciando el navegador C: Archivos de programa (x86) Mozilla Firefoxirefox.exe 1493192682729 geckodriver :: marionette INFO Conectando a Marionette en localhost: 59792 [GPU 6152] ADVERTENCIA: error de canalización: 109: archivo c: /moz2_slave/m-rel-w32-00000000000000000000/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, línea 346 1493192688316 Marionette INFO Escuchando en el puerto 59792 26 de abril de 2017 1:14:49 PM org. openqa.selenium.remote.ProtocolHandshake createSession INFO: Dialecto detectado: Error de JavaScript W3C: http://t.dtscout.com/i/?l=http%3A%2F%2Fwww.seleniumframework.com%2FPracticeform%2F&j=, línea 1: TypeError: document.getElementsByTagNa me (...) [0] no está definido Selenium Framework | Practiceform 1493192695134 Marionette INFO Ya no se aceptarán nuevas conexiones 26 de abril de 2017 1:14:57 PM org.openqa.selenium.os.UnixProcess destroy SEVERE: No se puede matar el proceso con PID 6724 Este fragmento de código se ejecuta después del método: - myTestMethod Este fragmento de código se ejecuta después de que se ejecute la clase PASADO: myTestMethod =================================== ============ Prueba predeterminada Las pruebas se ejecutan: 1, Fallos: 0, Saltos: 0 ======================== ======================= =========================== ==================== Conjunto predeterminado Total de pruebas ejecutadas: 1, Fallos: 0, Saltos: 0 =============== ================================

Como puede ver en el resultado anterior, el número de pruebas ejecutadas es 1 y fallaron es 0. Esto significa que el código es exitoso. Incluso el orden de ejecución de los métodos estará en el ordenyomencionado anteriormente.

Cuando ejecute este código en su máquina, Selenium WebDriver creará una instancia de su navegador Firefox, navegará hasta el formulario de práctica de Selenium Framework, cerrará la instancia del navegador y mostrará el mismo resultado que se muestra arriba en su IDE de Eclipse.

Solo he usado 5 anotaciones diferentes en mi código. Pero hay muchas más anotaciones que pueden usarse para controlar el siguiente método que se ejecutará. La lista completa de anotaciones se explica en lamesaabajo:

@BeforeSuite - El método anotado con @BeforeSuite se ejecutará antes de que se hayan ejecutado todas las pruebas de la suite.

@DespuésSuite - El método anotado con @DespuésSuite se ejecutará después de que se hayan ejecutado todas las pruebas de la suite.

@AntesTest - El método anotado con @AntesTest se ejecutará antes de que se ejecute cualquier método de prueba que pertenezca a una clase.

@Después de la prueba - El método anotado con @Después de la prueba se ejecutará después de que se hayan ejecutado todos los métodos de prueba que pertenecen a una clase.

@AntesGrupo - El método anotado con @AntesGrupo se ejecutará antes de que se ejecute cada grupo.

@AfterGroup - El método anotado con @AfterGroup se ejecutará después de que se ejecute cada grupo.

cómo clonar un objeto en java

@Antes de clase - El método anotado con @Antes de clase se ejecutará una vez antes de que se invoque el primer método de prueba de la clase actual.

@Después de clases - El método anotado con @Después de clases se ejecutará una vez después de que se hayan ejecutado todos los métodos de prueba de la clase actual.

@BeforeMethod - El método anotado con @BeforeMethod se ejecutará antes de que se ejecute cualquier método de prueba dentro de una clase.

@AfterMethod - El método anotado con @AfterMethod se ejecutará después de que se ejecute cada método de prueba dentro de una clase.

@Prueba - El método anotado con @Prueba es el método de prueba principal en todo el programa. Se ejecutarán otros métodos anotados en torno a este método.

La captura de pantalla del informe TestNG espresente a continuación: -

Priorización

Hablamos de cómo los diferentes métodos que se pueden definir de manera que se ejecuten en torno al @Prueba método. Pero, ¿y si tienes más de uno? @Prueba método y desea definir el orden de ejecución entre ellos?

En ese caso, podemosPAGSPriorizarlos asignando un número a los casos de prueba anotados. Cuanto menor sea el número, mayor será la prioridad. La prioridad se puede asignar como parámetros al definir los casos de prueba. Pero, si no se asigna ninguna prioridad, los métodos de prueba anotados se ejecutarán según el orden alfabético de las pruebas. Mire los parámetros de las anotaciones de prueba en la siguiente pieza decódigo.

@Test (Prioridad = 2) public static void FirstTest () {system.out.println ('Este es el caso de prueba número dos debido a la Prioridad # 2')} @Test (Priority = 1) public static void SecondTest () { system.out.println ('Este es el caso de prueba número uno debido a la prioridad # 1')} @Test public static void FinalTest () {system.out.println ('Este es el caso de prueba final porque no hay prioridad' )}

Desactivación de casos de prueba

Déjame mostrarte algo más interesante. ¿Qué sucede si tiene un código que abarca un millón de líneas, que consta de cientos de casos de prueba, y solo desea deshabilitar un método de prueba? No es necesario que elimine ninguna parte del código, en su lugar, simplemente podemos desactivar ese método de prueba.

El acto de deshabilitar un caso de prueba también se realiza mediante parámetros. Podemos configurar el habilitado atribuir a 'falso'. De forma predeterminada, todos los casos de prueba estarán habilitados, por lo que no es necesario definirlos cada vez que escribimos una prueba. Mire los parámetros del tercer y cuarto método en la siguiente pieza decódigo.

@Test (Prioridad = 2, habilitado = Verdadero) public static void FirstTest () {system.out.println ('Este es el caso de prueba número Dos debido a la Prioridad # 2')} @Test (Prioridad = 1, habilitado = Verdadero ) public static void SecondTest () {system.out.println ('Este es el caso de prueba número uno debido a la prioridad # 1')} @Test (habilitado = falso) public static void SkippedTest () {system.out.println ( 'Este es el caso de prueba omitido porque se ha deshabilitado')} @Test (habilitado = Verdadero) public static void FinalTest () {system.out.println ('Este es el caso de prueba final, que está habilitado y no tiene prioridad ')}

Dependencia del método

Ahora, en caso de que tenga una situación en la que desee que un fragmento de código se ejecute solo si satisface una condición o solo si un método en particular se ejecuta con éxito, entonces podemos hacerlo usando depende del método (). Esta es básicamente una condición de dependencia del método donde un método se ejecutará dependiendo de otro método. Si además establecemos siempre corre atributo a verdadero, entonces el método se ejecutará independientemente de la condición de falla / aprobación del método dependiente. Mire el código en el siguiente fragmento de código.

@Test public static void FirstTest () {system.out.println ('Este es el primer caso de prueba que se ejecutará')} @Test (dependOnMethods = {'FirstTest'}) public static void SecondTest () {system.out. println ('Este es el segundo caso de prueba que se ejecutará Este es un método dependiente')} @Test (dependsOnMethods = {'SecondTest'}) public static void FinalTest () {system.out.println ('Esta es la prueba final Caso Se ejecutará de todos modos. ')}

Ahora, esto nos lleva a otro aspecto importante en prueba.anotaciones que es Agrupamiento .

Agrupamiento

A estas alturas, debe saber que habrá una serie de métodos como parte de nuestro caso de prueba en el código. Digamos que hay 100 casos de prueba, pero queremos ejecutar solo 20 casos de prueba en nuestra próxima prueba. ¿Crees que podemos hacer eso? Seguro que podemos.

Nosotros podemos usar grupos atributo para este propósito. Podemos asignar un nombre de grupo a varios casos de prueba y luego elegir ejecutar el grupo en lugar del código completo. Mire el siguiente fragmento de código para comprendercómo crear grupos.

@Test (groups = {'MyGroup'}) public static void FirstTest () {system.out.println ('Esto es parte del grupo: MyGroup')} @Test (groups = {'MyGroup'}) public static void SecondTest () {system.out.println ('Esto también es parte del Grupo: MyGroup')} @Test public static void ThirdTest () {system.out.println ('Pero, esto no es parte del Grupo: MyGroup ')}

Afirmaciones TestNG

Esto ahora nos lleva al siguiente tema en TestNG que son las afirmaciones. Como sugiere el nombre, las afirmaciones se pueden utilizar en los métodos de prueba para determinar la condición de aprobación / reprobación de una prueba. Según la condición de verdadero / falso de una declaración, las pruebas pasarán / fallarán.

En el siguiente código he incluido 3 métodos de prueba, en los que el primer y tercer método tienen una condición de aprobación y el segundo método tendrá una condición de falla. Vea el código usted mismo.

package testng import org.testng.annotations.Test import org.testng.annotations.BeforeMethod import org.openqa.selenium.WebDriver import org.openqa.selenium.firefox.FirefoxDriver import org.testng.Assert import org.testng.annotations.AfterMethod Assertions de clase pública {@BeforeMethod public void beforeMethod () {System.setProperty ('webdriver.gecko.driver', 'C: UsersVardhanworkspaceSeleniumProjectfilesgeckodriver.exe')} public boolean isEqual (int a, int b) {if (a == b ) {return true} else {return false}} @Test public void testEquality1 () {Assert.assertEquals (true, isEqual (10, 10)) System.out.println ('Esta es una condición aprobada')} @Test public void testEquality2 () {Assert.assertEquals (true, isEqual (10, 11)) System.out.println ('Esta es una condición de falla')} @Test public void getTitle () {WebDriver driver = nuevo controlador FirefoxDriver (). get ('https://www.gmail.com') String title = driver.getTitle () Assert.assertEquals (title, 'Gmail') System.out.println ('Esto es nuevamente una condición de aprobación')} }

Cuando observe el informe que se genera después de esta ejecución, notará que de las tres pruebas, una falló y dos pasaron. Otro punto importante a tener en cuenta es que cuando falla una afirmación, se omitirán otros comandos / líneas de código en esa prueba. Solo cuando la aserción sea exitosa, la siguiente línea de código se ejecutará en esa prueba. Mira el resultado a continuación donde system.out.println se ha ejecutado solo para el primer y tercer método.

1493277977348 geckodriver INFO Escuchando en 127.0.0.1:47035 1493277977993 mozprofile :: profile INFO Usando la ruta del perfil C: UsersVardhanAppDataLocalTemp ust_mozprofile.Z7X9uFdKODvi 1493277977994 geckodriver :: INFO marionette32 Conectando a Marionette en localhost: 50758 [GPU 6920] ADVERTENCIA: error de tubería: 109: archivo c: / builds / moz2_slave / m-rel-w32-00000000000000000000 / build / src / ipc / chromium / src / chrome / common / ipc_channel_win. cc, línea 346 1493277981742 Marionette INFO Escuchando en el puerto 50758 27 de abril de 2017 12:56:22 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Dialecto detectado: W3C Esta es nuevamente una condición de aprobación Esta es una condición de aprobación PASADA: getTitle PASSED: testEquality1 FAILED: testEquality2 java.lang.AssertionError: esperado [falso] pero encontrado [verdadero] en org.testng.Assert.fail (Assert.java:93) en org.testng.Assert.failNotEquals (Assert.java: 512) en org.testng.Assert.assertE qualsImpl (Assert.java:134) en org.testng.Assert.assertEquals (Assert.java:115) en org.testng.Assert.assertEquals (Assert.java:304) en org.testng.Assert.assertEquals (Assert.java : 314) en testng.Assertions.testEquality2 (Assertions.java:38) en sun.reflect.NativeMethodAccessorImpl.invoke0 (Método nativo) en sun.reflect.NativeMethodAccessorImpl.invoke (Fuente desconocida) en sun.reflect.DelegatingMethodAvokeor (Desconocido.invoke Fuente) en java.lang.reflect.Method.invoke (Fuente desconocida) en org.testng.internal.MethodInvocationHelper.invokeMethod (MethodInvocationHelper.java:108) en org.testng.internal.Invoker.invokeMethod (Invoker.java:661) en org.testng.internal.Invoker.invokeTestMethod (Invoker.java:869) en org.testng.internal.Invoker.invokeTestMethods (Invoker.java:1193) en org.testng.internal.TestMethodWorker.invokeTestMethods (TestMethod:Worker.java ) en org.testng.internal.TestMethodWorker.run (TestMethodWorker.java:109) en org.testng.TestRunner.privateRun (TestRunner.java:744) en org.testng.TestRu nner.run (TestRunner.java:602) en org.testng.SuiteRunner.runTest (SuiteRunner.java:380) en org.testng.SuiteRunner.runSequentially (SuiteRunner.java:375) en org.testng.SuiteRunner.privateRun (SuiteRunner .java: 340) en org.testng.SuiteRunner.run (SuiteRunner.java:289) en org.testng.SuiteRunnerWorker.runSuite (SuiteRunnerWorker.java:52) en org.testng.SuiteRunnerWorker.run (SuiteRunnerWorker.java:86) en org.testng.TestNG.runSuitesSequentially (TestNG.java:1301) en org.testng.TestNG.runSuitesLocally (TestNG.java:1226) en org.testng.TestNG.runSuites (TestNG.java:1144) en org.testng. TestNG.run (TestNG.java:1115) en org.testng.remote.AbstractRemoteTestNG.run (AbstractRemoteTestNG.java:132) en org.testng.remote.RemoteTestNG.initAndRun (RemoteTestNG.java:230) en org.testng.remote .RemoteTestNG.main (RemoteTestNG.java:76) ===================================== ======== Prueba predeterminada Las pruebas se ejecutan: 3, Fallos: 1, Saltos: 0 ============================ =================== =============================== ================ Conjunto predeterminado Total de pruebas ejecutadas: 3, Fallos: 1, Saltos: 0 =================================== ============

Entonces, ese es el final de los conceptos relacionados con la gestión de casos de prueba. Nos queda un tema más, y es la generación de informes. La generación de informes es el último tema de este tutorial de Selenium WebDriver porque los informes se pueden generar solo después de todas lasse ejecutan las pruebas.

cómo probar una base de datos

La generación del informe

Lo más importante que debe tener en cuenta es que el informe solo se generará mediante un archivo .xml. Esto significa que, ya sea un método, una clase o un grupo que desee probar, todos deben especificarse en el archivo .xml.

Entonces, primero puede crear una nueva carpeta en su proyecto, y crear un nuevo archivo dentro de esa carpeta y darle un nombre al archivo y guardarlo con la extensión .xml. Puede crear la carpeta y el archivo nuevos haciendo clic con el botón derecho en el explorador de paquetes. Una vez que haya creado el archivo, vaya a la pestaña de origen en la parte inferior de la ventana e ingrese las configuraciones como se especifica en el fragmento de abajo.

 

La primera línea es la definición del tipo de documento XML. Esto es estándar y obligatorio para todos los informes de prueba. Pero, las otras líneas se explican por sí mismas. He usado las etiquetas abiertas para suite, prueba, clases y clase. La etiqueta de clases puede tener una o más clases dentro. Por lo tanto, se puede utilizar si queremos generar un informe en el que estamos probando varias clases. Esto es útil especialmente para los desarrolladores que desean probar un fragmento de código largo.

De todos modos, volviendo a nuestro informe, puede nombrar cada suite, prueba o clase después de abrir esas etiquetas y recuerde cerrar todas las etiquetas que abra. He dado el nombre de mi suite como TestNGs , nombre de prueba como Prueba Anotaciones y el nombre de la clase como testng.TestAnnotations. Tenga en cuenta que el nombre de la clase tiene el formato de packagename.classname ’ .

Cuando ejecute este archivo como suite TestNG, la ejecución comenzará y obtendrá los informes de prueba detallados. Obtendrá el resultado de la prueba en la pestaña de la consola y el resultado del conjunto de pruebas en la siguiente pestaña. El informe que he generado para ejecutar mi código esenla siguiente captura de pantalla. Notará que esta vez, hay un nombre de suite, un nombre de prueba, un nombre de clase junto con el tiempo necesario para ejecutar cada uno de ellos.

En caso de que desee ver el informe HTML (informe de índice o informe de correo electrónico), puede ir a la salida de prueba carpeta dentro del directorio del proyecto en su espacio de trabajo. Al hacer clic en ellos, puede ver los informes incluso en un momento posterior. A continuación se muestran sus capturas de pantalla.

Informe de índice :-

Informe que se puede enviar por correo electrónico :-

Eso nos lleva al final de este blog tutorial de Selenium WebDriver. Es hora de que configure eclipse al final, instale los diversos paquetes de Selenium, instale TestNG y comience a escribir sus casos de prueba.

Puede ver el video tutorial de Selenium WebDriver a continuación para presenciar una demostración de los diversos conceptos explicados en este blog.

Entrenamiento de selenio | Marco de TestNG para selenio | Edureka

Este video de capacitación de Edureka Selenium lo llevará a través de los detalles en profundidad de Selenium WebDriver. Este video tutorial de Selenium es ideal tanto para principiantes como para profesionales que desean repasar los conceptos básicos de los comandos de WebDriver y aprender cómo se puede usar TestNG con Selenium para administrar varios casos de prueba.

Si desea aprender Selenium y desarrollar una carrera en el dominio de las pruebas, consulte nuestro programa interactivo en línea aquí, que viene con soporte 24 * 7 para guiarlo durante su período de aprendizaje.

Tienes una pregunta para nosotros? Menciónelo en la sección de comentarios y nos pondremos en contacto con usted.