Selen WebDriver: TestNG för testfallshantering och rapportgenerering



Denna Selenium WebDriver-handledning hjälper dig att förstå behovet av att använda TestNG med Selenium för att hantera testfall och generera detaljerade testrapporter.

I den tidigare bloggen lärde jag dig hur du kör ditt första Selenium WebDriver-test. I den här bloggen kommer jag att behandla avancerade Selen WebDriver-koncept. Jag har redan nämnt ganska många gånger att Selenium WebDriver har begränsningar med avseende på testfallshantering och generering av testrapporter. Så, vad är alternativet? Ett så populärt verktyg som Selen måste definitivt ha en lösning, eller hur? Naturligtvis gör det det! Vi kan använda en kombination av selen och TestNG för att slå denna begränsning och det kommer att vara ämnet för bloggens diskussion.

vad är logger i java

Om du är ny på Selen och vill ha en introduktion till de grundläggande begreppen kan du börja din resa härifrån: ? De andra kan dock komma igång med TestNG för Selen från den här bloggen.Du bör också veta att organisationer aktivt letar efter proffs med , vilket gör det till en viktig färdighet för programvarutestare att bemästra.





Mjukvaruutvecklare från hela världen kommer enhälligt överens om att skriva kod i testfall sparar en stor del av deras felsökningstid. Varför? Det beror på att testfall hjälper till att skapa robust och felfri kod. Hur gör det? Genom att dela upp hela koden i mindre testfall och sedan genom att utvärdera vart och ett av dessa testfall till godkända / misslyckade förhållanden kan vi skapa felfri kod. Eftersom Selen inte stöder exekvering av kod i testfall måste vi använda TestNG för detsamma. Det är här TestNG passar in i Selen-ramverket.

TestNG står för Testa nästa generation och det är en open source-testautomatiseringsram inspirerad av JUnit och NUnit. Tja, inte bara inspirerad, utan en uppgradering till de två ramarna. Så du kan fråga vad är uppgraderingen här?Uppgraderingen med TestNG är att den ger ytterligare funktionalitet som: testanteckningar, gruppering, prioritering, parameterisering och sekvenseringstekniker i koden som inte var möjlig tidigare.



Förutom att hantera testfall kan även detaljerade rapporter om test erhållas med TestNG. Det kommer att finnas en sammanfattning som visar testfallet som har misslyckats, tillsammans med gruppen som det var en del av och den klass det faller under. När buggar kan lokaliseras korrekt så kan de fixas omedelbart till utvecklarnas lättnad. Bilden nedan visar hur TestNG fungerar.

testng - selen webdriver

Så, hur gör TestNG jobbet gjort? Denna fråga kommer att besvaras inästa avsnitt i den här Selenium WebDriver-handledningsbloggen, där jag kommer att diskutera hur man hanterar olika testfall genom att använda TestNG.



Selen WebDriver With TestNG

Testfall kan definieras och hanteras på något av följande sätt:

  1. Testa anteckningar
  2. Prioritering
  3. Inaktiverar testfall
  4. Metodberoende
  5. Gruppering
  6. Påståenden
  7. Rapportgenerering

Låt mig börja förklaravar och en av dessa funktioner.

Testa anteckningar

Låt oss först ställa oss den här frågan: Varför behöver vi använda anteckningar? När kan vi använda dem? Anteckningar i selen används för att kontrollera nästa metod som ska köras. Testanteckningar definieras före varje metod i testkoden. Om någon metod inte är prefix med anteckningar ignoreras den metoden och körs inte som en del av testkoden. För att definiera dem måste metoder helt enkelt antecknas med ” @Testa '. Titta till exempel på kodavsnittet nedan.

paket testng importera org.openqa.selenium.WebDriver importera org.openqa.selenium.firefox.FirefoxDriver importera org.testng.annotations.AfterClass importera org.testng.annotations.AfterMethod importera org.testng.annotations.BeforeClass importera org.testng.annotations .BeforeMethod importerar 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/ ') String title = driver.getTitle () System.out.println (title) driver.quit ()} @BeforeMethod public void beforeMethod () {System.out.println (' This kod kod körs före metod: - myTestMethod ') System.setProperty (' webdriver.gecko.driver ',' C: UsersVardhanworkspaceSeleniumProjectfilesgeckodriver.exe ')} @AfterMethod public ogiltig afterMethod () {System.out.println (' Denna bit av kod körs efter metod: - myTestMethod ')} @BeforeClass public void beforeClass () {Syste m.out.println ('Denna kod kod körs innan klassen körs')} @AfterClass public void afterClass () {System.out.println ('Denna kod kod körs efter att klassen körs')} }

I koden ovan skulle du ha märkt att jag inte har definierat en 'huvud' -metod. Jag har dock definierat 5 andra metoder. De är 'myTestMethod', 'beforeMethod', 'afterMethod', 'beforeClass' och 'afterClass'. Notera också ordningsföljden för definition av metoder i koden eftersom de inte kommer att köras i samma ordning.

Metoden ”myTestMethod” antecknas med @Testa , och det är den viktigaste metoden eller kodstycket som måste köras. Andra antecknade metoder kommer att köras före och efter att den här metoden har körts. Eftersom ”beforeMethod” kommenteras med @BeforeMethod kommer den att köras innan 'myTestMethod' körs. På samma sätt kommenteras 'afterMethod' med @AfterMethod , och därmed kommer den att köras efter 'myTestMethod'.

Men 'beforeClass' antecknas med @Innan lektionen , vilket innebär att den kommer att köras redan innan själva klassen körs. Vårt klassnamn här är TestAnnotations , och därmed innan klassen börjar köras kommer kodstycket inuti 'beforeClass' att köras. På samma sätt kommenteras ”afterClass” med @AfterMethod och kommer därför att köras efter klassen TestAnnotations utförs.

Om du fortfarande har förvirring angående orderns utförande, kommer det här utdraget definitivt att hjälpa dig.

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

Utgången från ovanstående kod kommer att vara:

Denna kod kod exekveras innan klassen körs Denna kod kod körs före metod: - myTestMethod Insida metod: - myTestMethod 1493192682118 geckodriver INFO Listening on 127.0.0.1:13676 1493192682713 mozprofile :: profile INFO Using profile path C: UsersVardhanAppDataLocalTemp profile .wGkcwvwXkl2y 1493192682729 geckodriver :: marionette INFO Starta webbläsare C: Programfiler (x86) Mozilla Firefoxirefox.exe 1493192682729 geckodriver :: marionette INFO Ansluter till Marionette på localhost: 59792 [GPU 6152] VARNING: pipfel: 109: fil: c: /moz2_slave/m-rel-w32-00000000000000000000/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 346 1493192688316 Marionette INFO Lyssnar på port 59792 26 april 2017 13:14:49 org. openqa.selenium.remote.ProtocolHandshake createSession INFO: Detekterad dialekt: W3C JavaScript-fel: http://t.dtscout.com/i/?l=http%3A%2F%2Fwww.seleniumframework.com%2FPracticeform%2F&j=, line 1: TypeError: document.getElementsByTagNa mig (...) [0] är odefinierad Selen Framework | Practiceform 1493192695134 Marionette INFO Nya anslutningar accepteras inte längre 26 apr 2017 13:14:57 org.openqa.selenium.os.UnixProcess förstör ALLVÄN: Det går inte att döda processen med PID 6724 Denna kod kod körs efter metod: myTestMethod Denna kod kodas efter att klassen har körts PASSED: myTestMethod ====================================== ============ Standardtest Testkörning: 1, Fel: 0, Hoppar över: 0 ========================== ====================================================== ==================== Standardpaket Totalt antal körningar: 1, Fel: 0, Hoppar över: 0 ================ ==================================

Som du kan se från ovanstående utgång är antalet testkörningar 1 och misslyckades 0. Detta betyder att koden är framgångsrik. Även ordningen för utförande av metoder kommer att finnas i ordningenJagnämnde tidigare.

När du kör den här koden på din maskin kommer Selenium WebDriver att starta din Firefox-webbläsare, navigera till Selenium Framework-övningsformuläret, stäng webbläsarinstansen och visa samma utdata som visas ovan i din Eclipse IDE.

Jag har bara använt 5 olika anteckningar i min kod. Men det finns många fler anteckningar som kan användas för att styra nästa metod som ska köras. Hela listan med anteckningar förklaras itabellNedan:

@BeforeSuite - Metoden antecknad med @BeforeSuite körs innan alla tester i sviten har körts.

@AfterSuite - Metoden antecknad med @AfterSuite körs efter att alla tester i sviten har körts.

@BeforeTest - Metoden antecknad med @BeforeTest körs innan någon testmetod som tillhör en klass körs.

@AfterTest - Metoden antecknad med @AfterTest körs efter att alla testmetoder som tillhör en klass har körts.

@BeforeGroup - Metoden antecknad med @BeforeGroup körs innan varje grupp körs.

@AfterGroup - Metoden antecknad med @AfterGroup körs efter varje grupp körs.

@Innan lektionen - Metoden antecknad med @Innan lektionen körs en gång innan den första testmetoden i den aktuella klassen åberopas.

@Efter lektionen - Metoden antecknad med @Efter lektionen körs en gång efter att alla testmetoder i den aktuella klassen har körts.

@BeforeMethod - Metoden antecknad med @BeforeMethod körs innan någon testmetod inuti en klass körs.

@AfterMethod - Metoden antecknad med @AfterMethod körs efter varje testmetod inuti en klass körs.

@Testa - Metoden antecknad med @Testa är den huvudsakliga testmetoden i hela programmet. Andra antecknade metoder kommer att köras kring den här metoden.

Skärmdumpen av TestNG-rapporten ärnärvarande nedan: -

Prioritering

Vi pratade om hur olika metoder som kan definieras så att de körs runt @Testa metod. Men tänk om du har mer än en @Testa metod och vill du definiera körningsordningen mellan dem?

I så fall kan viPompröva dem genom att tilldela ett nummer till de antecknade testfallen. Ju mindre antal desto högre prioritet. Prioritet kan tilldelas som parametrar när testfall definieras. Men om ingen prioritet tilldelas kommer de antecknade testmetoderna att utföras enligt alfabetisk ordning av testerna. Titta på parametrarna för testanteckningarna i nedanstående del avkoda.

@Test (Priority = 2) public static void FirstTest () {system.out.println ('This is the Test Case number Two due of Priority # 2')} @Test (Priority = 1) public static void SecondTest () { system.out.println ('Detta är testfallet nummer ett på grund av prioritet # 1')} @ Test offentligt statiskt ogiltigt FinalTest () {system.out.println ('Detta är det sista testfallet eftersom det inte finns någon prioritet' )}

Inaktiverar testfall

Låt mig visa dig något mer intressant. Vad händer om du har en kod som spänner över en miljon rader, bestående av hundratals testfall, och du bara vill inaktivera en testmetod? Du behöver inte ta bort någon del av koden istället, vi kan helt enkelt inaktivera den testmetoden.

åsidosätta vs överbelastning c ++

Handlingen att inaktivera ett testfall görs också via parametrar. Vi kan ställa in aktiverad attribut till ”falskt”. Som standard kommer alla testfall att aktiveras, därför behöver vi inte definiera dem varje gång vi skriver ett test. Titta på parametrarna för den tredje och fjärde metoden i nedanstående del avkoda.

@Test (Priority = 2, enabled = True) public static void FirstTest () {system.out.println ('This is the Test Case number Two due of Priority # 2')} @Test (Priority = 1, enabled = True ) public static void SecondTest () {system.out.println ('This is the Test Case number One due to Priority # 1')} @Test (enabled = false) public static void SkippedTest () {system.out.println ( 'Detta är det hoppade testfallet eftersom detta har inaktiverats')} @ Test (aktiverat = Sann) offentligt statiskt ogiltigt FinalTest () {system.out.println ('Detta är det slutliga testfallet, som är aktiverat och har ingen prioritet ')}

Metodberoende

Om du har en situation där du vill att en kod ska exekveras endast om den uppfyller ett villkor eller bara om en viss metod körs framgångsrikt, kan vi göra det genom att använda dependsOnMethod (). Detta är i grunden ett villkor för metodberoende där en metod kommer att köras beroende på en annan metod. Om vi ​​dessutom ställer in kör alltid attribut till true, så kommer metoden att köras oavsett fail / pass-tillståndet för den beroende metoden. Titta på koden i kodavsnittet nedan.

@Test public static void FirstTest () {system.out.println ('This is the first Test Case to be executed')} @Test (dependsOnMethods = {'FirstTest'}) public static void SecondTest () {system.out. println ('Detta är det andra testfallet som ska köras Detta är en beroende metod')} @Test (dependsOnMethods = {'SecondTest'}) offentlig statisk ogiltig FinalTest () {system.out.println ('This is the Final Test Fall Det kommer att köras ändå. ')}

Nu tar det oss till en annan viktig aspekt i testetanteckningar som är Gruppering .

Gruppering

Nu måste du veta att det kommer att finnas ett antal metoder som en del av vårt testfall i koden. Låt oss säga att det finns 100 testfall, men vi vill bara utföra 20 testfall i vårt nästa test. Tror du att vi kan göra det? Säker på att vi kan.

Vi kan använda grupper attribut för detta ändamål. Vi kan tilldela ett gruppnamn till ett antal testfall och senare välja att köra gruppen istället för hela koden. Titta på kodavsnittet nedan för att förståhur man skapar grupper.

@Test (groups = {'MyGroup'}) public static void FirstTest () {system.out.println ('This is a part of the Group: MyGroup')} @Test (groups = {'MyGroup'}) public static void SecondTest () {system.out.println ('This is also a part of the Group: MyGroup')} @Test public static void ThirdTest () {system.out.println ('But, this is not a part of the Grupp: Min grupp ')}

TestNG-påståenden

Detta tar oss nu till nästa ämne i TestNG som är påståenden. Som namnet antyder kan påståenden användas i testmetoder för att bestämma godkänd / underkänd tillstånd ett test. Baserat på det sanna / falska tillståndet i ett uttalande kommer testerna att klara / misslyckas.

I koden nedan har jag inkluderat tre testmetoder, där den första och den tredje metoden har ett godkänt tillstånd och den andra metoden kommer att ha ett misslyckande. Se koden själv.

paket 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 offentliga klass påståenden {@BeforeMethod offentliga ogiltiga föreMethod () {System.setProperty ('webdriver.gecko.driver', 'C: UsersVardhanworkspaceSeleniumProjectfilesgeckodriver.exe')} offentlig boolean ärEqual (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 ogiltig 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 ('This is again a pass condition')} }

När du tittar på rapporten som genereras efter den här körningen kommer du att märka att av de tre testerna misslyckades en och två godkändes. En annan viktig punkt att notera är att när ett påstående misslyckas kommer andra kommandon / kodrader i det testet att hoppas över. Först när påståendet är framgångsrikt kommer nästa rad kod att köras i det testet. Kolla in produktionen nedan var system.out.println har endast utförts för den första och tredje metoden.

1493277977348 geckodriver INFO Listening on 127.0.0.1:47035 1493277977993 mozprofile :: profile INFO Användning av profilväg C: UsersVardhanAppDataLocalTemp ust_mozprofile.Z7X9uFdKODvi 1493277977994 geckodriver :: marionette INFO gsxx1: BIOS-kod: BIOS Ansluter till Marionette på localhost: 50758 [GPU 6920] VARNING: rörfel: 109: fil c: / builds / moz2_slave / m-rel-w32-00000000000000000000 / build / src / ipc / chromium / src / chrome / common / ipc_channel_win. cc, rad 346 1493277981742 Marionette INFO Lyssnar på port 50758 27 apr 2017 12:56:22 org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Upptäckt dialekt: W3C Detta är återigen ett passvillkor Detta är ett godkänt tillstånd PASSAD: getTitle PASSED: testEquality1 FAILED: testEquality2 java.lang.AssertionError: förväntat [false] men hittades [true] vid org.testng.Assert.fail (Assert.java:93) vid org.testng.Assert.failNotEquals (Assert.java: 512) vid org.testng.Assert.assertE qualsImpl (Assert.java:134) at org.testng.Assert.assertEquals (Assert.java:115) at org.testng.Assert.assertEquals (Assert.java:304) at org.testng.Assert.assertEquals (Assert.java : 314) vid testng.Assertions.testEquality2 (Assertions.java:38) vid sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) vid sun.reflect.NativeMethodAccessorImpl.invoke (Okänd källa) vid sun.reflect.DelegatingMethodAccess Källa) på java.lang.reflect.Method.invoke (Okänd källa) vid org.testng.internal.MethodInvocationHelper.invokeMethod (MethodInvocationHelper.java:108) på org.testng.internal.Invoker.invokeMethod (Invoker.java:661) vid org.testng.internal.Invoker.invokeTestMethod (Invoker.java:869) vid org.testng.internal.Invoker.invokeTestMethods (Invoker.java:1193) på org.testng.internal.TestMethodWorker.invokeTestMethods (Test.jethodWor ) vid org.testng.internal.TestMethodWorker.run (TestMethodWorker.java:109) vid org.testng.TestRunner.privateRun (TestRunner.java:744) vid org.testng.TestRu nner.run (TestRunner.java:602) på org.testng.SuiteRunner.runTest (SuiteRunner.java:380) vid org.testng.SuiteRunner.runSequentially (SuiteRunner.java:375) på org.testng.SuiteRunner.privateRun (SuiteRunner .java: 340) på org.testng.SuiteRunner.run (SuiteRunner.java:289) på org.testng.SuiteRunnerWorker.runSuite (SuiteRunnerWorker.java:52) på org.testng.SuiteRunnerWorker.run (SuiteRunnerWorker.java:86) vid org.testng.TestNG.runSuitesSequentially (TestNG.java:1301) vid org.testng.TestNG.runSuitesLocally (TestNG.java:1226) vid org.testng.TestNG.runSuites (TestNG.java:1144) vid org.testng. TestNG.run (TestNG.java:1115) vid org.testng.remote.AbstractRemoteTestNG.run (AbstractRemoteTestNG.java:132) vid org.testng.remote.RemoteTestNG.initAndRun (RemoteTestNG.java:230) vid org.testng.r .RemoteTestNG.main (RemoteTestNG.java:76) ============================================ ======== Standardtest Testkörning: 3, Fel: 1, Hoppar över: 0 =============================== ===================================================== ================= Standardpaket Totalt antal testkörningar: 3, Fel: 1, Hoppar över: 0 ====================================== ============

Så det är slutet på begreppen relaterade till testfallshantering. Vi sitter kvar med ytterligare ett ämne, och det är generering av rapporter. Rapportgenerering är det sista ämnet i denna Selenium WebDriver-handledning eftersom rapporter bara kan skapas efter allatest utförs.

Java förvandlas dubbelt till int

Rapportgenerering

Det viktigaste du behöver notera är att rapporten bara genereras via en .xml-fil. Det betyder, vare sig det är en metod, eller det är en klass, eller det är en grupp som du vill testa, de måste alla anges i .xml-filen.

Så först kan du skapa en ny mapp under ditt projekt och skapa en ny fil i den mappen och ge ett namn till filen och spara den med .xml-tillägget. Du kan skapa den nya mappen och filen genom att högerklicka på paketutforskaren. När du har skapat filen går du till källfliken längst ner i fönstret och anger konfigurationerna som anges i utdraget nedan.

 

Den första raden är definitionen av XML-dokumenttyp. Detta är standard och obligatoriskt för alla testrapporter. Men de andra raderna är ganska självförklarande. Jag har använt de öppna taggarna för svit, test, klasser och klass. Klasser-taggen kan ha en eller flera klasser inuti. Således kan den användas om vi vill skapa en rapport där vi testar flera klasser. Detta är praktiskt speciellt för utvecklare som vill testa en lång kod.

Hur som helst att komma tillbaka till vår rapport, du kan namnge varje svit eller test eller klass efter att ha öppnat dessa taggar och kom ihåg att stänga varje tagg du öppnar. Jag har gett mitt svitenamn som TestNG , testnamn som Testa Kommentarer och klassnamn som testng.TestAnnotations. Observera att klassnamnet är i formatet '' packagename.classname ’ .

När du kör den här filen som TestNG-svit startar körningen och du får detaljerade testrapporter. Du kommer att få testutmatningen i konsolfliken och resultatet av testpaketet på nästa flik. Rapporten som jag har genererat för att köra min kod ärinedanstående skärmdump. Du kommer att märka att den här gången finns ett svitnamn, testnamn, klassnamn tillsammans med den tid det tar att köra var och en av dem.

Om du vill visa HTML-rapporten (indexrapport eller e-postrapport) kan du gå till testutgång i projektkatalogen i din arbetsyta. Genom att klicka på dem kan du visa rapporterna även vid en senare tidpunkt. Nedan följer deras skärmdumpar.

Indexrapport : -

E-postmeddelande : -

Så det tar oss till slutet av den här Selenium WebDriver-handledningsbloggen. Det är dags för dig att ställa in förmörkelse i slutet, installera de olika Selen-paketen, installera TestNG och komma igång med att skriva dina testfall.

Du kan kolla in nedanstående Selenium WebDriver-handledningsvideo för att bevittna en demonstration av de olika koncepten som förklaras i den här bloggen.

Selenutbildning | TestNG Framework For Selen | Edureka

Den här Edureka Selenium Training-videon tar dig igenom de detaljerade detaljerna i Selenium WebDriver. Den här Selenium-självstudievideoen är idealisk för både nybörjare och yrkesverksamma som vill klistra in grunderna i WebDriver-kommandon och lära sig hur TestNG kan användas med Selenium för att hantera olika testfall.

Om du vill lära dig selen och bygga en karriär inom testdomänen, kolla in vår interaktiva, live-online här kommer det med 24 * 7 support för att vägleda dig under hela din inlärningsperiod.

Har du en fråga till oss? Vänligen nämna det i kommentarfältet så återkommer vi till dig.