TestNG Lyttere ind Selenium

⚡ Smart opsummering

Lyttere ind Selenium WebDriver er TestNG grænseflader, der opfanger testhændelser for at tilpasse logfiler, rapporter og handlinger efter fejl. Denne artikel forklarer ITestListener-metoder og gennemgår en kørbar Java eksempel, og forklarer hvordan Selenium 4 erstattede den forældede WebDriverEventListener.

  • ❓ Hvad lyttere gør: De abonnerer på TestNG Hændelser som start, bestået, fejlet og spring over for at drive logging eller rapporteringshooks.
  • 🧩 Tolv grænseflader: TestNG leverer grænseflader som ITestListener, ISuiteListener, IReporter, IInvokedMethodListener og IAnnotationTransformer til detaljeret kontrol.
  • 🛠️ To ledningsføringstilstande: Vedhæft en lytter med @Listeners-annotationen på en enkelt klasse, eller registrer den én gang inde i testng.xml for hver suite.
  • 🚀 Selenium 4 opdatering: EventFiringWebDriver er udfaset; den moderne WebDriverListener-grænseflade plus EventFiringDecorator driver nu event-hooks på WebDriver-niveau.
  • 🤖 AI-vinkel: AI-assisterede lyttere kan automatisk klassificere fejl, vedhæfte smarte skærmbilleder og sende ustabile testsignaler tilbage til CI-dashboards i realtid.

TestNG Lyttere ind Selenium

Selenium WebDriver-scripts skal ofte reagere på testhændelser såsom en bestået assertion, en mislykket locator eller et sprunget trin over. Listeners gør det muligt. Generelt set, Selenium Projekter er afhængige af to lytterfamilier:

  1. WebDriver-lyttere
  2. TestNG lyttere

I denne tutorial vil vi fokusere på TestNG Lyttere, med en note om hvordan lyttere på WebDriver-niveau ændrede sig i Selenium 4.x.

Hvad er en lytter i TestNG?

En lytter er en grænseflade, der ændrer standardadfærden for TestNGSom navnet antyder, "lytter" lyttere til begivenheder defineret i en Selenium script og reagere i overensstemmelse hermed. Du bruger dem ved at implementere den relevante Listener-grænseflade og registrere den på din testklasse eller -suite. Listeners giver dig mulighed for at tilpasse TestNG rapporter, vedhæft skærmbilleder og udsend strukturerede logfiler.

Typer af lyttere i TestNG

TestNG leverer en familie af lyttergrænseflader, og hver enkelt er målrettet mod et forskelligt stadie i testlivscyklussen.

Nedenfor er de almindeligt anvendte TestNG lyttere:

  1. IAnotationTransformer
  2. IAnotationTransformer2
  3. IKonfigurerbar
  4. IConfigurationListener
  5. IExecutionListener
  6. IHookable
  7. IInvokedMethodListener
  8. IIinvokedMethodListener2
  9. ImethodInterceptor
  10. IR-rapporter
  11. ISuiteListener
  12. ITestListener

Disse grænseflader bruges i Selenium at generere logfiler eller tilpasse TestNG rapporter. I denne vejledning vil vi implementere ITestListener.

ITestListener afslører følgende metoder:

  • onStart – kaldes når en test starter.
  • onTestSuccess – kaldes når en test er bestået.
  • onTestFailure – kaldes når en test mislykkes.
  • onTestSpringt Over – kaldes, når en test springes over.
  • ved testmislykket, men inden for succesprocent – kaldes når en test fejler, men er inden for succesprocenten.
  • ved afslutning – kaldes efter at alle tests i klassen er udført.

Testscenarie

I dette testscenarie vil vi automatisere loginprocessen og implementere ITestListener imod det.

  1. Launch Firefox og åbne siden https://demo.guru99.com/V4/

Testscenarie login URL

  1. Log ind på applikationen.

Loginformular til testscenarie

Trin til at oprette en TestNG Lytter

I testscenariet ovenfor implementerer vi Listener trin for trin.

Trin 1) Opret en klasse kaldet Lyttertest der implementerer ITestListenerHold musen over den røde understregning, og Eclipse vil foreslå to hurtige løsninger, som vist nedenfor:

Eclipse hurtig løsning til at tilføje uimplementerede metoder

Klik på “Tilføj ikke-implementerede metoder”. Flere stub-metoder (uden en brødtekst) tilføjes til din kode, svarende til dette:

pakke Lytter_Demo;

importere org.testng.ITestKontekst;
importere org.testng.ITestListener;
importere org.testng.ITestResult;

offentlig klasse Lyttertest redskaber ITestListener {

@Tilsidesæt
offentligt tomrum vedFærdig(ITestContext argument0) {
// TODO Autogenereret metodestub
}

@Tilsidesæt
offentligt tomrum vedStart(ITestContext argument0) {
// TODO Autogenereret metodestub
}

@Tilsidesæt
offentligt tomrum vedTestMislykkedesMenIndenforSuccesProcentdel(ITestresultat argument0) {
// TODO Autogenereret metodestub
}

@Tilsidesæt
offentligt tomrum vedTestFejl(ITestresultat argument0) {
// TODO Autogenereret metodestub
}

@Tilsidesæt
offentligt tomrum vedTestSpringt Over(ITestresultat argument0) {
// TODO Autogenereret metodestub
}

@Tilsidesæt
offentligt tomrum vedTestStart(ITestresultat argument0) {
// TODO Autogenereret metodestub
}

@Tilsidesæt
offentligt tomrum vedTestSucces(ITestresultat argument0) {
// TODO Autogenereret metodestub
}
}

Lad os nu ændre Lyttertest klasse. Vi vil især udfylde følgende metoder: vedTestFejl, vedTestSpringt Over, vedTestStartog vedTestSucces.

Ændringen er enkel: hver metode udskriver navnet på testen, så konsollen tydeligt viser status for bestået, ikke bestået og springet over.

Efter ændringen ser koden således ud:

pakke Lytter_Demo;

importere org.testng.ITestKontekst;
importere org.testng.ITestListener;
importere org.testng.ITestResult;

offentlig klasse Lyttertest redskaber ITestListener {

@Tilsidesæt
offentligt tomrum vedFærdig(ITestContext Resultat) {
}

@Tilsidesæt
offentligt tomrum vedStart(ITestContext Resultat) {
}

@Tilsidesæt
offentligt tomrum vedTestMislykkedesMenIndenforSuccesProcentdel(ITestresultat Resultat) {
}

// Når en testcase fejler, kaldes denne metode.
@Tilsidesæt
offentligt tomrum vedTestFejl(ITestresultat Resultat) {
System.out.println("Navnet på den mislykkede testcase er:" + Resultat.getNavn());
}

// Når en testcase springes over, kaldes denne metode.
@Tilsidesæt
offentligt tomrum vedTestSpringt Over(ITestresultat Resultat) {
System.out.println("Navnet på den oversprungne testcase er:" + Resultat.getNavn());
}

// Når en testcase starter, kaldes denne metode.
@Tilsidesæt
offentligt tomrum vedTestStart(ITestresultat Resultat) {
System.out.println(Resultat.getNavn() + "Testcase startet");
}

// Når en testcase består, kaldes denne metode.
@Tilsidesæt
offentligt tomrum vedTestSucces(ITestresultat Resultat) {
System.out.println("Navnet på den beståede testcase er:" + Resultat.getNavn());
}
}

Trin 2) Opret en anden klasse kaldet TestCases til automatisering af login. Selenium vil udføre denne klasse for at logge ind på demosiden.

pakke Lytter_Demo;

importere org.openqa.selenium.By;
importere org.openqa.selenium.WebDriver;
importere org.openqa.selenium.firefox.FirefoxChauffører;
importere org.testng.Assert;
importere org.testng.annotations.Lyttere;
importere org.testng.annotations.Test;

offentlig klasse TestCases {
webdriver chauffør = ny FirefoxChauffør();

// Test designet til at bestå, for at verificere succesen med lytteren.
@Prøve
offentligt tomrum Log ind() {
chauffør.get("https://demo.guru99.com/V4/");
driver.findElement(Efter.navn("uid")).sendNøgler("mngr34926");
driver.findElement(Efter.navn("Adgangskode")).sendNøgler("amUpenu");
driver.findElement(Efter.navn("btnLogin")).klik();
}

// Tvungen mislykket test for at verificere den fejlbehæftede lytter.
@Prøve
offentligt tomrum TestTilFejl() {
System.out.println("Denne testmetode mislykkes");
Assert.assertTrue(falsk);
}
}

Trin 3) Dernæst skal du vedhæfte denne lytter til vores testklasse TestCasesDer er to måder at forbinde en klasse til en lyttergrænseflade.

Den første måde er at bruge @Lyttere annotering, som vist nedenfor:

@Listeners(Listener_Demo.ListenerTest.class)

Vi tilføjer denne anmærkning ovenfor TestCases klasse. Klassen ser så sådan ud:

pakke Lytter_Demo;

importere org.openqa.selenium.By;
importere org.openqa.selenium.WebDriver;
importere org.openqa.selenium.firefox.FirefoxChauffører;
importere org.testng.Assert;
importere org.testng.annotations.Lyttere;
importere org.testng.annotations.Test;

@Listeners(Listener_Demo.ListenerTest.class)
offentlig klasse TestCases {
webdriver chauffør = ny FirefoxChauffør();

// Test for at bestå, for at verificere at lytteren er vellykket.
@Prøve
offentligt tomrum Log ind() {
chauffør.get("https://demo.guru99.com/V4/");
driver.findElement(Efter.navn("uid")).sendNøgler("mngr34926");
driver.findElement(Efter.navn("Adgangskode")).sendNøgler("amUpenu");
driver.findElement(Efter.navn("btnLogin")).klik();
}

// Tvungen mislykket test for at verificere den fejlbehæftede lytter.
@Prøve
offentligt tomrum TestTilFejl() {
System.out.println("Denne testmetode mislykkes");
Assert.assertTrue(falsk);
}
}

Projektstrukturen ser således ud:

TestNG Listener-projektstruktur

Trin 4) Udfør TestCases klasse. Metoder indeni Lyttertest kaldes automatisk baseret på opførslen af ​​metoder kommenteret med @Prøve.

Trin 5) Bekræft outputtet, der vises i konsollen.

Udgangen af TestCases ligner:

TestNG Lytterkonsoloutput

[TestNGLøb:
C:\Brugere\gauravn\AppData\Lokal\Temp\testng-eclipse–1058076918\testng-customsuite.xml

Login-testcase startet
Navnet på den beståede testcase er: Login
TestToFail-testcase startet
Denne testmetode mislykkes
Navnet på den mislykkede testcase er: TestToFail
GODKENDT: Log ind
MISSLYKKET: TestTilMislykket
java.lang.AssertionError: forventet [sand] men fundet [falsk]

Brug af en lytter til flere klasser

Hvis et projekt har mange testklasser, tilføjes @Lyttere annotering til hver enkelt bliver besværlig og fejlbehæftet.

I så fald skal du oprette en testng.xml filen og registrer lytteren der én gang.

testng.xml-listeners-tag for flere klasser

Denne lytter anvendes derefter på tværs af hele testpakken uanset antallet af klasser. Når du kører XML-filen, aktiveres lytteren for hver klasse, der er deklareret i pakken, og du kan kæde et hvilket som helst antal lytterklasser sammen inden for det samme tag.

WebDriverListener i Selenium 4 vs. den udfasede EventFiringWebDriver

Mens TestNG Listenere reagerer på testlivscyklushændelser, WebDriver-listere reagerer på browser-driver-handlinger såsom et klik, en navigation eller et findElement-kald. Selenium 3 Den typiske fremgangsmåde var WebDriverHændelseslytter grænseflade forbundet via kabel EventFiringWebDriverBegge er udfaset i Selenium 4.x.

Den moderne erstatning er WebDriverListener grænseflade kombineret med BegivenhedFyringDekoratør:

importere org.openqa.selenium.WebDriver;
importere org.openqa.selenium.chrome.ChromeDriver;
importere org.openqa.selenium.support.events.EventFiringDecorator;
importere org.openqa.selenium.support.events.WebDriverListener;

offentlig klasse Logføringslytter redskaber WebDriverListener {
@Tilsidesæt
offentligt tomrum førGet(webdriver driver, String url) {
System.out.println("Navigering til" + url);
}
}

webdriver rå = ny ChromeDriver();
webdriver chauffør = ny BegivenhedFyringDekoratør<>(ny LoggingListener()).dekorere(raw);

Dekoratoren kan ombryde enhver WebDriver, WebElement eller Alert, hvilket er mere fleksibelt end den gamle event-firing wrapper. WebDriverListener for observerbarhed på browsersiden og TestNG ITestListener til rapportering på suite-niveau.

AI-drevne lyttere: Smartere logfiler og fejlsortering

Moderne Selenium Teams tilslutter i stigende grad AI-tjenester til deres lyttere for at gøre CI-signaler mere brugbare. vedTestFejl, kan en AI-assisteret lytter optage et DOM-snapshot plus et skærmbillede, sende dem til en model, der returnerer en sandsynlig rodårsagsklynge, og skrive et tag tilbage i TestNG rapport eller et værktøj som ReportPortal.

Almindelige AI-drevne mønstre inkluderer:

  • Flaky-test detektion: Lyttere videresender tidslinjer for beståede/fejlede resultater til en model, der klassificerer en fejl som ustabil, miljømæssig eller en reel regression.
  • Smarte skærmbilleder: Computervision-modeller beskærer, annoterer og differentierer skærmbilleder af brugergrænsefladen, så korrekturlæsere ser det ændrede område i stedet for en fuldsidet dump.
  • Selvreparerende lokaliseringsanordninger: A WebDriverListener kroge førFindElement og beder en AI-hjælper om at foreslå en alternativ lokator, når den primære kaster NoSuchElementException.
  • Resuméer i naturligt sprog: An IR-rapporter Implementeringen føder suite-resultaterne ind i en LLM, der producerer et stående resumé på et afsnit.

Lytterlaget er det reneste sted at injicere disse hooks, fordi det holder sig ude af testlogikken og anvendes ensartet på tværs af serien.

Resumé

Lyttere skal generere logfiler eller tilpasse TestNG rapporterer i Selenium WebDriver.

  • TestNG tilbyder mange lyttergrænseflader; vælg den, der matcher den begivenhed, du er interesseret i.
  • Lyttere er grænseflader, der bruges i Selenium WebDriver-scripts til at reagere på testlivscyklushændelser.
  • Vejledningen demonstrerede ITestListener med en bestået og en ikke-bestået prøve.
  • Du kan tilknytte en lytter med @Lyttere eller registrer det én gang i testng.xml for hele suiten.
  • Selenium 4.x erstatter EventFiringWebDriver med WebDriverListener + BegivenhedFyringDekoratør for hændelser på WebDriver-niveau.

Ofte Stillede Spørgsmål

En lytter er en grænseflade, der abonnerer på hændelser, der genereres under en Selenium prøvekørsel. TestNG Listenere reagerer på testlivscyklushændelser såsom start, bestået, mislykket og spring over. WebDriver-lyttere reagerer på browser-driver-hændelser såsom klik, navigationer og findElement-kald.

ITestListener aktiveres for individuelle @Test-metoder og eksponerer onTestStart, onTestSuccess, onTestFailure, onTestSkipped og onFinish. iSuiteListener aktiveres kun to gange pr. suite, med onStart og onFinish, hvilket gør den ideel til opsætning på suite-niveau, f.eks. åbning af en rapportfil.

Du kan registrere en TestNG lytteren på to måder: tilføj annotationen @Listeners(MyListener.class) over testklassen, eller deklarer en tagget i testng.xml. XML-tilgangen anvender lytteren på tværs af alle klasser i pakken uden at ændre kildekoden.

EventFiringWebDriver og WebDriverEventListener er udfaset i Selenium 4.x. Den anbefalede erstatning er WebDriverListener-grænsefladen kombineret med EventFiringDecorator, som kan ombryde WebDriver-, WebElement- eller Alert-instanser og tilbyder renere hook-points såsom beforeGet og afterClick.

Brug iReporter, når du vil oprette en brugerdefineret rapport, når pakken er færdig, f.eks. et HTML- eller JSON-resumé. Brug IInvokedMethodListener, når du har brug for en hook før og efter hver testmetode, inklusive konfigurationsmetoder som @BeforeMethod og @AfterMethod.

AI-modeller kan berige lytteroutputtet ved at mærke hver logpost med alvorlighedsgrad, generere trinbeskrivelser i naturligt sprog og gruppere relaterede fejl. Inde i onTestFailure kan en AI-tjeneste analysere skærmbilledet og stakken. trace, og tilføj derefter en sandsynlig grundårsag til TestNG indberette.

Ja. En lytter kan streame bestået/fejlet historik til en AI-tjeneste, der klassificerer en fejl som ustabil, miljømæssig eller en reel regression. Dommen skrives tilbage som en TestNG attribut, så dashboards kan sætte ustabile tests i karantæne uden at et menneske gennemgår alle røde builds.

Opsummer dette indlæg med: