testng annotations listeners
Aquest tutorial explica els diferents tipus d’anotacions i oients de TestNG. També aprendreu a utilitzar les anotacions i els oients TestNG amb exemples:
Aquí, executarem un programa bàsic TestNG mitjançant anotacions TestNG i també veurem el paper dels oients TestNG i com utilitzar-los en les proves.
=> Llegiu la sèrie d'entrenaments Easy TestNG.
Què aprendreu:
Què són les anotacions TestNG?
Aquests són el programa o la lògica empresarial que s’utilitza per controlar el flux de mètodes. Tenen un paper molt important a TestNG. Aquestes anotacions difereixen en cada projecte segons els requisits. El flux d’anotacions continua sent el mateix en tots els programes malgrat els diferents requisits.
Hi ha diferents tipus d’anotacions TestNG que fan que TestNG sigui més fàcil i millor que JUnit. Cadascuna d'aquestes anotacions s'executarà en un esdeveniment específic a TestNG.
Tipus d'anotacions a TestNG
A continuació es mostren les llistes d'anotacions i els seus atributs que s'utilitzen a TestNG. Explorem amb detall i els seus usos.
Abans
- @BeforeSuite: Aquest mètode s'executarà abans que s'executin totes les proves de la suite.
- @BeforeTest: Aquest mètode s'executarà abans de declarar cada secció de prova a la suite.
- @BeforeClass: Aquest mètode s'executarà abans del primer mètode de prova de la classe actual.
- @BeforeMethod: Aquest mètode s'executarà abans de cada mètode de prova.
- @BeforeGroups: Aquest mètode s’executarà abans d’esmentar qualsevol mètode de prova del grup especificat.
- @Prova : Marca una classe o un mètode com a part de la prova. O podem dir que fa un mètode com a mètode de prova.
Després
- @AfterSuite: Aquest mètode s'executarà després que s'executin totes les proves de la suite.
- @AfterTest: Aquest mètode s'executarà després de declarar cada secció de prova a la suite.
- @Després de classe: Aquest mètode s'executarà després de l'últim mètode de prova de la classe.
- @AfterMethod: Aquest mètode s'executarà després d'executar cada mètode de prova.
- @AfterGroups: Aquest mètode s'executarà després que s'executi l'últim mètode de prova del grup especificat.
Flux de treball d’anotacions
Quan executem el fitxer TestNG.xml, les anotacions TestNG s’executaran en la següent seqüència:
Before Suite-> Before Test-> Before Class-> Before Method-> @Test -> After Method-> After Class-> After Test-> After Suite-
@BeforeSuite @BeforeTest @BeforeClass @BeforeMethod @Test @AfterMethod @AfterClass @AfterTest @AfterSuite
@Prova té molts altres atributs que ens ajuden a executar els nostres casos de prova de manera més eficaç.
A continuació es mostren els tipus d’atributs i les seves descripcions amb exemples.
# 1) Executa sempre: Quan s'estableix en true, aquest mètode s'executarà fins i tot si depèn d'un mètode que ha fallat.
Exemple: Prova (alwaysRun = true)
# 2) dataProvider : Mostra el nom del proveïdor de dades per a aquest mètode. Només té atributs, és a dir, nom. El podem utilitzar quan provem el nostre programari amb diversos conjunts de dades en temps d’entrada o d’execució. Això també es coneix com a prova basada en dades. Podem fer proves basades en dades mitjançant aquest atribut.
Exemple: @dataProvider (name = ”TestData”)
# 3) dataProviderClass : Aquest atribut us permetrà especificar la classe de proveïdor de dades que contindrà el proveïdor de dades que utilitzarà el mètode @Test.
Exemple: @Test (dataProvider = 'Prova de dades de client', dataProviderClass = ClientDetailsTest.class)
# 4) dependsOnGroups : Aquest atribut depèn de la llista de grups, és a dir, el mètode de prova començarà a executar-se només després que s’executin els grups dependents.
Nota : Si falla alguna de les proves dels grups que depenen, s'ometrà aquesta prova.
A continuació es mostra l'exemple:
@Test(groups= “homepage”) public void homepageTest(){ System.out.println('Home Page displayed successfully'); } @Test(groups= “transactionspage”) Public void transactionpageTest(){ System.out.println(“Transaction Page displayed successfully”); } @Test(dependsOnGroups={“homepage”, “transactionspage”}) public void dependOnGroupTest1(){ System.out.println(“dependency tested successful”);
# 5) dependsOnMethods : Aquesta anotació depèn de la llista de mètodes. Això significa que el mètode de prova començarà a executar-se només després que s’executin els mètodes dependents.
Nota : Si falla alguna de les proves dels mètodes dependents, s'ometrà aquesta prova.
Exemple:
@Test public void loginTest() { System.out.println(“Login Tested Successfully”); } @Test public void homepageTest() { System.out.println(“Home Page Tested Successfully”); } @Test(dependsOnMethods={“ loginTest”, “homepageTest”}) public void smokeTest() { System.out.println(“Smoke Tests were done successfully”);
# 6) alwaysRun = true: Podem establir els atributs d’un mètode de prova a true, i això obligarà a executar-la, fins i tot si algunes de les proves del grup depenen d’un error.
Per exemple:
@Test public void launchAppTest() { System.out.println(“Application launched Successfully”); } @Test public void loginAppTest() { System.out.println(“Application logged in Successfully”); } @Test(dependsOnMethods={“launchAppTest”, “loginAppTest”}, alwaysRun=true) public void smokeTest() { System.out.println(“Smoke Test were done successfully”); }
# 7) descripció : Proporciona la descripció del mètode. En general, conté un resum d'una línia.
Exemple:
@Test(description = “Regression Test Summary”)
# 8) activat : Aquest atribut ajuda a especificar si volem executar / executar el mètode de prova concret a la suite / classe actual o no. De vegades no volem fer algunes proves a causa d’alguns motius com que el requisit / la funció canvia sovint i no volem molestar l’execució actual d’aquesta funció en particular.
En aquests casos, simplement podem ignorar / desactivar aquesta prova en particular establint aquesta funció com a @Test (activat = fals).
Exemple:
@Test(enabled = false) public void imageTest() {//We have disabled this test by giving enabled=false System.out.println(“Image was tested successfully()”); }
# 9) Excepcions esperades : Aquest atribut mostra la llista d'excepcions que el mètode de prova llançarà durant el temps d'execució. Si no es produeixen excepcions ni cap altra excepció per al mètode, la prova es marca com un error.
Exemple:
@Test(expectedExceptions = ArithmeticException.class) public void numericTest() { int i = 1 / 0; }
# 10) grups : Aquest atribut s'utilitza per especificar els grups als quals pertany el mètode de prova.
@Test(groups = {“Regression”}) Public void runRegressionTest(){ System.out.println(“test runs were successful”); }
# 11) prioritat : Això ajuda a prioritzar els mètodes de prova, mentre que la prioritat per defecte comença amb 0 i les proves s’executen en ordre ascendent.
Exemple:
@Test Public void launchApp(){ System.out.println(“Application was launched successfully”): } @Test (priority = 1) Public void loginApp(){ System.out.println(“Application logged in successfully”); } @Test (priority = 2) Public void checkTrans(){s System.out.println(“Checked Transactions successfully”); }
Resultats: A continuació es mostren els resultats segons la prioritat, tot i que no s’ha assignat cap número a la primera prova, per defecte va prendre la seva prioritat com a 0 i l’execució es va fer en ordre ascendent.
Aprovat: launchApp
Aprovat: loginApp
Aprovat: checkTrans
# 12) temps d'espera : Aquest atribut ajuda a especificar un valor de temps d'espera per a la prova (generalment s'utilitza com a mil·lisegons). Si la prova supera el valor de temps d'espera especificat, la prova es marca com a fallada. Podem utilitzar aquest temps d’espera per fer una prova de rendiment, per assegurar-nos que el mètode torna en un termini raonable.
@Test(timeOut = 500) public void timeTest() throws InterruptedException { Thread.sleep(400); System.out.println(“Time test method successfully tested”); }
# 13) invocationCount : Aquest atribut ajuda a determinar el nombre de vegades que s'ha d'invocar un mètode de prova.
@Test(invocationCount = 5) public void loginTest() { WebDriver driver = new FirefoxDriver(); driver.get('http://www.google.com'); System.out.println('Page Title is ' + driver.getTitle()); driver.quit();
Sortida:
El títol de la pàgina és Google
El títol de la pàgina és Google
El títol de la pàgina és Google
El títol de la pàgina és Google
El títol de la pàgina és Google
# 14) invocationTimeOut: Aquest és el temps màxim (nombre de mil·lisegons) que hauria de passar aquesta prova per a tots els recomptes d'invocació. Aquest mètode s’ha d’utilitzar juntament amb el mètode de recompte d’invocacions o bé s’ignoraria.
Exemple:
@Test(invocationCount=4, invocationTimeOut=4000) public void loginTest(){ Thread.sleep(1000); System.Out.println(“login Test”); }
L'exemple anterior mostra que aquesta prova trigarà un total de 4 segons a executar-se i que cada vegada que s'invoqui / execute la prova, trigaria 1 segon a executar-se.
# 15) @DataProvider : Aquest mètode ajuda a subministrar dades per a un mètode de prova. Primer, hem de declarar un mètode anotat per @DataProvider i, a continuació, utilitzar aquest mètode en el mètode de prova requerit mitjançant l'atribut 'DataProvider' a l'anotació @Test.
Un proveïdor de dades retorna una matriu d'objectes, especialment una matriu d'objectes bidimensionals () (). La primera matriu representa un conjunt de dades i la segona matriu conté els paràmetres.
@DataProvider (name = 'Prova'): aquí, el nom representa el nom del proveïdor de dades. Si no es dóna el nom, el nom del DataProvider es definirà automàticament al nom del mètode.
Exemple:
@DataProvider(name = “Name”) public object()() credentials(){ return new object ()() { { “Mohan”, “23”}, { “Shikhar”, “30”} }; } //Now we are calling the Data Provider object by its name @Test(DataProvider = “Name”) Public void testData(String sName, int age) { System.out.println(“Data is: (Name, age)”); }
# 16) @Fàbrica : S'utilitza per especificar un mètode com a fàbrica per proporcionar objectes que TestNG ha d'utilitzar per a les seves classes de prova. Mitjançant l’ús de @Factory, podem crear proves dinàmiques en temps d’execució i hauria de retornar un objecte de matriu.
Exemple:
Prenguem un exemple per entendre-ho millor. Crearem dues classes, és a dir, FactorySample.Java i FactoryTest.Java
FactorySample.Java
public class FactorySample { @Test public void googleTest() { System.out.println(“Google was launched successfully”); } @Test public void gmailLogin() { System.out.println(“Gmail logged in successfully”); }
FactoryTest.Java
public class FactoryTest { @Factory() public Object() testFact() { FactorySample fs = new FactorySample(2); fs(0) = new googleTest(); fs(1) = new gmailLogin(); return fs; } }
Sortida : Google es va llançar amb èxit
Gmail ha iniciat la sessió correctament
Diferència entre les anotacions @Factory i @DataProvider
Hi ha una diferència bàsica entre les dues anotacions. Hi ha molta confusió quant a aquestes dues anotacions, com ara on utilitzar-les i per què?
Anem a trobar les respostes.
@DataProvider: Aquesta anotació parametritzarà el mètode de prova concret i executarà la prova en un número específic. de vegades basat en les dades proporcionades per aquest mètode.
Per exemple, si hi ha dos paràmetres, el mètode de prova s'executarà dues vegades. Per exemple, si volem iniciar sessió en un lloc amb diferents conjunts de noms d’usuari i contrasenyes cada vegada, és útil ja que hem de proporcionar els paràmetres per provar.
@Fàbrica : S'executaran tots els mètodes de prova presents al fitxer de classe de prova mentre s'utilitza una instància independent d'aquesta classe. Això és útil si volem executar la classe de prova diverses vegades.
Per exemple , si hem de provar la funció d’inici de sessió d’alguna aplicació o lloc web i com que hem d’executar aquesta prova diverses vegades, és millor utilitzar @Factory on podem crear diverses instàncies de prova i executar-les.
Vegem aquests exemples per conèixer la diferència.
Exemple @DataProvider :
@DataProvider public Object()() message(){ return new Object ()(){{“Mihir” , new Integer (145632)}, {“Kumar”, new Integer (28242)}}; } @Test (dataProvider=”message”) public void PrintMsg(String name, Integer id){ System.out.println(“Names are: “+name+” “+id); }
Nota : Al programa anterior hem proporcionat dues dades i el resultat del programa seria:
Els noms són: Mihir 145632
Els noms són: Kumar 28242
Això demostra que si augmentem el nombre de dades en el mètode de missatge, el mètode d'impressió executarà el mateix nombre de vegades.
Exemple @Factory :
TestNG Factory és molt útil quan hem d'executar diverses classes de prova amb una sola classe de prova.
Vegem un exemple.
Per a això, hem de crear dues classes de prova amb pocs mètodes de prova al seu interior.
Dades de prova 1:
public class TestData1 { @Test public void testData1() { System.out.println('Test data 1 successfully tested'); } }
Dades de prova 2:
public class TestData2 { @Test public void testData2() { System.out.println('Test data 2 successfully tested'); } }
Ara hem de definir el mètode @Factory que retorna una matriu d'objectes de les classes definides anteriorment.
Programa de fàbrica:
public class TestNGFactory { @Factory() public Object() getTestClass() { Object() tests = new Object(2); tests(0) = new Test Data 1(); tests(1) = new Test Data 2(); return tests; } }
Sortida:
Mètode de prova Test1
Mètode de prova Test2
SUPERAT: test1
APROVAT: test2
Oients TestNG amb tipus
En termes senzills, els oients escolten l'esdeveniment definit a l'escriptura Selenium i es comporten d'acord amb ell. L’objectiu principal és crear registres i personalitzar els informes TestNG.
Hi ha molts tipus d’oients disponibles a TestNG.
Per exemple , IAnnotationTransformer, IAnnotationTransformer2, IConfigurable, IConfigurationListener, IConfigurationListener2, IExecutionListener, IHookable, IInvokedMethodListener, IInvokedMethodListener2, IMethodInterceptor, IReporter, ISuiteListener
No obstant això, quan es tracta de proves, només en fem servir algunes, tal com es descriu a continuació:
# 1) ISuiteListener
És un oient per a les suites de proves. Consta de dos mètodes, és a dir, onStart () i onFinish () .
Sempre que implementem aquest oient, garantirà que l'usuari final invocarà els mètodes onStart () i onFinish () abans i després d'executar una suite TestNG.
Detalls del mètode:
void onStart (suite ISuite) : Aquest mètode s'invoca abans que s'iniciï el Suite Runner.
void onFinish (suite ISuite) : Aquest mètode s'invoca després que Suite Runner hagi executat totes les suites de prova.
Exemple:
@Override public void onStart(ISuite suite) { System.out.println(“TestNG Suite Starts”); } @Override public void onFinish(ISuite suite) { System.out.println(“TestNG Suite Finishes”); }
# 2) ITestListener
Aquest oient funciona igual que ISuiteListener. Tot i això, l’única diferència és que fa la trucada abans i després de la prova i no a la Suite. És un oient per a l'execució de proves i aquest oient té set mètodes.
(i) onStart () :Aquest mètode s’invoca després d’instanciar la classe de prova i abans de cridar qualsevol mètode de configuració.
Exemple:
@Override public void onStart(ITestContext context) { System.out.println(“Context Name = ” + context.getName()); }
(ii) onFinish () :Aquest mètode s’invoca després que s’executin totes les proves i s’anomenin tots els mètodes de configuració.
Exemple:
public void onFinish(ITestContext context) { System.out.println(context.getPassedTests()); }
(iii) onTestStart () :Aquest mètode s’invoca cada vegada que s’invoca una prova. L'ITestResult només s'omple parcialment amb les referències a classe, mètode, millis inicials i estat.
Mètode: void onTestStart (resultat ITestResult)
Exemple:
@Override public void onTestStart(ITestResult result) { System.out.println('Test Started…'+result.getStartMillis()); }
(iv) onTestSuccess () :Aquest mètode s'invoca cada vegada que una prova té èxit.
Mètode: void onTestSuccess (resultat ITestResult)
Exemple:
@Override public void onTestSuccess(ITestResult result) { System.out.println('Test Success. '+result.getEndMillis()); }
(v) onTestFailure () :Aquest mètode s'invoca cada vegada que falla una prova.
Mètode: void onTestFailure (resultat ITestResult)
Exemple:
@Override public void onTestFailure(ITestResult result) { System.out.println('Test Failed. '+result.getTestName()); }
(vi) onTestSkipped () :Aquest mètode s'invoca cada vegada que s'omet una prova.
Mètode: void onTestSkipped (resultat ITestResult)
Exemple:
@Override public void onTestSkipped(ITestResult result) { System.out.println('Test Skipped. '+result.getTestName()); }
(vii) onTestFailedButWithinSuccessPercentage :Aquest mètode s'invoca cada vegada que falla un mètode, però s'ha anotat amb un percentatge d'èxit i el fracàs el manté dins del percentatge d'èxit.
Mètode: void onTestFailedButWithinSuccessPercentage (resultat ITestResult)
Exemple:
@Override public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) { System.out.println('Test failed but it is in defined success ratio ' + getTestMethodName(iTestResult)); }
# 3) IExecutionListener
És un oient que controla el començament i el final d’una execució de TestNG. Té dos mètodes, és a dir, onExecutionStart () i onExecutionFinish () .
es diu el mètode onExecutionStart () abans que el TestNG comenci a executar les suites i el mètode onExecutionFinish () després que es faci TestNG amb l'execució de totes les suites de prova.
Mètode:
void onExecutionStart ()
void onExecutionFinish ()
Exemple:
@Override public void onExecutionStart() { System.out.println('TestNG is going to start'); } @Override public void onExecutionFinish() { System.out.println('TestNG is finished'); }
# 4) IInvokedMethodListener
És un oient que s’invoca abans i després que TestNG invoca un mètode. Aquest oient només s’invoca per a configuracions i mètodes de prova. Només té dos mètodes, és a dir, afterInvocation i beforeInvocation.
- abans de la invitació: Invoca abans de cada mètode.
- afterInvocation: Invoca després de cada mètode.
Mètode:
void beforeInvocation (mètode IInvokedMethod, ITestResult testResult)
void afterInvocation (mètode IInvokedMethod, ITestResult testResult)
Exemple:
@Override public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { System.out.println('before invocation of ' + method.getTestMethod().getMethodName()); } @Override public void afterInvocation(IInvokedMethod method, ITestResult testResult) { System.out.println('after invocation of ' + method.getTestMethod().getMethodName()); }
# 5) IMethodInterceptor
Aquesta classe s’utilitza per alterar la llista de mètodes de prova que TestNG executarà. Mitjançant l'ús d'aquest mètode podem reordenar la llista de mètodes de prova.
Només s’aplica als mètodes que no tenen dependents i es passaran els paràmetres als mètodes que no depenguin de cap altre mètode de prova. Aquesta interfície retornarà una llista de mètodes de prova que cal executar però de manera diferent.
Mètode:
millor aplicació per comprovar la temperatura de la CPU
Intercepció java.util.List (mètodes java.util.List, context ITestContext)
Exemple:
@Override public Listintercept(Listmethods, ITestContext context) { List result = new ArrayList(); for (IMethodInstance m : methods) { Test test = m.getMethod().getMethod().getAnnotation(Test.class); Setgroups = new HashSet(); for (String group : test.groups()) { groups.add(group); } if (groups.contains('sanity')) { result.add(m); } else { String testMethod = m.getMethod().getMethodName(); System.out.println(testMethod + ' not a SANITY test so not included'); } } return result; }
# 6) IReporter
Això és implementat pels clients per generar un informe. Aquest mètode s'invocarà un cop s'hagi executat tota la suite i els paràmetres donin tots els resultats de la prova que van passar durant aquesta execució.
Mètode:
void generateReport (java.util.List xmlSuites, java.util.List suites, java.lang.String outputDirectory)
Exemple:
@Override public void generateReport(List xmlSuites, List suites, String outdir) { try { writer = createWriter(outdir); } catch (IOException e) { System.err.println('Unable to create output file'); e.printStackTrace(); return; } startHtml(writer); writeReportTitle(reportTitle); generateSuiteSummaryReport(suites); generateMethodSummaryReport(suites); generateMethodDetailReport(suites); endHtml(writer); writer.flush(); writer.close(); }
Conclusió
En aquest article, hem vist com les anotacions TestNG poden ser útils per facilitar la lògica del nostre programa. Les anotacions s’utilitzen segons calgui.
Podeu passar els paràmetres a les anotacions i fer proves basades en dades també. Podeu executar els casos de prova per grups i estalviar temps. Amb els oients, fins i tot podeu generar els informes. No creieu que això sigui meravellós?
TestNG.xml s'explicarà detalladament al nostre proper tutorial. Aquest fitxer XML és l’eix vertebrador del marc TestNG i ens ajudarà a executar els nostres casos de prova.
=> Consulteu la guia de formació Perfect TestNG aquí.
Lectura recomanada
- Més informació sobre com s'utilitzen les anotacions TestNG al seleni (amb exemples)
- Afirmacions en seleni mitjançant marcs Junit i TestNG
- Introducció a JUnit Framework i el seu ús a Selenium Script - Selenium Tutorial # 11
- 30+ millors tutorials sobre seleni: apreneu el seleni amb exemples reals
- Exemple TestNG: Com crear i utilitzar el fitxer TestNG.xml
- JMeter Listeners: analitzar els resultats amb diferents oients
- Com s'utilitza el marc TestNG per crear scripts de Selenium - Tutorial # 12 de TestNG Selenium
- Tutorial Eclipse: integració de TestNG a Eclipse Java IDE