Selenium WebDriver: TestNG per la gestione dei casi di test e la generazione di report

Questo tutorial Selenium WebDriver ti aiuterà a capire la necessità di utilizzare TestNG con Selenium per la gestione dei casi di test e la generazione di rapporti di prova dettagliati.

Nel blog precedente, ti ho insegnato come eseguire il tuo primo test Selenium WebDriver. In questo blog tratterò i concetti avanzati di Selenium WebDriver. Ho già accennato diverse volte che Selenium WebDriver ha dei limiti per quanto riguarda la gestione dei casi di test e la generazione di rapporti di prova. Quindi qual è l'alternativa? Uno strumento così popolare come il selenio deve sicuramente avere una soluzione alternativa, giusto? Certo che lo fa! Possiamo utilizzare una combinazione di Selenium e TestNG per superare questa limitazione e questo sarà l'argomento della discussione di questo blog.

come creare un jframe in java

Nel caso in cui tu sia nuovo di Selenium e desideri un'introduzione ai concetti di base, puoi iniziare il tuo viaggio da qui: ? Tuttavia, gli altri possono iniziare con TestNG for Selenium da questo blog.Dovresti anche sapere che le organizzazioni stanno attivamente cercando professionisti con , rendendola un'abilità importante da padroneggiare per i tester del software.





Gli sviluppatori di software di tutto il mondo concorderanno all'unanimità che scrivere codice in casi di test consente di risparmiare una buona parte del loro tempo di debug. Perché? Questo perché i test case aiutano nella creazione di codice robusto e privo di errori. Come lo fa? Suddividendo l'intero codice in casi di test più piccoli e quindi valutando ciascuno di questi casi di test in condizioni di superamento / fallimento, possiamo creare codice privo di errori. Poiché Selenium non supporta l'esecuzione del codice nei casi di test, dobbiamo usare TestNG per lo stesso. È qui che TestNG si inserisce nel framework Selenium.

TestNG sta per Prova la prossima generazione ed è un framework di automazione dei test open source ispirato a JUnit e NUnit. Bene, non solo ispirato, ma un aggiornamento a questi due framework. Quindi potresti chiedere qual è l'aggiornamento qui?L'aggiornamento con TestNG è che fornisce funzionalità aggiuntive come: annotazioni di test, raggruppamento, prioritizzazione, parametrizzazione e tecniche di sequenziamento nel codice che non era possibile in precedenza.



Oltre a gestire i casi di test, anche i rapporti dettagliati dei test possono essere ottenuti utilizzando TestNG. Ci sarà un riepilogo che mostra lo scenario di test che ha fallito, insieme al gruppo di cui faceva parte e alla classe in cui rientra. Quando i bug possono essere individuati con precisione in questo modo, possono essere risolti immediatamente con sollievo degli sviluppatori. L'immagine sotto mostra il funzionamento di TestNG.

testng - webdriver selenio

Quindi, come fa TestNG a portare a termine il lavoro? Questa domanda riceverà risposta inla sezione successiva di questo blog tutorial Selenium WebDriver, dove discuterò come gestire vari casi di test utilizzando TestNG.



Selenio WebDriver con TestNG

I casi di test possono essere definiti e gestiti in uno dei seguenti modi:

  1. Annotazioni di prova
  2. Priorità
  3. Disattivazione dei casi di test
  4. Dipendenza dal metodo
  5. Raggruppamento
  6. Asserzioni
  7. Generazione di report

Vorrei iniziare a spiegareciascuna di queste funzionalità.

Annotazioni di prova

Prima di tutto, poniamoci questa domanda: perché dobbiamo usare le annotazioni? Quando possiamo usarli? Le annotazioni in Selenium vengono utilizzate per controllare il prossimo metodo da eseguire. Le annotazioni di prova vengono definite prima di ogni metodo nel codice di prova. Nel caso in cui un metodo non sia preceduto da annotazioni, quel metodo verrà ignorato e non verrà eseguito come parte del codice di test. Per definirli, i metodi devono essere semplicemente annotati con ' @Test '. Guarda ad esempio lo snippet di codice sottostante.

pacchetto 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/ ') String title = driver.getTitle () System.out.println (title) driver.quit ()} @BeforeMethod public void beforeMethod () {System.out.println (' This parte di codice viene eseguita prima del metodo: - myTestMethod ') System.setProperty (' webdriver.gecko.driver ',' C: UsersVardhanworkspaceSeleniumProjectfilesgeckodriver.exe ')} @AfterMethod public void afterMethod () {System.out.println (' This piece di codice viene eseguito dopo il metodo: - myTestMethod ')} @BeforeClass public void beforeClass () {Syste m.out.println ('Questa parte di codice viene eseguita prima che la classe venga eseguita')} @AfterClass public void afterClass () {System.out.println ('Questa parte di codice viene eseguita dopo che la classe è stata eseguita')} }

Nel codice sopra, avresti notato che non ho definito un metodo 'principale'. Tuttavia, ho definito altri 5 metodi. Sono 'myTestMethod', 'beforeMethod', 'afterMethod', 'beforeClass' e 'afterClass'. Inoltre, notare l'ordine di definizione dei metodi nel codice perché non verranno eseguiti nello stesso ordine.

Il metodo 'myTestMethod' è annotato con @Test , ed è il metodo o la parte di codice principale che deve essere eseguita. Altri metodi annotati verranno eseguiti prima e dopo l'esecuzione di questo metodo. Poiché 'beforeMethod' è annotato con @BeforeMethod , verrà eseguito prima dell'esecuzione di 'myTestMethod'. Allo stesso modo, 'afterMethod' è annotato con @AfterMethod , e quindi verrà eseguito dopo 'myTestMethod'.

Tuttavia, 'beforeClass' è annotato con @Prima della lezione , il che significa che verrà eseguito anche prima che la classe stessa venga eseguita. Il nome della nostra classe qui è TestAnnotations , e quindi prima che la classe inizi a essere eseguita, verrà eseguita la parte di codice all'interno di 'beforeClass'. Allo stesso modo, 'afterClass' è annotato con @AfterMethod , e quindi verrà eseguito dopo la lezione TestAnnotations viene eseguito.

Se hai ancora confusione riguardo all'ordine di esecuzione, lo snippet di seguito ti aiuterà sicuramente.

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

L'output del codice precedente sarà:

Questa parte di codice viene eseguita prima dell'esecuzione della classe Questa parte di codice viene eseguita prima del metodo: - myTestMethod Inside metodo: - myTestMethod 1493192682118 geckodriver INFO Ascolto su 127.0.0.1:13676 1493192682713 mozprofile :: profile INFO Utilizzo del percorso del profilo C: UsersVardhanAppDataLocalTempofile ust .wGkcwvwXkl2y 1493192682729 geckodriver :: marionette INFO Avvio del browser C: Programmi (x86) Mozilla Firefoxirefox.exe 1493192682729 geckodriver :: marionette INFO Connessione a Marionette su localhost: 59792 [GPU 6152] ATTENZIONE: errore pipe: 109: file c: / builds /moz2_slave/m-rel-w32-00000000000000000000/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, linea 346 1493192688316 Marionette INFO Listening on port 59792 26 aprile 2017 1:14:49 PM org. openqa.selenium.remote.ProtocolHandshake createSession INFO: dialetto rilevato: W3C Errore JavaScript: http://t.dtscout.com/i/?l=http%3A%2F%2Fwww.seleniumframework.com%2FPracticeform%2F&j=, riga 1: TypeError: document.getElementsByTagNa me (...) [0] è undefined Selenium Framework | Practiceform 1493192695134 Marionette INFO Nuove connessioni non saranno più accettate Apr 26, 2017 1:14:57 PM org.openqa.selenium.os.UnixProcess destroy SEVERE: Unable to kill process with PID 6724 Questa parte di codice viene eseguita dopo il metodo: - myTestMethod Questa parte di codice viene eseguita dopo che la classe è stata eseguita PASSED: myTestMethod =================================== ============ Test predefinito Test eseguiti: 1, Errori: 0, Salti: 0 ======================== ======================= =========================== ==================== Suite predefinita Totale test eseguiti: 1, Errori: 0, Salti: 0 =============== ================================

Come puoi vedere dall'output sopra, il numero di test eseguiti è 1 e falliti è 0. Ciò significa che il codice ha esito positivo. Anche l'ordine di esecuzione dei metodi sarà nell'ordineiomenzionato prima.

Quando esegui questo codice nella tua macchina, Selenium WebDriver creerà un'istanza del tuo browser Firefox, passerà al modulo di pratica di Selenium Framework, chiuderà l'istanza del browser e visualizzerà lo stesso output come mostrato sopra nel tuo IDE Eclipse.

Ho usato solo 5 annotazioni diverse nel mio codice. Ma ci sono molte altre annotazioni che possono essere usate per controllare il prossimo metodo da eseguire. L'intero elenco di annotazioni è spiegato neltavolosotto:

@BeforeSuite - Il metodo annotato con @BeforeSuite verrà eseguito prima che tutti i test nella suite siano stati eseguiti.

@AfterSuite - Il metodo annotato con @AfterSuite verrà eseguito dopo che tutti i test nella suite saranno stati eseguiti.

@BeforeTest - Il metodo annotato con @BeforeTest verrà eseguito prima di eseguire qualsiasi metodo di test appartenente a una classe.

@AfterTest - Il metodo annotato con @AfterTest verrà eseguito dopo che tutti i metodi di test appartenenti a una classe saranno stati eseguiti.

@BeforeGroup - Il metodo annotato con @BeforeGroup verrà eseguito prima che ogni gruppo venga eseguito.

@AfterGroup - Il metodo annotato con @AfterGroup verrà eseguito dopo che ogni gruppo è stato eseguito.

@Prima della lezione - Il metodo annotato con @Prima della lezione verrà eseguito una volta prima che venga richiamato il primo metodo di test nella classe corrente.

@Dopo la lezione - Il metodo annotato con @Dopo la lezione verrà eseguito una volta dopo che tutti i metodi di test nella classe corrente saranno stati eseguiti.

@BeforeMethod - Il metodo annotato con @BeforeMethod verrà eseguito prima di eseguire qualsiasi metodo di test all'interno di una classe.

@AfterMethod - Il metodo annotato con @AfterMethod verrà eseguito dopo l'esecuzione di ogni metodo di test all'interno di una classe.

@Test - Il metodo annotato con @Test è il metodo di test principale dell'intero programma. Altri metodi annotati verranno eseguiti attorno a questo metodo.

Lo screenshot del rapporto TestNG èpresente di seguito: -

crea istanza ec2 da snapshot

Priorità

Abbiamo parlato di come diversi metodi che possono essere definiti in modo tale da essere eseguiti intorno a @Test metodo. Ma cosa succede se ne hai più di uno @Test metodo e vuoi definire l'ordine di esecuzione tra di loro?

In tal caso, possiamoPrioritizzarli assegnando un numero ai casi di test annotati. Più piccolo è il numero, più alta è la priorità. La priorità può essere assegnata come parametri durante la definizione dei casi di test. Tuttavia, se non viene assegnata alcuna priorità, i metodi di test annotati verranno eseguiti secondo l'ordine alfabetico dei test. Guarda i parametri delle annotazioni di prova nella parte sottostante dicodice.

@Test (Priority = 2) public static void FirstTest () {system.out.println ('This is the Test Case number Two because of Priority # 2')} @Test (Priority = 1) public static void SecondTest () { system.out.println ('This is the Test Case Number One because of Priority # 1')} @Test public static void FinalTest () {system.out.println ('This is the Final Test Case because there is no Priority' )}

Disattivazione dei casi di test

Lascia che ti mostri qualcosa di più interessante. Cosa succede se si dispone di un codice che copre un milione di righe, composto da centinaia di casi di test, e si desidera disabilitare un solo metodo di test? Non è necessario eliminare alcuna parte del codice, invece, possiamo semplicemente disabilitare quel metodo di prova.

Anche l'atto di disabilitare un test case viene eseguito tramite parametri. Possiamo impostare il file abilitato attribuire a 'false'. Per impostazione predefinita, tutti i casi di test saranno abilitati, quindi non è necessario definirli ogni volta che scriviamo un test. Guarda i parametri del terzo e del quarto metodo nella parte sottostante dicodice.

@Test (Priority = 2, enabled = True) public static void FirstTest () {system.out.println ('This is the Test Case number Two because of Priority # 2')} @Test (Priority = 1, enabled = True ) public static void SecondTest () {system.out.println ('This is the Test Case number One because of Priority # 1')} @Test (enabled = false) public static void SkippedTest () {system.out.println ( 'Questo è il test case saltato perché è stato disabilitato')} @Test (enabled = True) public static void FinalTest () {system.out.println ('This is the Final Test case, che è abilitato e non ha priorità ')}

Dipendenza dal metodo

Ora, nel caso in cui tu abbia una situazione in cui, vuoi che un pezzo di codice venga eseguito solo se soddisfa una condizione o solo se un particolare metodo viene eseguito con successo, allora possiamo farlo usando dipendeOnMetodo (). Questa è fondamentalmente una condizione di dipendenza dal metodo in cui un metodo verrà eseguito in base a un altro metodo. Se impostiamo inoltre alwaysRun attributo a true, il metodo verrà eseguito indipendentemente dalla condizione di fail / pass del metodo dipendente. Guarda il codice nello snippet di codice sottostante.

@Test public static void FirstTest () {system.out.println ('Questo è il primo test case da eseguire')} @Test (dependOnMethods = {'FirstTest'}) public static void SecondTest () {system.out. println ('Questo è il secondo test case da eseguire Questo è un metodo dipendente')} @Test (dipendeOnMethods = {'SecondTest'}) public static void FinalTest () {system.out.println ('This is the Final Test Case It verrà eseguito comunque. ')}

Ora, questo ci porta a un altro aspetto importante del testannotazioni che è Raggruppamento .

Raggruppamento

A questo punto devi sapere che ci saranno una serie di metodi come parte del nostro test case nel codice. Supponiamo che ci siano 100 casi di test, ma vogliamo eseguire solo 20 casi di test nel nostro prossimo test. Pensi che possiamo farlo? Sicuro che possiamo.

Possiamo usare gruppi attributo per questo scopo. Possiamo assegnare un nome di gruppo a un numero di casi di test e in seguito scegliere di eseguire il gruppo invece dell'intero codice. Guarda lo snippet di codice qui sotto per capirecome creare gruppi.

@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 ('Anche questa è una parte del gruppo: MyGroup')} @Test public static void ThirdTest () {system.out.println ('Ma questo non fa parte del Gruppo: MyGroup ')}

Asserzioni TestNG

Questo ora ci porta all'argomento successivo in TestNG che sono le asserzioni. Come suggerisce il nome, le asserzioni possono essere utilizzate nei metodi di test per determinare la condizione di superamento / fallimento di un test. In base alla condizione vero / falso di un'istruzione, i test avranno esito positivo / negativo.

Nel codice seguente ho incluso 3 metodi di test, in cui il primo e il terzo metodo hanno una condizione di superamento e il secondo metodo avrà una condizione di fallimento. Guarda tu stesso il codice.

pacchetto 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 ('This is again a pass condition')} }

Quando guardi il report che viene generato dopo questa esecuzione, noterai che dei tre test, uno non è riuscito e due sono stati superati. Un altro punto importante da notare è che quando un'asserzione fallisce, altri comandi / righe di codice in quel test verranno ignorati. Solo quando l'asserzione ha esito positivo, la riga di codice successiva verrà eseguita in quel test. Controlla l'output qui sotto dove system.out.println è stato eseguito solo per il primo e il terzo metodo.

1493277977348 geckodriver INFO Listening on 127.0.0.1:47035 1493277977993 mozprofile :: profile INFO Utilizzo del percorso profilo C: UsersVardhanAppDataLocalTemp ust_mozprofile.Z7X9uFdKODvi 1493277977994 geckodriver :: marionette INFO programma marionette C: UsersVardhanAppDataLocalTemp ust_mozprofile. Connessione a Marionette su localhost: 50758 [GPU 6920] ATTENZIONE: errore pipe: 109: file c: / builds / moz2_slave / m-rel-w32-0000000000000000000000 / build / src / ipc / chromium / src / chrome / common / ipc_channel_win. cc, line 346 1493277981742 Marionette INFO Ascolto sulla porta 50758 27 aprile 2017 12:56:22 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Dialetto rilevato: W3C Questa è di nuovo una condizione di accettazione Questa è una condizione di accettazione SUPERATA: getTitle PASSED: testEquality1 FAILED: testEquality2 java.lang.AssertionError: atteso [false] ma trovato [true] in org.testng.Assert.fail (Assert.java:93) in org.testng.Assert.failNotEquals (Assert.java: 512) in org.testng.Assert.assertE qualsImpl (Assert.java:134) su org.testng.Assert.assertEquals (Assert.java:115) su org.testng.Assert.assertEquals (Assert.java:304) su org.testng.Assert.assertEquals (Assert.java : 314) su testng.Assertions.testEquality2 (Assertions.java:38) su sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) su sun.reflect.NativeMethodAccessorImpl.invoke (Fonte sconosciuta) su sun.reflect.DelegatingImethodAccessor Source) su java.lang.reflect.Method.invoke (Unknown Source) su org.testng.internal.MethodInvocationHelper.invokeMethod (MethodInvocationHelper.java:108) su org.testng.internal.Invoker.invokeMethod (Invoker.java:661) su org.testng.internal.Invoker.invokeTestMethod (Invoker.java:869) su org.testng.internal.Invoker.invokeTestMethods (Invoker.java:1193) su org.testng.internal.TestMethodWorker.invokeTestMethodva6 (TestMethodva6 ) su org.testng.internal.TestMethodWorker.run (TestMethodWorker.java:109) su org.testng.TestRunner.privateRun (TestRunner.java:744) su org.testng.TestRu nner.run (TestRunner.java:602) su org.testng.SuiteRunner.runTest (SuiteRunner.java:380) su org.testng.SuiteRunner.runSequentially (SuiteRunner.java:375) su org.testng.SuiteRunner.privateRun (SuiteRunner .java: 340) su org.testng.SuiteRunner.run (SuiteRunner.java:289) su org.testng.SuiteRunnerWorker.runSuite (SuiteRunnerWorker.java:52) su org.testng.SuiteRunnerWorker.run (SuiteRunnerWorker.java:86) su org.testng.TestNG.runSuitesSequentially (TestNG.java:1301) su org.testng.TestNG.runSuitesLocally (TestNG.java:1226) su org.testng.TestNG.runSuites (TestNG.java:1144) su org.testng. TestNG.run (TestNG.java:1115) su org.testng.remote.AbstractRemoteTestNG.run (AbstractRemoteTestNG.java:132) su org.testng.remote.RemoteTestNG.initAndRun (RemoteTestNG.java:230. su org.tote) .RemoteTestNG.main (RemoteTestNG.java:76) ======================================= ======== Test predefinito Test eseguiti: 3, Errori: 1, Salti: 0 ============================ =================== =============================== ================ Suite predefinita Totale test eseguiti: 3, Errori: 1, Salti: 0 =================================== ============

Quindi, questa è la fine dei concetti relativi alla gestione dei casi di test. Ci resta un altro argomento, ovvero la generazione di report. La generazione di report è l'ultimo argomento in questo tutorial Selenium WebDriver perché i report possono essere generati solo dopo tutto il filevengono eseguiti i test.

il metodo system.exit terminerà l'applicazione.

Generazione di report

La cosa più importante da notare è che il report verrà generato solo tramite un file .xml. Ciò significa che, sia che si tratti di un metodo, sia di una classe o di un gruppo che si desidera testare, devono essere tutti specificati nel file .xml.

Quindi prima puoi creare una nuova cartella sotto il tuo progetto e creare un nuovo file all'interno di quella cartella e dare un nome al file e salvarlo con estensione .xml. È possibile creare la nuova cartella e il nuovo file facendo clic con il pulsante destro del mouse su Esplora pacchetti. Dopo aver creato il file, vai alla scheda sorgente dalla parte inferiore della finestra e inserisci le configurazioni come specificato nello snippet di seguito.

 

La prima riga è la definizione del tipo di documento XML. Questo è standard e obbligatorio per tutti i rapporti di prova. Ma le altre righe sono piuttosto autoesplicative. Ho usato i tag aperti per suite, test, classes e class. Il tag Classes può contenere una o più classi al suo interno. Pertanto, può essere utilizzato se vogliamo generare un report in cui stiamo testando più classi. Questo è utile soprattutto per gli sviluppatori che vogliono testare un lungo pezzo di codice.

Comunque, tornando al nostro rapporto, puoi nominare ogni suite o test o classe dopo aver aperto quei tag e ricordarti di chiudere ogni tag che apri. Ho dato il nome della mia suite come TestNGs , nome del test come Test Annotazioni e il nome della classe come testng.TestAnnotations. Tieni presente che il nome della classe è nel formato ' packagename.classname ' .

Quando esegui questo file come suite TestNG, verrà avviata l'esecuzione e otterrai i rapporti di prova dettagliati. Otterrai l'output del test nella scheda della console e il risultato della suite di test nella scheda successiva. Il rapporto che ho generato per l'esecuzione del mio codice ènello screenshot qui sotto. Noterai che questa volta c'è un nome di suite, un nome di test, un nome di classe insieme al tempo impiegato per l'esecuzione di ciascuno di essi.

Nel caso in cui desideri visualizzare il rapporto HTML (rapporto indice o rapporto inviabile via email), puoi andare al uscita di prova cartella all'interno della directory del progetto nel tuo spazio di lavoro. Cliccandoci sopra è possibile visualizzare i report anche in un secondo momento. Di seguito sono riportati i loro screenshot.

Rapporto sull'indice : -

Rapporto inviabili via email : -

Quindi questo ci porta alla fine di questo blog tutorial Selenium WebDriver. È ora che tu possa configurare eclipse alla tua fine, installare i vari pacchetti Selenium, installare TestNG e iniziare a scrivere i tuoi casi di test.

Puoi guardare il video tutorial di Selenium WebDriver qui sotto per assistere a una dimostrazione dei vari concetti spiegati in questo blog.

Selenio Formazione | Framework TestNG per selenio | Edureka

Questo video di formazione Edureka Selenium ti guiderà attraverso i dettagli approfonditi di Selenium WebDriver. Questo video tutorial Selenium è ideale sia per principianti che per professionisti che vogliono rispolverare le basi dei comandi WebDriver e imparare come TestNG può essere utilizzato con Selenium per la gestione di vari casi di test.

Se desideri imparare il selenio e costruire una carriera nel dominio dei test, dai un'occhiata al nostro interattivo, live-online qui, viene fornito con supporto 24 * 7 per guidarti durante il tuo periodo di apprendimento.

Hai domande per noi? Per favore menzionalo nella sezione commenti e ti risponderemo.