Inleiding tot TestNG

1. Overzicht

In dit artikel introduceren we het TestNG-testraamwerk.

We zullen ons concentreren op: het opzetten van een framework, het schrijven van een eenvoudige testcase en configuratie, het uitvoeren van tests, het genereren van testrapporten en het uitvoeren van gelijktijdige tests.

2. Installatie

Laten we beginnen met het toevoegen van de Maven-afhankelijkheid in onze pom.xml het dossier:

 org.testng testng 7.1.0 test 

De nieuwste versie is te vinden in de Maven-repository.

Wanneer u Eclipse gebruikt, kan de TestNG-plug-in worden gedownload en geïnstalleerd vanaf de Eclipse Marketplace.

3. Schrijven van een testcase

Om een ​​test te schrijven met TestNG, hoeven we alleen de testmethode te annoteren met org.testng.annotations.Test annotatie:

@Test openbare leegte gegevenNumber_whenEven_thenTrue () {assertTrue (aantal% 2 == 0); }

4. Test configuraties

Tijdens het schrijven van testcases moeten we vaak enkele configuratie- of initialisatie-instructies uitvoeren voordat de test wordt uitgevoerd, en ook wat opschoning na voltooiing van tests. TestNG biedt een aantal initialisatie- en opschoningsfuncties op methode-, klasse-, groeps- en suite-niveau:

@BeforeClass public void setup () {number = 12; } @AfterClass openbare leegte tearDown () {nummer = 0; }

De opstelling() methode geannoteerd met @Voor klas annotaties worden aangeroepen voordat de methoden van die testklasse worden uitgevoerd, en scheuren() na uitvoering alle methoden van de testklasse.

Evenzo kunnen we de @BeforeMethod, @AfterMethod, @ Before / AfterGroup, @ Before / AfterTest en @ Before / AfterSuite annotaties voor elke configuratie op methode-, groeps-, test- en suite-niveau.

5. Testuitvoering

We kunnen de testcases uitvoeren met het "test" -commando van Maven, het zal alle testcases uitvoeren die zijn geannoteerd met @Test ze in een standaard testsuite plaatsen. We kunnen ook testcases uitvoeren vanuit de TestNG-testsuite XML-bestanden door de maven-surefire-plugin:

 org.apache.maven.plugins maven-surefire-plugin 2.19.1 src \ test \ resources \ test_suite.xml 

Merk op dat als we meerdere XML-bestanden hebben die alle testcases dekken, we ze allemaal kunnen toevoegen in het suiteXmlFiles label:

  src / test / resources / parametrized_test.xml src / test / resources / registration_test.xml 

Om de test standalone uit te voeren, hebben we de TestNG-bibliotheek in het klassenpad nodig en de gecompileerde testklasse samen met het XML-configuratiebestand:

java org.testng.TestNG test_suite.xml

6. Groeperingstests

Tests kunnen in groepen worden uitgevoerd, bijvoorbeeld van de 50 testcases kunnen er 15 worden gegroepeerd en uitgevoerd, terwijl de anderen ongewijzigd blijven.

In TestNG worden groeperingstests in suites gedaan met behulp van een XML-bestand:

Merk op dat beide testklassen RegistrationTest, SignInTest behoort nu tot dezelfde suite en zodra de suite is uitgevoerd, worden testgevallen in deze klasse uitgevoerd.

Behalve testsuites kunnen we ook testgroepen aanmaken in TestNG, waar in plaats van testklassen methoden worden gegroepeerd. Om dat te doen, voegt u het groepen parameter in het @Test annotatie:

@Test (groups = "regressie") public void givenNegativeNumber_sumLessthanZero_thenCorrect () {int sum = numbers.stream (). Reduce (0, geheel getal :: som); assertTrue (som <0); }

Laten we een XML gebruiken om de groepen uit te voeren:

Hiermee wordt de testmethode uitgevoerd die is getagd met group regressie, in de SommationServiceTest klasse.

7. Geparametriseerde tests

Geparametriseerde unit-tests worden gebruikt om dezelfde code onder verschillende omstandigheden te testen. Met behulp van geparametriseerde unit-tests kunnen we een testmethode opzetten die gegevens uit een gegevensbron haalt. Het belangrijkste idee is om de unit-testmethode herbruikbaar te maken en te testen met een andere set inputs.

In TestNG kunnen we tests parametriseren met @Parameter of @Data provider annotatie. Terwijl u het XML-bestand gebruikt, annoteert u de testmethode met @Parameter:

@Test @Parameters ({"value", "isEven"}) public void givenNumberFromXML_ifEvenCheckOK_thenCorrect (int waarde, boolean isEven) {assertEquals (isEven, waarde% 2 == 0); }
En verstrek de gegevens met behulp van een XML-bestand:

Het gebruik van gegevens uit een XML-bestand is handig, maar we hebben vaak complexere gegevens nodig. @Data provider annotatie wordt gebruikt om deze scenario's af te handelen, die kunnen worden gebruikt om complexe parametertypen voor testmethoden in kaart te brengen.@Data provider voor primitieve gegevenstypen:

@DataProvider (name = "numbers") openbaar statisch object [] [] evenNumbers () {retourneer nieuw object [] [] {{1, false}, {2, true}, {4, true}}; } @Test (dataProvider = "numbers") public void givenNumberFromDataProvider_ifEvenCheckOK_thenCorrect (geheel getal, boolean verwacht) {assertEquals (verwacht, getal% 2 == 0); }

@Data providervoor objecten:

@Test (dataProvider = "numbersObject") public void givenNumberObjectFromDataProvider_ifEvenCheckOK_thenCorrect (EvenNumber nummer) {assertEquals (number.isEven (), number.getValue ()% 2 == 0); } @DataProvider (name = "numbersObject") public Object [] [] parameterProvider () {return new Object [] [] {{new EvenNumber (1, false)}, {new EvenNumber (2, true)}, {new EvenNumber (4, true)}}; }

Hiermee kan elk object dat moet worden getest, worden gemaakt en gebruikt in de test. Dit is vooral handig voor integratietestgevallen.

8. Negeren van testgevallen

Soms willen we tijdens het ontwikkelproces een bepaalde testcase niet uitvoeren. Dit kan gedaan worden door toe te voegen ingeschakeld= onwaar, in de @Test annotatie:

@Test (enabled = false) public void givenNumbers_sumEquals_thenCorrect () {int sum = numbers.stream.reduce (0, geheel getal :: som); assertEquals (6, som); }

9. Afhankelijke tests

Laten we eens kijken naar een scenario, waarbij als de eerste testcase mislukt, alle volgende testcases moeten worden uitgevoerd en in plaats daarvan moeten worden gemarkeerd als overgeslagen. TestNG biedt deze functie met de hangtOnMethods parameter van de @Test annotatie:

@Test openbare ongeldige gegevenEmail_ifValid_thenTrue () {boolean valid = email.contains ("@"); assertEquals (geldig, waar); } @Test (afhankelijkOnMethods = {"givenEmail_ifValid_thenTrue"}) public void givenValidEmail_whenLoggedIn_thenTrue () {LOGGER.info ("E-mail {} geldig >> inloggen", e-mail); }

Merk op dat de login-testcase afhankelijk is van de e-mailvalidatietestcase. Dus als de e-mailvalidatie mislukt, wordt de inlogtest overgeslagen.

10. Gelijktijdige testuitvoering

Met TestNG kunnen tests parallel of in multi-threaded modus worden uitgevoerd, waardoor deze stukjes code met meerdere threads kunnen worden getest.

U kunt methoden, klassen en suites configureren om in hun eigen threads te worden uitgevoerd, waardoor de totale uitvoeringstijd wordt verkort.

10.1. Klassen en methoden parallel

Om testklassen parallel uit te voeren, vermeld je het parallel attribuut in het suite tag in XML-configuratiebestand, met waarde klassen:

Merk op dat als we er meerdere hebben test tags in het XML-bestand, kunnen deze tests ook parallel worden uitgevoerd, door te vermelden parallel = ”tests”. Vermeld ook om afzonderlijke methoden parallel uit te voeren parallel = ”methoden”.

10.2. Multi-threaded uitvoering van testmethode

Laten we zeggen dat we het gedrag van een code moeten testen wanneer deze in meerdere threads wordt uitgevoerd. TestNG maakt het mogelijk om een ​​testmethode in meerdere threads uit te voeren:

openbare klasse MultiThreadedTests {@Test (threadPoolSize = 5, invocationCount = 10, timeOut = 1000) openbare ongeldige gegevenMethod_whenRunInThreads_thenCorrect () {int count = Thread.activeCount (); assertTrue (count> 1); }}

De threadPoolSize geeft aan dat de methode zal worden uitgevoerd n aantal threads zoals vermeld. De invocationCount en time-out geven aan dat de test meerdere keren zal worden uitgevoerd en niet slagen voor de test als het meer tijd kost.

11. Functioneel testen

TestNG wordt geleverd met functies die ook kunnen worden gebruikt voor functionele tests. In combinatie met Selenium kan het worden gebruikt om functionaliteiten van een webapplicatie te testen of voor het testen van webservices met HttpClient.

Meer informatie over functioneel testen met Selenium en TestNG is hier beschikbaar. Ook wat meer dingen over integratietesten in dit artikel.

12. Conclusie

In dit artikel hebben we snel gekeken hoe u TestNG instelt en een eenvoudige testcase uitvoert, rapporten genereert, testcases gelijktijdig uitvoert en ook een beetje over functioneel programmeren. Voor meer functies zoals afhankelijke tests, het negeren van testcases, testgroepen en suites, kunt u ons artikel JUnit vs TestNG hier raadplegen.

De implementatie van alle codefragmenten is te vinden op Github.