junit vs testng what are differences
En omfattende sammenligning mellom JUnit Vs TestNG rammer. Inkluderer sammenligning av merknader og sammenligning av funksjoner med eksempler:
I den forrige opplæringen lærte vi DisplayName-merknader og betinget testutførelse basert på forskjellige kriterier som JRE-versjon, miljøvariabler osv. Vi adresserte også noen viktige spørsmål rundt emnet.
Siden vi kontinuerlig har lært om JUnit i tidligere opplæringsprogrammer, vil denne fungere som en pustepuste for vårt publikum, ettersom vi en stund vil flytte fokus fra JUnit som eneste agenda til sammenligningen mellom JUnit vs TestNG.
=> Sjekk ut den perfekte JUnit-treningsguiden her.
Hva du vil lære:
- JUnit Vs TestNG: En sammenligning
- Konklusjon
JUnit Vs TestNG: En sammenligning
Egenskaper | JUnit | TestNG |
---|---|---|
Tidsavbrudd for tester | Ja | Ja |
Åpen kilde | Ja JUnit er et opensource-rammeverk | Ja TestNG er et open source-rammeverk |
Brukervennlig | JUnit er fordelt på forskjellige moduler, eksempel: ? For parameterisering trenger du kanskje JUnit Jupiter. ? Dette gjør JUnit litt tungvint å bruke sammenlignet med TestNG | Alle TestNG-funksjonene kommer i en modul. Dette gjør TestNG mer brukervennlig. |
Stor IDE-støtte ( Eksempel: Formørkelse, IntelliJ) | Ja Begge støtter det meste av IDE likt | Ja Begge støtter det meste av IDE likt |
Implementering av merknader | Ja JUnit jobber med merknader med små variasjoner for forskjellige funksjoner | Ja TestNG jobber med merknader med små variasjoner for forskjellige funksjoner |
Implementering av påstander | Ja JUnit gir nok påstander for å validere forventede og faktiske resultater med noen variasjoner til påstander i TestNG | Ja TestNG støtter også en enorm liste over påstander for sammenligning av forventede og faktiske resultater. I tillegg tilbyr TestNG to mekanismer for påstander - Soft Assertion og Hard Assertion |
Unntak | Ja JUnit gir funksjonen for unntakstest med en liten variasjon til TestNG | Ja TestNG gir også funksjonen for unntakstest |
Parameteriserte tester | Ja JUnit støtter parametrerte tester | Ja TestNG støtter også parametrerte tester |
Test Suite | Ja JUnit støtter bruk av testserier | Ja TestNG støtter også Test Suite. |
Avhengighetstest | Nei JUnit støtter ikke funksjonen for avhengighetstest | Ja Dette er en avansert funksjon i TestNG over JUnit. Med denne funksjonen kan en metode gjøres som avhengig av den andre slik at metoden bare kjøres etter at den avhengige metoden kjører og består ellers vil den avhengige testen ikke kjøre. |
Parallell testutførelse | Nei Parallell kjøring er ikke tilgjengelig i JUnit | Ja TestNG støtter parallell gjennomføring av tester, men JUnit gjør det ikke. Det er en TestNG xml der parallell kjøring kan settes |
Maven Integration | Ja Begge verktøyene støtter Maven Integration | Ja Begge verktøyene støtter Maven Integration |
Implementeringer av antagelser | Ja Forutsetninger brukes til å hoppe over tester basert på visse forutsetninger eller forhold og dette gjelder bare i JUnit. | Nei TestNG støtter ikke antagelser |
Bestilling av testutførelse | Ja Junit støtter rekkefølgen på testutførelsen. | Ja TestNG støtter rekkefølgen på testutførelsen |
Implementering av lyttere | Ja JUnit støtter lyttere ikke gjennom merknader, men gjennom lytterens API. | Ja TestNG støtter lyttere gjennom merknader. |
Ignorer tester | Ja Begge støtter deaktivering av tester, men JUnit støtter deaktivering av tester for utføring basert på forskjellige forhold | Ja Begge støtter deaktivering av tester |
Rapportering | Ja JUnit må integreres med maven for å generere HTML-rapporter | Ja TestNG har sine innebygde HTML-rapporter. Den kan integreres med maven så vel som eksterne rapporteringsbiblioteker som ATU-rapport eller Omfangsrapporter |
Sammenligning av merknader
TestNG og JUnit er begge enhetstestingsrammer fra Java-verdenen. Begge implementerer veldig nærmere og lignende funksjoner. I denne delen skal vi se på noen likheter i implementeringen av et par funksjoner, mens vi også får se noen få andre funksjoner som er implementert annerledes i JUnit og TestNG.
# 1) Testmetodkommentar
Det er ingen forskjell i måten vi spesifiserer en metode som en testmetode i både JUnit og TestNG.
JUnit 5 | TestNG |
---|---|
@Test | @Test |
# 2) Suite-relatert kommentar
- En metode med merknad @BeforeSuite kjøres en gang før den nåværende testpakken kjører.
- Denne merknaden gjelder bare i TestNG.
JUnit 5 | TestNG |
---|---|
Ikke aktuelt | @BeforeSuite |
# 3) Kommentar til en metode før klassen
Dette er merknaden for at metoden skal utføres en gang før den første testmetoden i klassen kjøres.
JUnit 5 | TestNG |
---|---|
@BeforeAll | @BeforeClass |
# 4) Kommentar til en metode før test
- Denne kommentaren kjøres en gang før metodene deklarert i taggen til testng.xml.
- Denne kommentaren er bare tilgjengelig for TestNG.
JUnit 5 | TestNG |
---|---|
Ikke aktuelt | @BeforeTest |
# 5) Merknad for metoden som skal utføres før hver metode med @Test påkaller
JUnit 5 | TestNG |
---|---|
@BeforeEach | @BeforeMethod |
# 6) Merknad for metoden som skal utføres etter hver metode med @Test påkaller
JUnit 5 | TestNG |
---|---|
@EfterEach | @AfterMethod |
# 7) Merknad for metode etter test
- Denne merknaden utføres én gang etter metodene som er deklarert i taggen til testng.xml.
- Denne kommentaren er bare tilgjengelig for TestNG.
JUnit 5 | TestNG |
---|---|
Ikke aktuelt | @AfterTest |
# 8) Merknad for metode etter klasse
Dette er merknaden for at metoden skal utføres en gang etter at den siste testmetoden i klassen er kjørt.
JUnit 5 | TestNG |
---|---|
@Tross alt | @Etter timen |
# 9) Kommentar for å deaktivere utførelsen av testmetoden.
- JUnit 5 gir en kommentar for å deaktivere en spesifikk testutførelse.
- TestNG gir et attributt for @Test, dvs. 'aktivert' med den boolske verdien som avgjør om kjøringen av metoden vil bli deaktivert eller aktivert
JUnit 5 | TestNG |
---|---|
@overse | @Test (aktivert = usann) |
Referere til Opplæring 7 Hopp over kjøring å forstå hvordan du deaktiverer tester i JUnit4 vs JUnit 5
# 10) Timeout-kommentar
Merknaden er den samme for JUnit 5 og TestNG
JUnit 5 | TestNG |
---|---|
@Test (timeout = 2000) | @Test (timeout = 2000) |
# 11) Forventet unntaksattributt
- Unntaksklasse sier at når testen utføres, kastes unntaket fra den gitte klassen.
- Dette støttes både i JUnit og TestNG med variasjon i måten begge blir erklært på.
JUnit 5 | TestNG | |
---|---|---|
@Test (forventet = NullPointerException.class) | @Test (forventetException = NullPointerException.class) |
# 12) Suite-relatert kommentar
- En metode med merknad @AfterSuite kjøres en gang etter at den nåværende testpakken kjører.
- Denne merknaden gjelder bare i TestNG.
JUnit 5 | TestNG |
---|---|
Ikke aktuelt | @AfterSuite |
# 13) Grupperelatert kommentar
- Merknaden er bare tilgjengelig i TestNG.
- Metoden med merknad @BeforeGroups kjører før testmetodene som tilhører en bestemt gruppe kjøres.
JUnit 5 | TestNG | |
---|---|---|
Ikke aktuelt | @BeforeGroups |
- Merknaden er bare tilgjengelig i TestNG.
- Metoden med merknad @BeforeGroups kjører etter at testmetodene som tilhører en bestemt gruppekjøring.
JUnit 5 | TestNG |
---|---|
Ikke aktuelt | @AfterGroups |
# 14) Annoteringer relatert til rekkefølge
Både JUnit og TestNG støtter eksplisitt å sette rekkefølgen på testene for utførelse. Med andre ord, å sette prioritet for testsaker.
- JUnit 5 har kommentar @ TestMethodOrder () med MethodOrderer-pakkeens innebygde klasse - Alphanumeric.class eller OrderAnnotation.class eller Random.class som inndataparameter for kommentaren.
Referere til Tutorial 9 - Junit Test Execution Order for mer informasjon om innstilling av testutførelsesrekkefølge i JUnit.
- TestNG inkluderer attributtet ‘prioritet’ for @Test-kommentar, som godtar en numerisk verdi.
JUnit 5 | TestNG |
---|---|
@TestMethodOrder (alfanumerisk.klasse) | @Test (prioritet = 1) |
Grunnleggende program for TestNG og JUnit 4
# 1) TestNG-kode
package newtest.com; import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; import org.testng.annotations.AfterMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.BeforeClass; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeTest; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeSuite; import org.testng.annotations.AfterSuite; public class NewTestng { @Test(dataProvider = 'dp') public void f(Integer n, String s) { System.out.println(' * * * * * * *Parameterized method * * * * * * * * * '); System.out.println('Integer '+n+' String '+s); System.out.println(' * * * * * * * * * * * * * * * * '); } @BeforeMethod public void beforeMethod() { System.out.println('Before Method'); } @AfterMethod public void afterMethod() { System.out.println('After Method'); } @DataProvider public Object()() dp() { return new Object()() { new Object() { 1, 'a' }, new Object() { 2, 'b'}, }; } @BeforeClass public void beforeClass() { System.out.println('Before Class'); } @AfterClass public void afterClass() { System.out.println('After Class'); } @BeforeTest public void beforeTest() { System.out.println('Before Test'); } @AfterTest public void afterTest() { System.out.println('After Test'); } @BeforeSuite public void beforeSuite() { System.out.println('Before Suite'); } @AfterSuite public void afterSuite() { System.out.println('After Suite'); } }
Forventet utgang:
# 2) JUnit 4-kode
package demo.tests; import static org.junit.Assert.*; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.BeforeClass; import org.junit.AfterClass; public class JunitTest { @Parameterized.Parameters public static Object()() data() { return new Object(3)(0); } @BeforeClass public static void beforeClass() { System.out.println('Before Class'; } @Before public void beforeMethod() { System.out.println('Before Method'); } @Test public void f() { System.out.println(' * * * * * * *test * * * * * * * * * '); int n=10; System.out.println('Integer '+n); System.out.println(' * * * * * * * * * * * * * * * * '); } @After public void afterMethod() { System.out.println('After Method'); } @AfterClass public static void afterClass() { System.out.println('After Class'); } }
Forventet utgang:
JUnit 5 vs TestNG: Funksjonsforskjell med eksempler
# 1) Test Suite
- Testpakken er en samling tester, noe som betyr at vi på en måte pakker inn flere testsaker fra flere klasser sammen.
- Tilnærmingen TestNG bruker suite er annerledes og kraftig sammenlignet med JUnit.
Testpakke i JUnit 5
La oss raskt se på hvordan JUnit 5 bruker testpakken.
Referere til Opplæring 8 -JUnit Test Suites & Filtering Testcases for bedre forståelse av implementeringen av Test suite i JUnit 4 og i JUnit 5.
@RunWith(JUnitPlatform.class) @SelectClasses({JUnit5TestCase1.class, JUnit5TestCase2.class }) public class JUnitTestSuite { }
Testpakke i TestNG
TestNG bruker XML som mal nedenfor for å pakke inn alle de logisk tilkoblede testklassene
# 2) Parameterisert test
Både TestNG og JUnit tillater parameterisering av tester som ikke er noe annet enn å kjøre de samme testene med datavariasjoner.
Parameterisert test i JUnit 4
@RunWith(value=Parameterized.class) public class JUnitclass{ int n; public JUnitclass (int num){ this.n=num; } @Parameters public static Iterable data(){ Object()() objectArray =new Object()() {{1},{2},{3}}; returnArrays.asList(objectArray); } @Test public void Junittst(){ System.out.println(“Multiples of 2 are :”+ 2*n); } }
Parameterisert test i TestNG
Det er to måter du kan bruke parameterisering på i TestNG
- @Parameters og passerer gjennom TestNG XML
- Kommentar @DataProvider
a) @Parameters og passerer gjennom TestNG XML
public class testins{ @Test @Parameters(value=”env_pd”) public void paramEnv(str env_pd){ If(env_pd=”QA”){ url=”definetest.com” } else if(env_pd=”accpt”){ url=”defineacc.com” }}}
XML for det samme
b) DataProvider
DataProvider-merknaden returnerer alltid Object () () som er en rekke objekter.
@DataProvider(name='state') public Object()() getDataFromDataprovider(){ return new Object()() { { 'Maharashtra', 'Pune' }, { 'Karnataka', 'Bangalore' }, { 'Kerala', 'Trivandrum' } }; @Test(dataProvider=”state”) public void paramMethd(str stateName, str cityName){ System.out.println(stateName+” ”+cityName); }
# 3) Tidsavbrudd
Hvis en bestemt test ikke fullføres i den fastsatte tiden, får den en timeout. I andre fall blir tråden avbrutt.
eksempler på internett av ting enheter
Tidsavbrudd i JUnit
Det er forskjellige tilnærminger til implementering av tidsavbrudd i JUnit. Disse er:
- Bruke vanlig tidsavbrudd med spesifikke millisekunder
- Bruke tidsavbrudd med påstanden
- Bruker global tidsavbrudd
Vi vil ha en detaljert veiledning som fokuserer på tidsavbrudd for JUnit 4 og JUnit 5.
Nedenfor er kodebiten som viser bruken av vanlig tidsavbrudd i JUnit 5:
@Test(timeout = 5000) public void testTimeout() throws InterruptedException { while (true) { } }
Ovenstående testtidsavbrudd etter 5 sekunder.
Tidsavbrudd i TestNG
TestNG bruker også den enkle måten å implementere Timeout på:
@Test(timeout = 5000) public void testTimeout() throws InterruptedException { while (true) { } }
# 4) Unntakstest
Unntakstest sørger for at når dette forhåndsdefinerte unntaket blir kastet, blir det nådig fanget og varslet på loggene.
Unntakstest i JUnit 4
@Test (expected = NumberFormatException.class) public void converttoint() { Int j=Integer.parseInt(“Four”); }
Det vil være en egen opplæring som dekker unntak for JUnit 4 og 5 i detalj.
Unntakstest i TestNG
Det er en liten endring i erklæringen om unntakstest i TestNG:
@Test (expectedExceptions = NumberFormatException.class) public void converttoint() { Int j=Integer.parseInt(“Four”); }
# 5) Deaktiver test
Både TestNG og JUnit tillater deaktivering av en test for utførelse.
Deaktivert test i JUnit 5
youtube musikkvideoer gratis nedlastingsprogramvare
@Deaktivert kommentar når den brukes øverst i klassen, hoppes alle testene i klassen for utføring. Merknaden når den brukes på toppen av en bestemt @Test-metode, er den spesifikke testsaken deaktivert for utføring.
import org.junit.AfterClass; @Disabled('the testcase is under development') public class JUnitProgram {
Deaktivert test i TestNG
TestNG tillater at en test deaktiverer kjøring av en test når attributtet “aktivert” av kommentar @ Test er satt til falsk, og det er aktivert når attributtet er satt til sant. Hvis alle tester i en klasse må aktiveres, markerer du eksplisitt aktivert = sann for hver @Test-metode.
Nedenfor er kodebiten som demonstrerer hoppingen over en test.
@Test(enabled=false) public void f_validate(){ // let us skip this function}
# 6) Gruppetester
Det har vært motstridende uttalelser på flere nettsteder og fora der folk har nevnt at JUnit aldri støttet grupperingen av tester med det spesifikke gruppenavnet.
Kommentarer @BeforeGroups og @AfterGroups kommer bare med TestNG men gruppering er tillatt i JUnit 4 så vel som i JUnit 5. Her vil vi raskt demonstrere bruken av gruppetester i JUnit 5. Gruppetester blir referert til som kategorier i JUnit 4 og Tags i JUnit 5.
Du kan referere til Opplæring 8 - JUnit Test Suites & Filtering Tests for detaljer om bruken i JUnit.
Gruppetester i JUnit 5
@Tag(“Regression”) @Test public void junitMethod1(){} @Tag(“SmokeTest”) @Test public void junitMethod2(){
Kodebit fra JUnit5TestSuite.java:
Koden nedenfor inkluderer gruppen med navnet “Regresjon” og ekskluderer gruppen “SmokeTest” som utleder at junitMethod1 () kjøres, men junitMethod2 () er ekskludert.
@RunWith(JUnitPlatform.class) @SelectPackages({“demo.tests“}) @IncludeTags(“Regression”) @ExcludeTags(“SmokeTest”) public class JUnit5TestSuite { }
Gruppetester i TestNG
Hvis kodebiten ovenfor må tolkes i TestNG, er koden nedenfor det samme:
@Test(groups={“Regression” }) public void junitMethod1(){} @Test(groups={“SmokeTest” }) public void junitMethod2(){}
TestNG XML er som følger:
Her er regresjonsgruppemetodene inkludert i løperen mens resten av gruppene inkludert SmokeTest er ekskludert.
# 7) Parallelle tester
Dette er funksjonen som bare er tilgjengelig med TestNG. Vanligvis er testsaker slags tråder som påkalles etter hverandre. Men hvis du ønsker å spare på utførelsestiden, kan du kontrollere dette i TestNG ved å angi at testene skal kjøres parallelt og oppgi antall tråder som må kjøres samtidig.
Vi vil kort demonstrere bruken av avhenger av metoder her og vil ikke diskutere avhengig av grupper.
Den avhengige testen på en annen metode blir angitt via TestNG XML som følger:
# 8) Avhengige tester
Avhengige tester er avanserte funksjoner som bare er tilgjengelige med TestNG. Avhengighetene kan være på en test eller på en gruppe.
@Test mytest1(){ System.out.println(“My test : mytest1”); } @Test (dependensOnMethods={“mytest1”}) public void mytest2(){ System.out.println(“My test : mytest2”); }
I det ovennevnte programmet, da mytest2 avhenger av mytest1, kjøres først mytest1 og deretter mytest2. Hvis mytest1 mislykkes, blir mytest2 ikke påkalt. Slik kan avhengige testsaker defineres på forhånd for å kontrollere en bestemt arbeidsflyt du ønsker å utføre.
# 9) Lyttere
Lyttere lytter til alle hendelser som skjer i testene. Lyttere støttes både i JUnit så vel som TestNG. Så hvis du ønsker å utføre bestemte oppgaver eller vise en spesifikk melding i loggen før testen starter, etter at testen er ferdig, når testen hoppes over, når testen er bestått eller mislyktes, har vi disse lytterfunksjonene som gjør det mulig for oss å gjør dette
JUnit bruker klassen Listener, og TestNG bruker et Listener-grensesnitt. TestNG skriv en lytterklasse som definerer lyttergrensesnittmetodene, og det andre trinnet er å kalle dette lytterens klassenavn ved hjelp av @Listeners-merknad i hovedklassen.
JUnit arver også metodene fra lytterens overordnede klasse, hvoretter en Listener runner-klasse er definert for å bruke lytterfunksjonene på en eller flere hovedklasser.
Lytter i TestNG
Det er et ITestListener-grensesnitt som TestNG implementeres fra.
Nedenfor er metodene som må defineres når ITestListener implementeres -
- OnTestStart ()
- OnTestFailure ()
- OnTestSuccess ()
- OnTestSkipped ()
- OnStart ()
- OnFinish ()
Nedenfor er kodebiten som demonstrerer onTestStart () og onTestSuccess ()
import org.testng.ITestListener; import org.testng.ITestResult; public class TestListener implements ITestListener { @Override public void onTestStart(ITestResult result) { System.out.println('Execution started: '+result.getName()); } @Override public void onTestSuccess(ITestResult result) { System.out.println('Test Passed '+result.getName()); }
Ring denne lytterklassen i hovedklassen din, som vist nedenfor, ved å bruke kommentar @Listener:
import org.testng.annotations.Listeners; import org.testng.annotations.Test; @Listeners(com.javatpoint.Listener.class) public class MymainClass { @Test public void sum() {
Lytter i JUnit 5
RunListener er klassen som må utvides av lytterklassen din for å kunne definere lytterfunksjonene.
Vi har metoder som følger for JUnit:
- testRunStarted
- testRunFinished
- testFeil
- tesIgnorert
import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunListener; public class Mylistenerclass extends RunListener { public void testRunStarted(Description desc) throws java.lang.Exception { System.out.println('Execution started' + desc.getMethodName()); } public void testRunFinished(Description desc) throws java.lang.Exception { System.out.println('Execution finished' + desc.getMethodName()); }
Det må være en lytterutførelseskurs som skal opprette for å påkalle ovennevnte lytterklasse.
Du kan bruke lytterens Mylistener-klasse til flere klasser med testmetoder.
public class ListenerRunner { public static void main(String() args) { JUnitCore runme = new JUnitCore(); runme.addListener(new ListenerRunner()); runner.run(FirstClass.class, SecondClass.class); }
Konklusjon
I denne JUnit Vs TestNG-opplæringen har vi sammenlignet TestNG og JUnit-rammeverk. Vi lærte de vanlige funksjonene som støttes i begge rammene, samt tilleggsfunksjoner som bare støttes i TestNG. Tilsynelatende er det bare et par ekstra funksjoner i TestNG, som parallelle utførelser og avhengighetstester. De fleste funksjonene som støttes av TestNG, er også tilgjengelige i JUnit.
Det er små avvik når det gjelder syntaks, terminologier i JUnit vs TestNG for de vanlige funksjonene. De som undergravde styrken til JUnit over TestNG ville ha innsett til nå, dvs. JUnit er også en av de kraftige automatiseringsrammer.
Vi kommer tilbake med mange flere interessante aspekter ved JUnit. Hold deg til de kommende opplæringene !!!
Anbefalt lesing
- JUnit Tutorial for nybegynnere - Hva er JUnit-testing
- Liste over JUnit-merknader: JUnit 4 Vs JUnit 5
- Slik bruker du JUnit 5-kommentar @RepeatedTest med eksempler
- JUnit Ignore Test Case: JUnit 4 @Ignore Vs JUnit 5 @Disabled
- TestNG installasjon, grunnleggende program og rapporter
- TestNG-merknader og lyttere
- TestNG Tutorial: Introduksjon til TestNG Framework
- Påstander i selen ved bruk av Junit And TestNG Frameworks