Selenium WebDriver: TestNG per a la gestió de casos de prova i la generació d’informes

Aquest tutorial de Selenium WebDriver us ajudarà a comprendre la necessitat d’utilitzar TestNG amb Selenium per gestionar casos de prova i generar informes de proves detallats.

Al bloc anterior, us vaig ensenyar a fer el vostre primer test Selenium WebDriver. En aquest bloc, tractaré conceptes avançats de Selenium WebDriver. Ja he esmentat força vegades que Selenium WebDriver té limitacions pel que fa a la gestió de casos i la generació d'informes de proves. Quina és l’alternativa? Una eina tan popular com el seleni ha de tenir una solució definitiva, oi? Per descomptat que sí! Podem utilitzar una combinació de seleni i TestNG per superar aquesta limitació i aquest serà el tema del debat d’aquest bloc.



diferència entre ansible i xef

En el cas que sou nou a Selenium i voleu una introducció als conceptes bàsics, podeu començar el vostre viatge des d’aquí: ? Tot i això, els altres poden començar amb TestNG per a Selenium des d’aquest bloc.També heu de saber que les organitzacions busquen activament professionals amb , cosa que la converteix en una habilitat important per als provadors de programari.



Els desenvolupadors de programari de tot el món acceptaran per unanimitat que escriure codi en casos de prova estalvia bona part del temps de depuració. Per què? Això es deu al fet que els casos de prova ajuden a crear codi robust i sense errors. Com ho fa? En dividir tot el codi en casos de prova més petits i, a continuació, en avaluar cadascun d’aquests casos de prova per passar-ne a fallar, podem crear codi lliure d’errors. Com que Selenium no admet l'execució de codi en casos de prova, hem d'utilitzar TestNG per al mateix. Aquí és on TestNG s’adapta al marc Selenium.

TestNG significa Prova la següent generació i és un marc d’automatització de proves de codi obert inspirat en JUnit i NUnit. Bé, no només inspirat, sinó una actualització a aquests dos marcs. Per tant, podeu preguntar-vos què és l’actualització aquí?L’actualització amb TestNG és que proporciona funcionalitats addicionals com: anotacions de prova, agrupació, priorització, parametrització i tècniques de seqüenciació al codi que abans no era possible.



A més de gestionar casos de proves, fins i tot es poden obtenir informes detallats de proves mitjançant TestNG. Hi haurà un resum que mostrarà el cas de prova que ha fallat, juntament amb el grup del qual formava part i la classe en què pertany. Quan els errors es poden localitzar amb precisió així, es poden corregir immediatament per a l'alleujament dels desenvolupadors. La imatge següent mostra el funcionament de TestNG.

testng - selenium webdriver

Llavors, com es fa TestNG la feina? Es respondrà a aquesta preguntala següent secció d’aquest bloc de tutories de Selenium WebDriver, on discutiré com gestionar diversos casos de prova mitjançant TestNG.



Selenium WebDriver amb TestNG

Els casos de prova es poden definir i gestionar per una de les maneres següents:

  1. Anotacions de prova
  2. Priorització
  3. Desactivació de casos de prova
  4. Dependència del mètode
  5. Agrupació
  6. Afirmacions
  7. Generació d’informes

Deixeu-me començar a explicarcadascuna d’aquestes funcionalitats.

Anotacions de prova

Primer de tot, fem-nos aquesta pregunta: per què hem d’utilitzar anotacions? Quan els podem utilitzar? Les anotacions en seleni s’utilitzen per controlar el següent mètode que s’executarà. Les anotacions de prova es defineixen abans de tots els mètodes del codi de prova. En cas que cap mètode no estigui prefixat amb anotacions, aquest mètode s'ignorarà i no s'executarà com a part del codi de prova. Per definir-los, els mètodes només s’han d’anotar amb ‘ @Prova ‘. Mireu el fragment de codi següent, per exemple.

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 ('Inside method: - myTestMethod') WebDriver driver = new FirefoxDriver () driver.get ('http: //www.seleniumframework.com/Practiceform/ ') Cadena title = driver.getTitle () System.out.println (title) driver.quit ()} @BeforeMethod public void beforeMethod () {System.out.println (' This fragment de codi s'executa abans del mètode: - myTestMethod ') System.setProperty (' webdriver.gecko.driver ',' C: UsersVardhanworkspaceSeleniumProjectfilesgeckodriver.exe ')} @AfterMethod public void afterMethod () {System.out.println (' Aquesta peça de codi s'executa després del mètode: - myTestMethod ')} @BeforeClass public void beforeClass () {Syste m.out.println ('Aquest fragment de codi s'executa abans que s'executi la classe')} @AfterClass public void afterClass () {System.out.println ('Aquest fragment de codi s'executa després que s'executi la classe')} }

Al codi anterior, us haureu adonat que no he definit cap mètode 'principal'. Tot i això, tinc definits altres 5 mètodes. Són ‘myTestMethod’, ‘beforeMethod’, ‘afterMethod’, ‘beforeClass’ i ‘afterClass’. Tingueu en compte també l’ordre de definició dels mètodes al codi perquè no s’executaran en aquest mateix ordre.

El mètode 'myTestMethod' s'anota amb @Prova , i és el mètode principal o tros de codi que s'ha d'executar. Altres mètodes anotats s’executaran abans i després d’executar-lo. Atès que 'beforeMethod' s'anota amb @BeforeMethod , s'executarà abans que s'executi 'myTestMethod'. De la mateixa manera, 'afterMethod' s'anota amb @AfterMethod i, per tant, s'executarà després de 'myTestMethod'.

Tot i això, abans de la classe s’anota @BeforeClass , el que significa que s'executarà fins i tot abans que s'executi la pròpia classe. El nostre nom de classe aquí és Anotacions de prova i, per tant, abans que la classe comenci a executar-se, s'executarà el tros de codi dins de 'beforeClass'. De la mateixa manera, 'afterClass' s'anota amb @AfterMethod , i així s'executaran després de la classe Anotacions de prova s'executa.

Si encara teniu confusió quant a l’ordre d’execució, el fragment següent us ajudarà definitivament.

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

La sortida del codi anterior serà:

Aquest fragment de codi s’executa abans que s’executi la classe Aquest fragment de codi s’executa abans del mètode: - myTestMethod Mètode Inside: - myTestMethod 1493192682118 geckodriver INFO Escolta a 127.0.0.1:13676 1493192682713 mozprofile :: profile INFO Usant la ruta del perfil C: UsersVardhanAppDataLocalTemp ust_moz .wGkcwvwXkl2y 1493192682729 geckodriver :: marionette INFO Inici del navegador C: fitxers de programa (x86) Mozilla Firefoxirefox.exe 1493192682729 geckodriver :: marionette INFO Connexió a Marionette a localhost: 59792 [GPU 6152] AVÍS: error de canonada: 109: /moz2_slave/m-rel-w32-0000000000000000000000/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, línia 346 1493192688316 Marionette INFO Escolta al port 59792 26 d'abril de 2017 1:14:49 PM org. openqa.selenium.remote.ProtocolHhakeHands createSession INFO: Dialecte detectat: error JavaScript W3C: http://t.dtscout.com/i/?l=http%3A%2F%2Fwww.seleniumframework.com%2FPracticeform%2F&j=, línia 1: TypeError: document.getElementsByTagNa jo (...) [0] no està definit Selenium Framework | Practiceform 1493192695134 Marionette INFO Ja no s'acceptaran noves connexions 26 d'abril de 2017 13:14:57 PM org.openqa.selenium.os.UnixProcess destroy SEVERE: No es pot matar el procés amb PID 6724 Aquest fragment de codi s'executa després del mètode: - myTestMethod Aquest fragment de codi s'executa després d'executar la classe PASSAT: myTestMethod =================================== ============ Prova de prova predeterminada Execució de les proves: 1, Fallades: 0, Omet: 0 ========================= ======================= ============================ ==================== Suite predeterminada Execució total de proves: 1, Fallades: 0, Omet: 0 =============== =================================

Com es pot veure a la sortida anterior, el nombre de proves executades és 1 i les fallides són 0. Això significa que el codi té èxit. Fins i tot l’ordre d’execució dels mètodes estarà en l’ordreJoesmentat anteriorment.

Quan executeu aquest codi a la vostra màquina, Selenium WebDriver instanciarà el navegador Firefox, anirà al formulari de pràctiques de Selenium Framework, tancarà la instància del navegador i mostrarà la mateixa sortida que es mostra a l’Eclipse IDE.

Només he fet servir 5 anotacions diferents al meu codi. Però hi ha moltes més anotacions que es poden utilitzar per controlar el següent mètode a executar. A la llista completa d 'anotacions s'explicataulabaix:

@BeforeSuite - El mètode anotat amb @BeforeSuite s'executarà abans que s'executin totes les proves de la suite.

@AfterSuite - El mètode anotat amb @AfterSuite s'executarà després que s'hagin executat totes les proves de la suite.

@BeforeTest - El mètode anotat amb @BeforeTest s'executarà abans que s'executi qualsevol mètode de prova pertanyent a una classe.

@AfterTest - El mètode anotat amb @AfterTest s'executarà després que s'executin tots els mètodes de prova pertanyents a una classe.

diferència entre final i final a java

@BeforeGroup - El mètode anotat amb @BeforeGroup s'executarà abans que s'executi cada grup.

@AfterGroup - El mètode anotat amb @AfterGroup s'executarà després que s'executi cada grup.

@BeforeClass - El mètode anotat amb @BeforeClass s'executarà una vegada abans que s'invoqui el primer mètode de prova de la classe actual.

@Després de classe - El mètode anotat amb @Després de classe s'executarà una vegada que s'hagin executat tots els mètodes de prova de la classe actual.

@BeforeMethod - El mètode anotat amb @BeforeMethod s'executarà abans que s'executi qualsevol mètode de prova dins d'una classe.

@AfterMethod - El mètode anotat amb @AfterMethod s'executarà després d'executar tots els mètodes de prova dins d'una classe.

@Prova - El mètode anotat amb @Prova és el mètode principal de prova de tot el programa. Altres mètodes anotats s’executaran al voltant d’aquest mètode.

La captura de pantalla de l'informe TestNG éspresent a continuació: -

Priorització

Hem parlat de com es poden definir diferents mètodes de manera que s'executin al voltant del @Prova mètode. Però, i si en teniu més d’un @Prova mètode i voleu definir l'ordre d'execució entre ells?

En aquest cas, podemPàgriorititzeu-los assignant un número als casos de prova anotats. Com més petit sigui el nombre, més alta serà la prioritat. Es pot assignar prioritat com a paràmetres mentre es defineixen els casos de prova. Però, si no s’assigna cap prioritat, els mètodes de prova anotats s’executaran segons l’ordre alfabètic de les proves. Vegeu els paràmetres de les anotacions de prova a la part inferior decodi.

@Test (Prioritat = 2) public static void FirstTest () {system.out.println ('Aquest és el cas de prova número dos a causa de la prioritat # 2')} @Test (Priority = 1) public static void SecondTest () { system.out.println ('Aquest és el cas de prova número u per la prioritat núm. 1')} @Test public static void FinalTest () {system.out.println ('Aquest és el cas de prova final perquè no hi ha prioritat' )}}

Desactivació de casos de prova

Permeteu-me que us mostri alguna cosa més interessant. Què passa si teniu un codi que abasta un milió de línies, que consta de centenars de casos de prova, i només voleu desactivar un mètode de prova? No cal que suprimiu cap part del codi, simplement podem desactivar aquest mètode de prova.

L'acció de desactivar un cas de prova també es fa mitjançant paràmetres. Podem configurar el activat atribut a 'fals'. Per defecte, tots els casos de prova estaran habilitats, per tant no cal definir-los cada vegada que escrivim una prova. Mireu els paràmetres del tercer i quart mètodes a la peça següent decodi.

@Test (Priority = 2, enabled = True) public static void FirstTest () {system.out.println ('Aquest és el cas de prova número dos a causa de la prioritat # 2')} @Test (Priority = 1, enabled = True ) public static void SecondTest () {system.out.println ('Aquest és el cas de prova número u a causa de la prioritat # 1')} @Test (habilitat = fals) public static void SkippedTest () {system.out.println ( 'Aquest és el cas de prova omès perquè s'ha desactivat')} @Test (enabled = True) public static void FinalTest () {system.out.println ('Aquest és el cas de prova final, que està habilitat i no té prioritat ')}

Dependència del mètode

Ara, en cas que tingueu una situació en què voleu que un fragment de codi només s’executi si compleix una condició o només si un mètode concret s’executa amb èxit, ho podem fer utilitzant DepènOnMètode (). Aquesta és bàsicament una condició de dependència del mètode on s’executarà un mètode en funció d’un altre mètode. Si a més ho configurem sempreCorre atribut a true, el mètode s’executarà independentment de la condició fallida / passada del mètode que depengui. Mireu el codi al fragment de codi següent.

@Test public static void FirstTest () {system.out.println ('Aquest és el primer cas de prova que s'executa')} @Test (dependeOnMethods = {'FirstTest'}) public static void SecondTest () {system.out. println ('Aquest és el segon cas de prova que s'executa Aquest és un mètode dependent')} @Test (DependeOnMethods = {'SecondTest'}) public static void FinalTest () {system.out.println ('Aquesta és la prova final Cas S'executarà de totes maneres. ')}

Ara, això ens porta a un altre aspecte important de la provaanotacions que és Agrupació .

Agrupació

A hores d'ara, heu de saber que hi haurà diversos mètodes com a part del nostre cas de prova al codi. Suposem que hi ha 100 casos de prova, però volem executar només 20 casos de prova en la nostra propera prova. Creieu que podem fer-ho? És clar que podem.

Podem utilitzar grups atribut amb aquest propòsit. Podem assignar un nom de grup a diversos casos de prova i, posteriorment, optar per executar el grup en lloc de tot el codi. Mireu el fragment de codi següent per entendre-hocom crear grups.

@Test (groups = {'MyGroup'}) public static void FirstTest () {system.out.println ('Aquesta és una part del grup: MyGroup')} @Test (groups = {'MyGroup'}) public static void SecondTest () {system.out.println ('Aquesta també és una part del grup: MyGroup')} @Test public static void ThirdTest () {system.out.println ('Però, això no forma part del Grup: El meu grup ')}

Assercions TestNG

Ara ens porta al següent tema de TestNG, que són les afirmacions. Com el seu nom indica, les afirmacions es poden utilitzar en mètodes de prova per determinar la condició de superació / suspensió d'una prova. Basant-se en la condició veritable / falsa d'una declaració, les proves superaran / fallaran.

Al codi següent he inclòs 3 mètodes de prova, en què el primer i el tercer mètodes tenen una condició de superació i el segon mètode té una condició de fallada. Consulteu el codi per vosaltres mateixos.

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 public class Assertions {@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 ('This is a pass condition')} @Test public void testEquality2 () {Assert.assertEquals (true, isEqual (10, 11)) System.out.println ('This is a fail condition')} @Test public void getTitle () {WebDriver driver = new FirefoxDriver () driver. get ('https://www.gmail.com') String title = driver.getTitle () Assert.assertEquals (title, 'Gmail') System.out.println ('Això torna a ser una condició de pas')} }

Quan mireu l'informe que es genera després d'aquesta execució, notareu que de les tres proves, una ha fallat i dues han passat. Un altre punt important a tenir en compte és que quan falla una afirmació, se saltaran altres ordres / línies de codi en aquesta prova. Només quan l'afirmació tingui èxit, la següent línia de codi s'executarà en aquesta prova. Consulteu la sortida següent a on system.out.println s'ha executat només per al primer i el tercer mètodes.

1493277977348 geckodriver INFO Escolta a 127.0.0.1:47035 1493277977993 mozprofile :: perfil INFO Utilització del camí de perfil C: UsersVardhanAppDataLocalTemp ust_mozprofile.Z7X9uFdKODvi 1493277977994 geckodriver :: marionette INFO x86x86 Connexió a Marionette a localhost: 50758 [GPU 6920] AVÍS: error de canonada: 109: fitxer c: / builds / moz2_slave / m-rel-w32-00000000000000000000 / build / src / ipc / chromium / src / chrome / common / ipc_channel_win. cc, línia 346 1493277981742 Marioneta INFO Escolta al port 50758 27 d'abril de 2017 12:56:22 PM org.openqa.selenium.remote.ProtocolHandhake createSession INFO: Dialecte detectat: W3C Aquesta és de nou una condició de passada Aquesta és una condició de passada PASSADA: getTitle PASSED: testEquality1 FALLAT: testEquality2 java.lang.AssertionError: s'esperava [false] però s'ha trobat [true] a org.testng.Assert.fail (Assert.java:93) a org.testng.Assert.failNotEquals (Assert.java: 512) a org.testng.Assert.assertE qualsImpl (Assert.java:134) a org.testng.Assert.assertEquals (Assert.java:115) a org.testng.Assert.assertEquals (Assert.java:304) a org.testng.Assert.assertEquals (Assert.java : 314) a testng.Assertions.testEquality2 (Assertions.java:38) a sun.reflect.NativeMethodAccessorImpl.invoke0 (Mètode Natiu) a sun.reflect.NativeMethodAccessorImpl.invoke (Font desconeguda) a sun.reflect.DelegatingMethod (Unknown) Source) a java.lang.reflect.Method.invoke (Font desconeguda) a org.testng.internal.MethodInvocationHelper.invokeMethod (MethodInvocationHelper.java:108) a org.testng.internal.Invoker.invokeMethod (Invoker.java:661) a org.testng.internal.Invoker.invokeTestMethod (Invoker.java:869) a org.testng.internal.Invoker.invokeTestMethods (Invoker.java:1193) a org.testng.internal.TestMethodWorker.invokeTestMethods (Test: ) a org.testng.internal.TestMethodWorker.run (TestMethodWorker.java:109) a org.testng.TestRunner.privateRun (TestRunner.java:744) a org.testng.TestRu nner.run (TestRunner.java:602) a org.testng.SuiteRunner.runTest (SuiteRunner.java:380) a org.testng.SuiteRunner.runSequentially (SuiteRunner.java:375) a org.testng.SuiteRunner.privateRun (SuiteRunner .java: 340) a org.testng.SuiteRunner.run (SuiteRunner.java:289) a org.testng.SuiteRunnerWorker.runSuite (SuiteRunnerWorker.java:52) a org.testng.SuiteRunnerWorker.run (SuiteRunnerWorker.java:86) a org.testng.TestNG.runSuitesSequentially (TestNG.java:1301) a org.testng.TestNG.runSuitesLocally (TestNG.java:1226) a org.testng.TestNG.runSuites (TestNG.java:1144) a org.test. TestNG.run (TestNG.java:1115) a org.testng.remote.AbstractRemoteTestNG.run (AbstractRemoteTestNG.java:132) a org.testng.remote.RemoteTestNG.initAndRun (RemoteTestNG.java:230) a org.test .RemoteTestNG.main (RemoteTestNG.java:76) ======================================= ======== Prova per defecte Execució de proves: 3, Fracassos: 1, Omet: 0 ============================= =================== ================================ ================ Suite predeterminada Execució total de proves: 3, Fallades: 1, Omet: 0 ==================================== ============

Per tant, aquest és el final dels conceptes relacionats amb la gestió de casos de prova. Ens queda un tema més, que és la generació d'informes. La generació d'informes és l'últim tema d'aquest tutorial de Selenium WebDriver perquè els informes només es poden generar després de tots elss'executen les proves.

com copiar en profunditat a Java

Generació d’informes

El més important que heu de tenir en compte és que l'informe només es generarà mitjançant un fitxer .xml. Això vol dir que, ja sigui un mètode, sigui una classe o sigui un grup que vulgueu provar, s'han d'especificar tots al fitxer .xml.

Per tant, primer podeu crear una carpeta nova al vostre projecte i crear un fitxer nou dins d’aquesta carpeta i donar-li un nom al fitxer i desar-lo amb l’extensió .xml. Podeu crear la carpeta i el fitxer nous fent clic amb el botó dret a l'explorador de paquets. Un cop hàgiu creat el fitxer, aneu a la pestanya font de la part inferior de la finestra i introduïu les configuracions tal com s’especifica al fragment següent.

 

La primera línia és la definició del tipus de document XML. Això és estàndard i obligatori per a tots els informes de proves. Però, les altres línies s’expliquen per si mateixes. He utilitzat les etiquetes obertes per a suites, proves, classes i classes. L’etiqueta Classes pot tenir una o més classes al seu interior. Per tant, es pot utilitzar si volem generar un informe on estem provant diverses classes. Això és útil especialment per als desenvolupadors que vulguin provar un llarg fragment de codi.

De totes maneres, tornant al nostre informe, podeu anomenar cada suite, prova o classe després d'obrir aquestes etiquetes i recordar de tancar totes les etiquetes que obriu. He donat el meu nom de suite com a TestNGs , nom de la prova com Prova Anotacions i el nom de la classe com testng.TestAnnotations. Tingueu en compte que el nom de la classe té el format de ' nom del paquet.nom de classe ' .

Quan executeu aquest fitxer com a suite TestNG, s'iniciarà l'execució i obtindreu els informes de proves detallats. Obtingueu la sortida de prova a la pestanya de la consola i el resultat de la suite de proves a la pestanya següent. L'informe que he generat per executar el meu codi ésdinsla captura de pantalla següent. Notareu que aquesta vegada hi ha el nom de la suite, el nom de la prova i el nom de la classe juntament amb el temps necessari per executar-los.

En cas que vulgueu veure l'informe HTML (informe d'índex o informe per correu electrònic), podeu anar a sortida-prova dins del directori del projecte a l'espai de treball. En fer-hi clic, podeu veure els informes fins i tot en un moment posterior. A continuació es mostren les seves captures de pantalla.

Informe d’índexs : -

Informe enviable per correu electrònic : -

Això ens porta al final d’aquest bloc de tutories de Selenium WebDriver. És hora que configureu l'eclipsi al final, instal·leu els diversos paquets Selenium, instal·leu TestNG i comenceu a escriure els casos de prova.

Podeu consultar el següent vídeo tutorial de Selenium WebDriver per presenciar una demostració dels diversos conceptes explicats en aquest bloc.

Formació en seleni | Marc TestNG per al seleni Edureka

Aquest vídeo d’Edureka Selenium Training us guiarà en els detalls detallats de Selenium WebDriver. Aquest vídeo tutorial de Selenium és ideal tant per a principiants com per a professionals que vulguin aprofundir en els conceptes bàsics de les ordres de WebDriver i conèixer com es pot utilitzar TestNG amb Selenium per gestionar diversos casos de prova.

Si voleu aprendre Selenium i construir una carrera professional en el domini de les proves, consulteu el nostre interactiu en línia aquí, ve amb suport 24 * 7 per guiar-lo durant tot el període d'aprenentatge.

Tens alguna pregunta? Esmenta’l a la secció de comentaris i et respondrem.