Introduktion til TestNG

1. Oversigt

I denne artikel introducerer vi TestNG-testrammen.

Vi fokuserer på: rammeopsætning, skrivning af enkel test case og konfiguration, testudførelse, generering af testrapporter og samtidig testudførelse.

2. Opsætning

Lad os starte med at tilføje Maven-afhængighed i vores pom.xml fil:

 org.testng testng 7.1.0 test 

Den seneste version kan findes i Maven-arkivet.

Når du bruger Eclipse, kan TestNG-pluginet downloades og installeres fra Eclipse Marketplace.

3. Skrivning af en test sag

For at skrive en test ved hjælp af TestNG skal vi bare kommentere testmetoden med org.testng.annotations.Test kommentar:

@Test offentlig ugyldighed givenNumber_whenEven_thenTrue () {assertTrue (nummer% 2 == 0); }

4. Test konfigurationer

Mens vi skriver testtilfælde, er vi ofte nødt til at udføre nogle konfigurations- eller initialiseringsinstruktioner inden testudførelser og også nogle oprydninger efter afslutningen af ​​testene. TestNG giver et antal initialiserings- og oprydningsfunktioner på metode-, klasse-, gruppe- og suite-niveauer:

@BeforeClass offentlig ugyldig opsætning () {nummer = 12; } @AfterClass offentlig ugyldighed tearDown () {number = 0; }

Det Opsætning() metode kommenteret med @BeforeClass bemærkninger påberåbes inden udførelse af metoder i den pågældende testklasse, og rive ned() efter udførelse alle metoder i testklassen.

På samme måde kan vi bruge @BeforeMethod, @AfterMethod, @ Before / AfterGroup, @ Before / AfterTest og @ Before / AfterSuite kommentarer til enhver konfiguration på metode-, gruppe-, test- og suite-niveau.

5. Testudførelse

Vi kan køre testsagerne med Mavens kommando “test”, den vil udføre alle de testsager, der er kommenteret med @Prøve sætte dem i en standard testpakke. Vi kan også køre testcases fra XML-filer fra TestNG test suite ved hjælp af maven-surefire-plugin:

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

Bemærk, at hvis vi har flere XML-filer, der dækker alle testtilfælde, kan vi tilføje dem alle i suiteXmlFiles tag:

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

For at køre test-standalone er vi nødt til at have TestNG-biblioteket i klassestien og den kompilerede testklasse sammen med XML-konfigurationsfilen:

java org.testng.TestNG test_suite.xml

6. Grupperingstest

Test kan køres i grupper, for eksempel kan ud af 50 testsager 15 grupperes sammen og udføres, hvorved andre efterlades som de er.

I TestNG udføres grupperingstest i suiter ved hjælp af XML-fil:

Bemærk, at begge testklasser RegistrationTest, SignInTest tilhører nu den samme suite, og når en suite er udført, bliver testsager i denne klasse eksekveret.

Bortset fra testpakker kan vi også oprette testgrupper i TestNG, hvor metoder i stedet for testklasser er grupperet sammen. For at gøre det skal du tilføje grupper parameter i @Prøve kommentar:

@Test (grupper = "regression") offentlig ugyldighed givenNegativeNumber_sumLessthanZero_thenCorrect () {int sum = numbers.stream (). Reducer (0, Integer :: sum); assertTrue (sum <0); }

Lad os bruge en XML til at udføre grupperne:

Dette udfører testmetoden mærket med gruppen regression, i SummationServiceTest klasse.

7. Parameteriserede tests

Parameteriserede enhedstests bruges til at teste den samme kode under flere forhold. Ved hjælp af parametriserede enhedstest kan vi oprette en testmetode, der henter data fra en datakilde. Hovedideen er at gøre enhedstestmetoden genanvendelig og at teste med et andet sæt input.

I TestNG kan vi parametrere tests ved hjælp af @Parameter eller @DataProvider kommentar. Når du bruger XML-filen, skal du kommentere testmetoden med @Parameter:

@Test @Parameters ({"værdi", "isEven"}) offentlig ugyldighed givenNumberFromXML_ifEvenCheckOK_thenCorrect (int værdi, boolsk isEven) {assertEquals (isEven, værdi% 2 == 0); }
Og lever data ved hjælp af XML-fil:

Brug af data fra XML-filer er nyttigt, men vi har ofte brug for mere komplekse data. @DataProvider annotering bruges til at håndtere disse scenarier, som kan bruges til at kortlægge komplekse parametertyper til testmetoder.@DataProvider til primitive datatyper:

@DataProvider (name = "numbers") offentligt statisk objekt [] [] evenNumbers () {returner nyt objekt [] [] {{1, falsk}, {2, sandt}, {4, sandt}}; } @Test (dataProvider = "numbers") offentligt ugyldigt givenNumberFromDataProvider_ifEvenCheckOK_thenCorrect (heltal, forventet boolsk) {assertEquals (forventet, antal% 2 == 0); }

@DataProvidertil genstande:

@Test (dataProvider = "numbersObject") offentlig ugyldighed givenNumberObjectFromDataProvider_ifEvenCheckOK_thenCorrect (EvenNumber number) {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, sandt)}}; }

Ved hjælp af dette kan ethvert objekt, der skal testes, oprettes og bruges i testen. Dette er mest nyttigt til integrationstestsager.

8. Ignorerer testsager

Vi ønsker undertiden ikke at udføre en bestemt testsag midlertidigt under udviklingsprocessen. Dette kan gøres tilføjelse aktiveret= falsk, i @Prøve kommentar:

@Test (aktiveret = falsk) offentlig ugyldighed givenNumbers_sumEquals_thenCorrect () {int sum = numbers.stream.reduce (0, Integer :: sum); assertEquals (6, sum); }

9. Afhængige tests

Lad os overveje et scenarie, hvor hvis den indledende testsag mislykkes, skal alle efterfølgende testsager udføres og snarere markeres som springet over. TestNG giver denne funktion med afhænger af metoder parameter for @Prøve kommentar:

@Test offentlig ugyldighed givenEmail_ifValid_thenTrue () {boolean valid = email.contains ("@"); assertEquals (gyldig, sand); } @Test (afhængerOnMethods = {"givenEmail_ifValid_thenTrue"}) offentlig ugyldighed givenValidEmail_whenLoggedIn_thenTrue () {LOGGER.info ("E-mail {} gyldig >> logger ind", e-mail) }

Bemærk, at login test tilfælde afhænger af e-mail validering test sag. Således, hvis e-mail-validering mislykkes, springes login-testen over.

10. Samtidig testudførelse

TestNG tillader test at køre i parallel eller i multi-threaded mode, hvilket giver en måde at teste disse multi-threaded stykker kode på.

Du kan konfigurere, så metoder, klasser og suiter kører i deres egne tråde, hvilket reducerer den samlede udførelsestid.

10.1. Klasser og metoder parallelt

For at køre testklasser parallelt skal du nævne parallel attribut i suite tag i XML-konfigurationsfil med værdi klasser:

Bemærk, at hvis vi har flere prøve tags i XML-filen, kan disse tests også køres parallelt ved at nævne parallel = ”tests”. Også at udføre individuelle metoder parallelt, nævne parallel = ”metoder”.

10.2. Flertrådet udførelse af testmetode

Lad os sige, at vi skal teste adfærden for en kode, når vi kører i flere tråde. TestNG giver mulighed for at køre en testmetode i flere tråde:

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

Det threadPoolSize angiver, at metoden kører ind n antal tråde som nævnt. Det invocationCount og tiden er gået angive, at testen udføres flere gange og mislykkes testen, hvis det tager mere tid.

11. Funktionstest

TestNG leveres med funktioner, som også kan bruges til funktionel test. I forbindelse med Selen kan det enten bruges til at teste funktionerne i en webapplikation eller bruges til at teste webservices med HttpClient.

Flere detaljer om funktionel test med Selen og TestNG er tilgængelige her. Også nogle flere ting på integrationstest i denne artikel.

12. Konklusion

I denne artikel havde vi et hurtigt kig på, hvordan man opsætter TestNG og udfører en simpel test case, genererer rapporter, samtidig udførelse af test cases og også lidt om funktionel programmering. For flere funktioner som afhængige tests, ignorering af testcases, testgrupper og suiter kan du se vores JUnit vs TestNG-artikel her.

Implementeringen af ​​alle kodestykker kan findes på Github.


$config[zx-auto] not found$config[zx-overlay] not found