Groepen in TestNG

โšก Slimme samenvatting

Groepen in TestNG Hiermee kunt u testmethoden taggen met logische labels en ze vervolgens via een XML-suite opnemen of uitsluiten. Deze aanpak vereenvoudigt rooktests, regressietests en afhankelijkheidstests zonder dat u de code hoeft te herschrijven. Java code.

  • ???? ๏ธ Annotatiesyntaxis: Gebruik @Test(groups = {"smoke","regression"}) Een methode labelen met een of meer logische groepsnamen.
  • ๐Ÿ“œ XML-besturingselement: De <groups><run><include> en <exclude> De tags in testng.xml bepalen welke getagde methoden daadwerkelijk worden uitgevoerd.
  • ๐Ÿ”— Bijgebouwen: De dependsOnGroups Attributen dwingen een volgorde af waardoor groepen met voorwaarden altijd klaar zijn voordat afhankelijke tests beginnen.
  • ๐Ÿค– AI-selectie: AI-tools voor het meten van de impact van tests koppelen codewijzigingen aan relevante groepen, zodat alleen de getroffen testsuites bij elke commit worden uitgevoerd.
  • ๐Ÿงช TestNG 7.x: Moderne releases zorgen ervoor dat groepen volledig compatibel blijven met parallelle uitvoering, listeners en Maven Surefire-pipelines.

Groepen in TestNG

TestNG is een testframework dat unit-, functionele, end-to-end-, UI- en integratietests omvat voor Java projecten.

Je kunt รฉรฉn pakket of meerdere pakketten (een pakket bevat gerelateerde klassen in een gedefinieerde mapstructuur) uitvoeren door een XML-suite te maken en deze via Maven te activeren.

TestNG Groepen met voorbeeld

Je gebruikt groepen in TestNG wanneer:

  • Je wilt testmethoden niet over veel klassen verspreiden puur op basis van functioneel gebied, en
  • Je wilt bepaalde testgevallen overslaan (niet uitvoeren) alsof ze niet in de codebase voorkomen.
  • Om beide doelen te bereiken, groepeert u methoden in logische categorieรซn. TestNG Vervolgens worden de "include"- en "exclude"-filters die in de XML-suite zijn gedeclareerd, gerespecteerd.

Het onderstaande codefragment toont de syntaxis voor het groeperen van tags die wordt gebruikt in een testmethode.

@Toets (groepen = { โ€œverbindingโ€, โ€œsterke bandenโ€ })

Hier worden twee groepsnamen gebruikt, namelijk bonding en strong_tiesDit zijn logische labels die u kunt hernoemen zodat ze beter bij uw project passen.

De <groups> De tag markeert het begin van groepsfilters binnen de XML-suite.

Vervolgens pas je de XML aan om een โ€‹โ€‹specifieke groep uit de getagde klassen te selecteren. Het onderstaande voorbeeld laat de syntaxis voor de groepsdeclaratie zien.

<groepen>
<lopen>
<omvatten naam=โ€œverbindingโ€ />
</lopen>
</groepen>

Stel dat รฉรฉn klasse 10 testmethoden bevat.

Van die methoden:

  • 6 methoden voeren de bonding groep, en
  • 4 methoden voeren de strong_ties groep.

Vervolgens configureert u Maven en Java paden en gebruik de Eclipse IDE om groepsgebruik te demonstreren via XML-bestanden binnen een Java-gebaseerd Maven-project.

XML maken voor TestNG met labels

  • Het XML-bestand (Extensible Markup Language) in het Maven-framework slaat de configuratie op voor een of meer tests, die binnen de test zijn gedeclareerd. label.
  • Elke testinzending is omwikkeld met een label en kan รฉรฉn of meer bevatten TestNG klassen.
  • A Java klas met een of meer @Toets annotaties over de methoden worden behandeld als een TestNG klasse.

Meerdere tags verschijnen achter elkaar om een โ€‹โ€‹werkend testng.xml-bestand te vormen, namelijk , , En .

  • De De tag bevat de naam op suite-niveau die wordt gebruikt in TestNG rapporten voor uitvoeringssamenvattingen.
  • De <test name=โ€Guru 99 Rooktestdemonstratieโ€> De tag bevat een logische testnaam; het rapport gebruikt deze voor het tellen van geslaagde, mislukte en overgeslagen tests, evenals de totale uitvoeringstijd en groepsmetadata.
  • De tag verwijst naar de testklasse, waar com.group.guru99 is het pakket en TC_Class1 is de klassenaam.

<!DOCTYPE suite SYSTEM โ€œhttp://testng.org/testng-1.0.dtdโ€>
<suite naam="Suite">
<proef naam="Guru 99 Rooktestdemonstratieโ€>
<groepen>
<lopen>
<omvatten naam=โ€œsterke bandenโ€ />
</lopen>
</groepen>
<klassen>
<klasse naam=โ€œcom.group.guru99.TC_Class1โ€ />
</klassen>
</proef>
</suite>

Deze XML-configuratie wordt in de video-tutorials in de volgende secties als referentie gebruikt.

โ€œuitsluitenโ€ of โ€œopnemenโ€ in test-XML

Als het groeperingsmechanisme te complex is voor een klein filter, kunt u met de testng.xml-suite ook individuele testmethoden op naam uitsluiten of opnemen.

Tag uitsluitenSyntaxis voor exclude-taguitsluiten naam=โ€œ${TEST_CASE_NAME}โ€ />
Tag toevoegen: Syntaxis voor include-tagomvatten naam=โ€œ${TEST_CASE_NAME}โ€ />

Let op: Je kunt in รฉรฉn run meerdere testgevallen opnemen of uitsluiten, en dezelfde syntax is van toepassing op groepsfilters.

Het gebruik van dependsOnGroups voor geordende uitvoering

Naast eenvoudige inclusie, TestNG maakt het mogelijk dat de ene groep afhankelijk is van de andere door gebruik te maken van de dependsOnGroups attribuut. De runner zorgt ervoor dat elke methode in de bovenliggende groep is voltooid voordat een afhankelijke methode begint, waardoor de betrouwbaarheid van de voorwaarden gewaarborgd blijft.

  • Eerst inloggen, dan transacties: Tag inlogmethoden met group = "auth"en tag-overdrachtstests met dependsOnGroups = {"auth"}De overdrachtstests worden pas uitgevoerd nadat de aanmelding is geslaagd.
  • Overslaan bij fout: Als een methode in de bovenliggende groep mislukt, TestNG Hierdoor worden de afhankelijke methoden als overgeslagen gemarkeerd in plaats van direct als mislukt, wat de rapportage betrouwbaar houdt.
  • Combineer met alwaysRun: Opruimmethoden moeten worden ingesteld alwaysRun = true Het opruimproces blijft dus doorgaan, zelfs als een upstream-groep uitvalt.

Dit patroon komt vaak voor bij end-to-end testsuites waarbij de API-configuratie voltooid moet zijn voordat de UI-asserties van start gaan.

lopen TestNG Code groeperen, opnemen, uitsluiten (videodemo)

Hieronder volgt een stapsgewijze handleiding. Java code en de XML-suite die de aansturing ervan mogelijk maken groeperen, uitsluiten en insluiten gedrag.

Testscenario: Start de GuruOp de demo-bankwebsite van 99 moet je een paar elementen op de inlogpagina verifiรซren, je inloggegevens invoeren en na het inloggen een paar items op het dashboard opnieuw verifiรซren.

lopen TestNG Groeperen, Inclusief, Exclusief Code

Let op: Elke stap bevindt zich in een eigen methode, maar de uitvoeringsvolgorde hangt af van de items in de XML-suite.

  • Methode 1: Initialiseer de browser en start de URL (tc01LaunchURL()).
  • Methode 2: Controleer de koptekst van de inlogpagina (tc02VerifyLaunchPage()).
  • Methode 3: Voer uw gebruikersnaam en wachtwoord in op het inlogformulier (tc03EnterCredentials()).
  • Methode 4: Controleer of de manager-ID op het gebruikersdashboard aanwezig is (tc04VerifyLoggedInPage()).
  • Methode 5: Controleer de extra links op het gebruikersdashboard (tc05VerifyHyperlinks()).

Code voor het scenario:

pakket com.group.guru99;

importeren java.util.concurrent.TimeUnit;

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

openbare klasse TC_Class1 {
openbare statische finale webdriver webDriver = nieuwe Firefoxbestuurder();

Draad launchPageHeading = โ€œ//h3[text()='Guru99 Bank']โ€;
finale Draad gebruikersnaam_element = โ€œ//input[@name='uid']โ€, wachtwoordelement = โ€œ//input[@name='password']โ€,
signIn_element = โ€œ//input[@name='btnLogin']โ€;
finale Draad gebruikersnaam_waarde = โ€œmngr28642โ€, wachtwoord_waarde = โ€œydAnateโ€;
finale Draad managerID = โ€œ//td[contains(text(),'Manager Id')]โ€;
finale Draad nieuweKlant = โ€œ//a[@href='addcustomerpage.php']โ€, fondsoverdracht = โ€œ//a[@href='FundTransInput.php']โ€;

/** Deze testcase initialiseert de webDriver */
@Toets(groepen = { โ€œverbindingโ€, โ€œsterke bandenโ€ })
openbare leegte tc01LaunchURL() {
webDriver.manage().window().maximize();
webDriver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
webDriver.get(โ€œhttps://www.demo.guru99.com/V4/โ€);
}

/** Controleert of de koptekst op de inlogpagina aanwezig is */
@Toets(groepen = { โ€œverbindingโ€ })
openbare leegte tc02VerifyLaunchPage() {
Assert.assertTrue(webDriver.findElement(By.xpath(launchPageHeading)).isDisplayed(),
De koptekst van de homepage wordt niet weergegeven.);
Systeem.uit.println(โ€œDe kop van de homepage wordt weergegevenโ€);
}

/** Voert gebruikersnaam en wachtwoord in en klikt vervolgens op 'Inloggen' */
@Toets(groepen = { โ€œverbindingโ€, โ€œsterke bandenโ€ })
openbare leegte tc03EnterCredentials() {
webDriver.findElement(By.xpath(userName_element)).sendKeys(userName_value);
webDriver.findElement(By.xpath(password_element)).sendKeys(password_value);
webDriver.findElement(By.xpath(signIn_element)).click();
}

/** Controleert de manager-ID op het dashboard */
@Toets(groepen = { โ€œsterke bandenโ€ })
openbare leegte tc04VerifyLoggedInPage() {
Assert.assertTrue(webDriver.findElement(By.xpath(managerID)).isDisplayed(),
Het label 'Manager-ID' wordt niet weergegeven.);
Systeem.uit.println(โ€œHet label โ€˜Manager IDโ€™ wordt weergegevenโ€);
}

/** Controleert de link 'Nieuwe klant' en de link 'Geld overmaken' op het dashboard */
@Toets(groepen = { โ€œverbindingโ€ })
openbare leegte tc05VerifyHyperlinks() {
Assert.assertTrue(webDriver.findElement(By.xpath(newCustomer)).isEnabled(),
De hyperlink voor nieuwe klanten wordt niet weergegeven.);
Systeem.uit.println(โ€œDe hyperlink voor nieuwe klanten wordt weergegevenโ€);

Assert.assertTrue(webDriver.findElement(By.xpath(fundTransfer)).isEnabled(),
De hyperlink voor geldoverdracht wordt niet weergegeven.);
Systeem.uit.println(โ€œDe hyperlink voor geldoverdracht wordt weergegevenโ€);
}
}

Let op: de demo-bankgegevens blijven ongeveer 20 dagen geldig. Bij een lokale test kan er na die periode een foutmelding verschijnen dat de gegevens ongeldig zijn.

Uitleg van de code:

Vijf testmethoden, รฉรฉn per actie, elk met een groups attribuut op het @Test annotatie.

De twee logische groepslabels zijn strong_ties en bonding.

  • De eerste en derde methode voeren beide uit. bonding en strong_tiesZe worden dus uitgevoerd zodra een van beide groepen in de suite is opgenomen. Dit is een veelvoorkomend patroon voor gedeelde applicaties. testcase stappen.
  • De tweede methode is alleen gelabeld met bonding, dus het werkt alleen wanneer de bonding De groep is inbegrepen.
  • De vierde methode is alleen gelabeld met strong_tiesHet programma wordt dus alleen uitgevoerd als die groep is opgenomen.
  • De vijfde methode is alleen gelabeld met bonding, dus het werkt alleen wanneer de bonding De groep is inbegrepen.

Hieronder volgen vier uitvoeringsscenario's:

Scenario 1: Voer elke testmethode uit, ongeacht de groep. Verwijder de <groups> blokkering van de actieve XML.

Scenario 2: Voer alleen methoden uit die gekoppeld zijn aan een gekozen groep, namelijk strong_ties or bondingZie onderstaande video.

  • In het eerste deel van de video, de <groups> Het codeblok is uitgeschakeld door middel van commentaar, waardoor elke testmethode wordt uitgevoerd.
  • In het tweede deel wordt het groepsfilter hersteld en worden alleen de overeenkomende methoden uitgevoerd.

Scenario 3: Gebruik het uitsluitingsfilter om bepaalde testgevallen over te slaan. Raadpleeg de video voor meer informatie.

  • De demo sluit uit tc02 op naam in de actieve XML, en het resultatenrapport bevestigt dat de uitgesloten methode niet wordt uitgevoerd.

Scenario 4: Pas het inclusiefilter toe om alleen de uitvoering uit te voeren. tc01LaunchURL, tc03EnterCredentialsen tc05VerifyHyperlinksRaadpleeg de video.

Tijdens deze uitvoering worden alleen de methoden uitgevoerd die in het include-filter zijn opgenomen, precies zoals geconfigureerd.

Download het voorbeeldproject via de onderstaande link.

Download het bovenstaande Code

Conclusie

Groepen in TestNG structuur aanbrengen in grote Selenium en unit suites door eenmalige klassesplitsingen te vervangen door declaratieve XML-filters.

Label je methoden met @Test(groups = {...}), gebruik dan <include>, <exclude>en dependsOnGroups om rook-, regressie- en end-to-end-runs vanuit hetzelfde Maven-project uit te voeren op TestNG 7.x.

Veelgestelde vragen

Een groep is een logisch label dat aan een testmethode is gekoppeld via de groups attribuut op @TestDe XML-suite selecteert vervolgens groepen met behulp van inclusie- en exclusiefilters, zodat u tijdens de uitvoering kunt bepalen welke getagde methoden worden uitgevoerd.

Binnenkant <groups><run> <include name="..."> tag whitelists groepen voor de run, en <exclude name="..."> blokkeert ze. TestNG De uitsluitingsregel wordt na de inclusieregel toegepast, waardoor een uitgesloten groep altijd wordt overgeslagen, zelfs als deze ook in de inclusielijst staat.

De dependsOnGroups attribuut op @Test krachten TestNG Alle methoden in de vermelde groep moeten worden uitgevoerd voordat de afhankelijke methode start. Als een van de vereiste methoden mislukt, TestNG De afhankelijke methode wordt als overgeslagen gemarkeerd in plaats van als mislukt.

Ja. De groups Het attribuut accepteert een array, dus @Test(groups = {"smoke", "regression"}) plaatst รฉรฉn methode in beide groepen. TestNG Deze methode wordt uitgevoerd zodra een van beide groepen in de suite is opgenomen, waardoor gedeelde stappen DRY blijven.

TestNG 7.x is de onderhouden lijn, met releases onder de org.testng:testng Maven-coรถrdinatie zorgt ervoor dat groepen, parallelle uitvoering en listeners volledig compatibel blijven met moderne technologieรซn. Selenium 4- en JDK 17-projecten.

AI-tools voor het meten van de impact van tests analyseren codeverschillen en koppelen vervolgens gewijzigde klassen aan de groepen waartoe ze behoren. De pipeline voert bij elke pull request alleen die getagde groepen uit, waardoor de feedbacktijd wordt verkort en de kwaliteit behouden blijft.ping Risicovolle trajecten worden getest.

Ja. AI-clusteringsalgoritmen lezen historische foutenlogboeken, markeren onbetrouwbare tests en stellen een stabiele subset voor die is gelabeld als regressionDe ingenieurs keuren de lijst goed, waarna TestNG Die groep traint elke avond, waardoor de suite compact blijft zonder dat de dekking afneemt.

Vat dit bericht samen met: