TestNG Luisteraars binnen Selenium

โšก Slimme samenvatting

Luisteraars binnen Selenium WebDriver zijn TestNG Interfaces die testgebeurtenissen onderscheppen om logboeken, rapporten en acties na een fout aan te passen. Dit artikel legt de methoden van ITestListener uit en doorloopt een uitvoerbaar voorbeeld. Java bijvoorbeeld, en verduidelijkt hoe Selenium 4 verving de verouderde WebDriverEventListener.

  • โ“ Wat luisteraars doen: Ze abonneren zich op TestNG Gebeurtenissen zoals start, geslaagd, mislukt en overslaan worden gebruikt om logboekregistratie of rapportage te activeren.
  • ๐Ÿงฉ Twaalf interfaces: TestNG Het biedt interfaces zoals ITestListener, ISuiteListener, IReporter, IInvokedMethodListener en IAnnotationTransformer voor gedetailleerde controle.
  • ๏ธ Twee bedradingsmodi: Voeg een listener toe aan een enkele klasse met de annotatie @Listeners, of registreer deze eenmalig in testng.xml voor elke testsuite.
  • ๐Ÿš€ Selenium 4 update: EventFiringWebDriver is verouderd; de moderne WebDriverListener-interface in combinatie met EventFiringDecorator zorgt nu voor de werking van event hooks op WebDriver-niveau.
  • ๐Ÿค– AI-hoek: Door AI ondersteunde luisteraars kunnen fouten automatisch classificeren, slimme schermafbeeldingen toevoegen en signalen over onbetrouwbare tests in realtime terugsturen naar CI-dashboards.

TestNG Luisteraars binnen Selenium

Selenium WebDriver-scripts moeten vaak reageren op testgebeurtenissen zoals een geslaagde bewering, een mislukte locator of een overgeslagen stap. Listeners maken dat mogelijk. In grote lijnen, Selenium De projecten zijn afhankelijk van twee soorten luisteraars:

  1. WebDriver-luisteraars
  2. TestNG luisteraars

In deze tutorial zullen we ons concentreren op TestNG Luisteraars, met een toelichting op hoe luisteraars op WebDriver-niveau zijn gewijzigd in Selenium 4.x.

Wat is een luisteraar in TestNG?

Een Listener is een interface die het standaardgedrag van een Listener wijzigt. TestNGZoals de naam al doet vermoeden, luisteren Listeners naar gebeurtenissen die zijn gedefinieerd in een Selenium Je gebruikt ze door de relevante Listener-interface te implementeren en deze te registreren in je testklasse of -suite. Listeners stellen je in staat om aan te passen. TestNG Rapporten indienen, schermafbeeldingen bijvoegen en gestructureerde logboeken genereren.

Soorten luisteraars in TestNG

TestNG Het pakket bevat een reeks luisterinterfaces, die elk gericht zijn op een andere fase van de testlevenscyclus.

Hieronder staan โ€‹โ€‹de meest gebruikte TestNG luisteraars:

  1. IAnnotatieTransformer
  2. IAnnotatieTransformer2
  3. IConfigureerbaar
  4. IConfiguratieListener
  5. IExecutionListener
  6. IAanhaakbaar
  7. IInvokedMethodListener
  8. IInvokedMethodListener2
  9. IMethodeInterceptor
  10. IRporter
  11. ISuiteLuisteraar
  12. ITestListener

Deze interfaces worden gebruikt in Selenium om logboeken te genereren of aan te passen TestNG rapporten. In deze handleiding implementeren we... ITestListener.

ITestListener stelt de volgende methoden beschikbaar:

  • bij Start โ€“ Wordt aangeroepen wanneer een test start.
  • onTestSuccess โ€“ Wordt aangeroepen wanneer een test slaagt.
  • onTestFailure โ€“ Wordt aangeroepen wanneer een test mislukt.
  • onTestSkipped โ€“ Deze functie wordt aangeroepen wanneer een test wordt overgeslagen.
  • onTestFailedButWithinSuccessPercentage โ€“ Deze functie wordt aangeroepen wanneer een test mislukt, maar binnen het slagingspercentage valt.
  • onFinish โ€“ Deze functie wordt aangeroepen nadat alle tests in de klasse zijn uitgevoerd.

Testscenario

In dit testscenario automatiseren we het inlogproces en implementeren we... ITestListener tegen het.

  1. Lancering Firefox en open de site https://demo.guru99.com/V4/

Aanmelden voor het testscenario URL

  1. Log in op de applicatie.

Inlogformulier testscenario

Stappen voor het maken van een TestNG Luisteraar

Voor het bovenstaande testscenario implementeren we de Listener stap voor stap.

Stap 1) Maak een klasse aan met de naam Luistertest dat implementeert ITestListenerBeweeg de muis over de rode onderstreping en Eclipse Hieronder volgen twee snelle oplossingen:

Eclipse snelle oplossing om niet-geรฏmplementeerde methoden toe te voegen

Klik op "Niet-geรฏmplementeerde methoden toevoegen". Er worden meerdere placeholder-methoden (zonder body) aan uw code toegevoegd, vergelijkbaar met dit:

pakket Luisteraar_Demo;

importeren org.testng.ITestContext;
importeren org.testng.ITestListener;
importeren org.testng.ITestResult;

openbare klasse Luistertest gereedschap ITestListener {

@ Override
openbare leegte onFinish(ITestContext arg0) {
// TODO Automatisch gegenereerde methode-stub
}

@ Override
openbare leegte onStart(ITestContext arg0) {
// TODO Automatisch gegenereerde methode-stub
}

@ Override
openbare leegte onTestFailedButWithinSuccessPercentage(ITestResult arg0) {
// TODO Automatisch gegenereerde methode-stub
}

@ Override
openbare leegte onTestFailure(ITestResult arg0) {
// TODO Automatisch gegenereerde methode-stub
}

@ Override
openbare leegte onTestSkipped(ITestResult arg0) {
// TODO Automatisch gegenereerde methode-stub
}

@ Override
openbare leegte onTestStart(ITestResult arg0) {
// TODO Automatisch gegenereerde methode-stub
}

@ Override
openbare leegte onTestSuccess(ITestResult arg0) {
// TODO Automatisch gegenereerde methode-stub
}
}

Laten we nu de Luistertest klasse. We zullen met name de volgende methoden invullen: onTestFailure, onTestSkipped, onTestStarten onTestSuccess.

De wijziging is simpel: elke methode print de naam van de test, zodat de console duidelijk de status 'geslaagd', 'mislukt' en 'overgeslagen' weergeeft.

Na de aanpassing ziet de code er als volgt uit:

pakket Luisteraar_Demo;

importeren org.testng.ITestContext;
importeren org.testng.ITestListener;
importeren org.testng.ITestResult;

openbare klasse Luistertest gereedschap ITestListener {

@ Override
openbare leegte onFinish(ITestContext Resultaat) {
}

@ Override
openbare leegte onStart(ITestContext Resultaat) {
}

@ Override
openbare leegte onTestFailedButWithinSuccessPercentage(ITestResult Resultaat) {
}

// Wanneer een testcase mislukt, wordt deze methode aangeroepen.
@ Override
openbare leegte onTestFailure(ITestResult Resultaat) {
Systeem.uit.println(De naam van de testcase die is mislukt is: + Result.getName());
}

// Deze methode wordt aangeroepen wanneer een testcase wordt overgeslagen.
@ Override
openbare leegte onTestSkipped(ITestResult Resultaat) {
Systeem.uit.println(De naam van de overgeslagen testcase is: + Result.getName());
}

// Deze methode wordt aangeroepen wanneer een testcase start.
@ Override
openbare leegte onTestStart(ITestResult Resultaat) {
System.out.println(Result.getName() + "Testcase gestart");
}

// Deze methode wordt aangeroepen wanneer een testcase slaagt.
@ Override
openbare leegte onTestSuccess(ITestResult Resultaat) {
Systeem.uit.println(De naam van de geslaagde testcase is: + Result.getName());
}
}

Stap 2) Maak een andere klasse aan met de naam Testgevallen voor de automatische aanmelding. Selenium Deze klasse wordt uitgevoerd om in te loggen op de demosite.

pakket Luisteraar_Demo;

importeren org.openqa.selenium.Door;
importeren org.openqa.selenium.WebDriver;
importeren org.openqa.selenium.firefox.FirefoxChauffeurs;
importeren org.testng.Assert;
importeren org.testng.annotations.Listeners;
importeren org.testng.annotaties.Test;

openbare klasse Testgevallen {
webdriver bestuurder = nieuwe Firefoxbestuurder();

// Test ontworpen om te slagen, om de succeslistener te verifiรซren.
@Toets
openbare leegte Inloggen() {
driver.get(โ€œhttps://demo.guru99.com/V4/โ€);
driver.findElement(By.name(โ€œuidโ€)).sendKeys(โ€œmngr34926โ€);
driver.findElement(By.name("wachtwoord")).sendKeys(โ€œamUpenuโ€);
driver.findElement(By.name(โ€œbtnLoginโ€)).klik();
}

// Test geforceerd mislukt, om de foutlistener te controleren.
@Toets
openbare leegte TestToFail() {
Systeem.uit.println(โ€œDeze testmethode is misluktโ€);
Assert.assertTrue(vals);
}
}

Stap 3) Koppel deze listener vervolgens aan onze testklasse. TestgevallenEr zijn twee manieren om een โ€‹โ€‹klasse aan een luisterinterface te koppelen.

De eerste manier is om gebruik te maken van de @Luisteraars annotatie, zoals hieronder weergegeven:

@Listeners(Listener_Demo.ListenerTest.class)

We voegen deze annotatie boven de toe Testgevallen klasse. De klasse ziet er dan als volgt uit:

pakket Luisteraar_Demo;

importeren org.openqa.selenium.Door;
importeren org.openqa.selenium.WebDriver;
importeren org.openqa.selenium.firefox.FirefoxChauffeurs;
importeren org.testng.Assert;
importeren org.testng.annotations.Listeners;
importeren org.testng.annotaties.Test;

@Listeners(Listener_Demo.ListenerTest.class)
openbare klasse Testgevallen {
webdriver bestuurder = nieuwe Firefoxbestuurder();

// Test om te controleren of de succeslistener slaagt.
@Toets
openbare leegte Inloggen() {
driver.get(โ€œhttps://demo.guru99.com/V4/โ€);
driver.findElement(By.name(โ€œuidโ€)).sendKeys(โ€œmngr34926โ€);
driver.findElement(By.name("wachtwoord")).sendKeys(โ€œamUpenuโ€);
driver.findElement(By.name(โ€œbtnLoginโ€)).klik();
}

// Test geforceerd mislukt, om de foutlistener te controleren.
@Toets
openbare leegte TestToFail() {
Systeem.uit.println(โ€œDeze testmethode is misluktโ€);
Assert.assertTrue(vals);
}
}

De projectstructuur ziet er als volgt uit:

TestNG Projectstructuur voor luisteraars

Stap 4) Voer de Testgevallen klasse. Methoden binnenin Luistertest worden automatisch aangeroepen op basis van het gedrag van methoden die zijn geannoteerd met @Toets.

Stap 5) Controleer de uitvoer die in de console wordt weergegeven.

De uitvoer van Testgevallen lijkt op:

TestNG Uitvoer van de luisterconsole

[TestNG] Rennen:
C:\Users\gauravn\AppData\Local\Temp\testng-eclipseโ€“1058076918\testng-customsuite.xml

Aanmeldingstest gestart
De naam van de geslaagde testcase is: Inloggen
Testcase TestToFail gestart
Deze testmethode faalt
De naam van de testcase die is mislukt is: TestToFail
GESLAAGD: Inloggen
MISLUKT: TestToFail
java.lang.AssertionError: verwacht [true] maar gevonden [false]

Een listener gebruiken voor meerdere klassen

Als een project veel testklassen heeft, is het toevoegen van de @Luisteraars Het annoteren van elk afzonderlijk item wordt omslachtig en foutgevoelig.

Maak in dat geval een testenng.xml Het bestand moet daar eenmaal worden aangemaakt en de listener moet daar worden geregistreerd.

testng.xml listeners-tag voor meerdere klassen

Deze listener wordt vervolgens toegepast op de gehele testsuite, ongeacht het aantal klassen. Wanneer je het XML-bestand uitvoert, wordt de listener geactiveerd voor elke klasse die in de suite is gedeclareerd, en je kunt een willekeurig aantal listenerklassen binnen dezelfde tag aan elkaar koppelen.

WebDriverListener in Selenium 4 versus de verouderde EventFiringWebDriver

Terwijl TestNG Luisteraars reageren op gebeurtenissen in de testlevenscyclus, WebDriver-luisteraars reageren op acties van de browserdriver, zoals een klik, een navigatie of een findElement-aanroep. Selenium 3. De gebruikelijke aanpak was de WebDriverEventListener interface bedraad via EventFiringWebDriverBeide zijn verouderd in Selenium 4.x.

De moderne vervanging is de WebDriverListener interface gecombineerd met EventFiringDecorator:

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

openbare klasse LoggingListener gereedschap WebDriverListener {
@ Override
openbare leegte voorGet(webdriver driver, String url) {
Systeem.uit.println(โ€œNavigeren naarโ€ + url);
}
}

webdriver ruw = nieuwe ChromeDriver();
webdriver bestuurder = nieuwe EventFiringDecorator<>(nieuwe LoggingListener()).decorate(raw);

De decorator kan elke WebDriver, WebElement of Alert omwikkelen, wat flexibeler is dan de oude event-firing wrapper. Gebruik WebDriverListener voor observeerbaarheid aan de browserzijde en TestNG ITestListener voor rapportage op suite-niveau.

AI-gestuurde luisteraars: slimmere logboekregistratie en foutanalyse.

MODERN Selenium Teams integreren steeds vaker AI-diensten in hun luistersystemen om CI-signalen beter bruikbaar te maken. onTestFailureEen AI-ondersteunde listener kan een DOM-snapshot en een screenshot vastleggen, deze naar een model sturen dat een waarschijnlijke oorzaakcluster retourneert, en een tag terugschrijven in de DOM. TestNG een rapport of een tool zoals ReportPortal.

Veelvoorkomende AI-gestuurde patronen zijn onder andere:

  • Detectie van onbetrouwbare tests: Luisteraars sturen tijdlijnen voor geslaagde/mislukte tests door naar een model dat een storing classificeert als onbetrouwbaar, omgevingsgerelateerd of een echte regressie.
  • Slimme schermafbeeldingen: Computervisiemodellen snijden UI-screenshots bij, annoteren ze en vergelijken ze, zodat beoordelaars het gewijzigde gedeelte zien in plaats van een volledige paginadump.
  • Zelfherstellende locators: A WebDriverListener haken beforeFindElement en vraagt โ€‹โ€‹een AI-helper om een โ€‹โ€‹alternatieve locator voor te stellen wanneer de primaire locator een foutmelding geeft. Geen DergelijkElementUitzondering.
  • Samenvattingen in natuurlijke taal: An IRporter De implementatie voert de resultaten van de suite in een LLM in, die een korte samenvatting van รฉรฉn alinea produceert.

De listenerlaag is de meest geschikte plek om deze hooks te injecteren, omdat deze buiten de testlogica blijft en uniform wordt toegepast op de hele testsuite.

Samenvatting

Luisteraars moeten logboeken genereren of aanpassen TestNG rapporten in Selenium Webstuurprogramma.

  • TestNG biedt diverse luisterinterfaces; kies de interface die het beste aansluit bij de gebeurtenis waarin u geรฏnteresseerd bent.
  • Luisteraars zijn interfaces die worden gebruikt in Selenium WebDriver-scripts om te reageren op gebeurtenissen in de testlevenscyclus.
  • De handleiding demonstreerde ITestListener met een geslaagde en een gezakte toets.
  • Je kunt een listener koppelen aan @Luisteraars of registreer het eenmalig testenng.xml voor de hele suite.
  • Selenium 4.x vervangt EventFiringWebDriver with WebDriverListener + EventFiringDecorator voor gebeurtenissen op WebDriver-niveau.

Veelgestelde vragen

Een Listener is een interface die zich abonneert op gebeurtenissen die worden gegenereerd tijdens een Selenium proefdraaien. TestNG Luisteraars reageren op gebeurtenissen in de testlevenscyclus, zoals start, geslaagd, mislukt en overslaan. WebDriver-luisteraars reageren op gebeurtenissen van de browserdriver, zoals klikken, navigaties en findElement-aanroepen.

ITestListener wordt geactiveerd voor individuele @Test-methoden en biedt de gebeurtenissen onTestStart, onTestSuccess, onTestFailure, onTestSkipped en onFinish. ISuiteListener wordt slechts twee keer per suite geactiveerd, namelijk bij onStart en onFinish, waardoor het ideaal is voor configuraties op suiteniveau, zoals het openen van een rapportbestand.

U kunt zich inschrijven a TestNG Je kunt op twee manieren een listener toevoegen: door de annotatie `@Listeners(MyListener.class)` boven de testklasse te plaatsen, of door een listener te declareren. tag in testng.xml. De XML-aanpak past de listener toe op elke klasse in de suite zonder de broncode te wijzigen.

EventFiringWebDriver en WebDriverEventListener zijn verouderd in Selenium 4.x. De aanbevolen vervanging is de WebDriverListener-interface in combinatie met EventFiringDecorator, die WebDriver-, WebElement- of Alert-instanties kan omvatten en schonere hook-punten biedt, zoals beforeGet en afterClick.

Gebruik IReporter als u na afloop van de testsuite een aangepast rapport wilt genereren, zoals een HTML- of JSON-samenvatting. Gebruik IInvokedMethodListener als u een hook nodig hebt vรณรณr en na elke testmethode, inclusief configuratiemethoden zoals @BeforeMethod en @AfterMethod.

AI-modellen kunnen de uitvoer van de listener verrijken door elke logvermelding te labelen met de ernst van de fout, stapbeschrijvingen in natuurlijke taal te genereren en gerelateerde fouten te clusteren. Binnen onTestFailure kan een AI-service de schermafbeelding en de stacktrace analyseren. trace, koppel vervolgens een waarschijnlijke oorzaak aan de TestNG melden.

Ja. Een luisteraar kan de geschiedenis van geslaagde/mislukte tests streamen naar een AI-service die een fout classificeert als onbetrouwbaar, omgevingsgerelateerd of een echte regressie. Het oordeel wordt teruggestuurd als een TestNG attribuut, zodat dashboards onbetrouwbare tests in quarantaine kunnen plaatsen zonder dat een mens elke rode build hoeft te beoordelen.

Vat dit bericht samen met: