junit vs testng what are differences
Sveobuhvatna usporedba između JUnit Vs TestNG okvira. Uključuje usporedbu napomena i značajnu usporedbu s primjerima:
U prethodnom uputstvu naučili smo anotaciju DisplayName i uvjetno izvršavanje testa na temelju različitih kriterija poput JRE verzije, varijabli okoline itd. Obraćali smo se i nekim važnim pitanjima oko teme.
Budući da smo kontinuirano učili o JUnit-u u prethodnim tutorijalima, ovaj će poslužiti kao odušak za našu publiku, jer ćemo neko vrijeme preusmjeriti fokus s JUnit-a kao jedinog dnevnog reda na usporedbu između JUnit-a i TestNG-a.
=> Ovdje pogledajte Savršeni vodič za trening JUnit-a.
Što ćete naučiti:
- JUnit Vs TestNG: Usporedba
- Zaključak
JUnit Vs TestNG: Usporedba
Značajke | JUNIT | TestNG |
---|---|---|
Istek za testove | Da | Da |
Okvir otvorenog izvora | Da JUnit je okvir otvorenog izvora | Da TestNG je okvir otvorenog izvora |
Korisniku ugodno | JUnit se distribuira kroz različite module, primjer: ? Za parametarizaciju će vam možda trebati JUnit Jupiter. ? To čini JUnit pomalo nezgrapnim za upotrebu u usporedbi s TestNG-om | Sve značajke TestNG dolaze u jednom modulu. To čini TestNG jednostavnijim za korisnike. |
Glavna podrška za IDE ( Primjer: Eclipse, IntelliJ) | Da Obje podržavaju većinu IDE-a jednako | Da Obje podržavaju većinu IDE-a jednako |
Provedba napomena | Da JUnit radi na bilješkama s malim varijacijama za različite značajke | Da TestNG radi na bilješkama s malim varijacijama za različite značajke |
Provedba tvrdnji | Da JUnit pruža dovoljno tvrdnji za provjeru očekivanih i stvarnih rezultata s nekim varijacijama tvrdnji u TestNG-u | Da TestNG također podržava ogroman popis tvrdnji za usporedbu očekivanih i stvarnih rezultata. Uz to, TestNG nudi dva mehanizma za tvrdnje - Soft Assertion i Hard Assertion |
Iznimke | Da JUnit pruža značajku za test iznimke s malim odstupanjima od TestNG-a | Da TestNG također nudi značajku za test iznimke |
Parametarska ispitivanja | Da JUnit podržava parametrizirane testove | Da TestNG također podržava parametrizirane testove |
Probni paket | Da JUnit podržava upotrebu testnih paketa | Da TestNG također podržava Test Suite. |
Test ovisnosti | Nemoj JUnit ne podržava značajku za test ovisnosti | Da Ovo je napredna značajka u TestNG-u preko JUnit-a. Ovom se značajkom jedna metoda može učiniti ovisnom o drugoj, tako da će se metoda izvoditi tek nakon što se ovisna metoda pokrene i prođe, a ovisni test neće biti pokrenut. |
Paralelno izvršavanje testa | Nemoj Paralelno izvršavanje nije dostupno u JUnit-u | Da TestNG podržava paralelno izvršavanje testova, ali JUnit ne. Postoji TestNG xml gdje se može postaviti paralelno izvršavanje |
Maven integracija | Da Oba alata podržavaju Maven integraciju | Da Oba alata podržavaju Maven integraciju |
Provedbe pretpostavki | Da Pretpostavke se koriste za preskakanje testova na temelju određenih pretpostavki ili uvjeta a ovo je primjenjivo samo u JUnit-u. | Nemoj TestNG ne podržava pretpostavke |
Redoslijed izvršenja testa | Da Junit podržava redoslijed izvođenja testa. | Da TestNG podržava redoslijed izvođenja testa |
Provedba slušatelja | Da JUnit podržava slušatelje ne putem napomena već kroz API za slušatelje. | Da TestNG podržava slušatelje putem bilješki. |
Zanemari testove | Da Obje podržavaju onemogućavanje testova, ali JUnit podržava onemogućavanje testova za izvršavanje na temelju različitih uvjeta | Da Oba podržavaju onemogućavanje testova |
Izvještavanje | Da JUnit mora biti integriran s maven za generiranje HTML izvještaja | Da TestNG ima ugrađene HTML izvještaje. Može se integrirati s mavenom ili s vanjskim knjižnicama izvješćivanja poput izvješća ATU ili izvješća Extent |
Usporedba napomena
TestNG i JUnit su okviri za jedinstveno testiranje iz svijeta Jave. Obje primjenjuju vrlo bliže i slične značajke. U ovom ćemo odjeljku pogledati neke sličnosti u implementaciji nekoliko značajki, dok bismo također mogli vidjeti nekoliko drugih značajki koje su različito implementirane u JUnit i TestNG.
# 1) Oznaka metode ispitivanja
Nema razlike u načinu na koji određujemo metodu kao ispitnu metodu u JUnit-u i TestNG-u.
JUNITET 5 | TestNG |
---|---|
@Test | @Test |
# 2) Bilješke povezane s Suiteom
- Metoda s oznakom @BeforeSuite izvršava se jednom prije pokretanja trenutnog paketa testova.
- Ova je napomena primjenjiva samo u TestNG-u.
JUNITET 5 | TestNG |
---|---|
Nije primjenjivo | @BeforeSuite |
# 3) Napomena za metodu prije nastave
Ovo je napomena za metodu koja se izvršava jednom prije pokretanja prve metode ispitivanja u klasi.
JUNITET 5 | TestNG |
---|---|
@BeforeAll | @BeforeClass |
# 4) Napomena za metodu prije testa
- Ova se napomena izvršava jednom prije metoda deklariranih unutar oznake testng.xml.
- Ova je napomena dostupna samo za TestNG.
JUNITET 5 | TestNG |
---|---|
Nije primjenjivo | @BeforeTest |
# 5) Napomena za metodu koja će se izvršiti prije svake metode s pozivima @Test
JUNITET 5 | TestNG |
---|---|
@BeforeEach | @BeforeMethod |
# 6) Napomena za metodu koja će se izvršiti nakon svake metode s pozivima @Test
JUNITET 5 | TestNG |
---|---|
@AfterEach | @AfterMethod |
# 7) Napomena za metodu nakon testa
- Ova se napomena izvršava jednom nakon metoda deklariranih unutar oznake testng.xml.
- Ova je napomena dostupna samo za TestNG.
JUNITET 5 | TestNG |
---|---|
Nije primjenjivo | @AfterTest |
# 8) Napomena za metodu nakon nastave
Ovo je napomena da se metoda izvršava jednom nakon pokretanja posljednje ispitne metode u klasi.
JUNITET 5 | TestNG |
---|---|
@Nakon svega | @Nakon nastave |
# 9) Bilješka o onemogućavanju izvršavanja metode ispitivanja.
- JUnit 5 pruža napomenu za onemogućavanje određenog izvođenja testa.
- TestNG pruža atribut za @Test, tj. 'Omogućen' s logičkom vrijednošću koja odlučuje hoće li izvršenje metode biti onemogućeno ili omogućeno
JUNITET 5 | TestNG |
---|---|
@zanemariti | @Test (omogućeno = netačno) |
Pogledajte Vodič 7 Preskakanje izvršenja kako biste razumjeli kako onemogućiti testove u JUnit4 vs JUnit 5
# 10) Bilješka o vremenskom ograničenju
Napomena je ista za JUnit 5 i TestNG
JUNITET 5 | TestNG |
---|---|
@Test (timeout = 2000) | @Test (timeout = 2000) |
# 11) Atribut očekivane iznimke
- Klasa iznimke navodi da se prilikom izvođenja testa baca iznimka dane klase.
- To je podržano u JUnit-u i TestNG-u s varijacijama u načinu na koji su oba deklarirana.
JUNITET 5 | TestNG | |
---|---|---|
@Test (očekuje se = NullPointerException.class) | @Test (očekuje seException = NullPointerException.class) |
# 12) Bilješka vezana uz Suite
- Metoda s oznakom @AfterSuite izvršava se jednom nakon pokretanja trenutnog paketa testiranja.
- Ova je napomena primjenjiva samo u TestNG-u.
JUNITET 5 | TestNG |
---|---|
Nije primjenjivo | @AfterSuite |
# 13) Bilješke povezane s grupom
- Napomena je dostupna samo u programu TestNG.
- Metoda s oznakom @BeforeGroups izvodi se prije pokretanja metoda ispitivanja koje pripadaju određenoj skupini.
JUNITET 5 | TestNG | |
---|---|---|
Nije primjenjivo | @BeforeGroups |
- Napomena je dostupna samo u programu TestNG.
- Metoda s oznakom @BeforeGroups izvodi se nakon pokretanja metoda ispitivanja koje pripadaju određenoj skupini.
JUNITET 5 | TestNG |
---|---|
Nije primjenjivo | @AfterGroups |
# 14) Bilješke povezane s redoslijedom izvršenja
I JUnit i TestNG podržavaju izričito postavljanje redoslijeda testova za izvršavanje. Drugim riječima, postavljanje prioriteta za test slučajeve.
- JUnit 5 ima napomenu @TestMethodOrder () s ugrađenom klasom MethodOrderer paketa - Alphanumeric.class ili OrderAnnotation.class ili Random.class kao ulazni parametar za napomenu.
Pogledajte Vodič 9 - Nalog za izvršenje testnog testa za više detalja o postavljanju naloga za izvršavanje testa u JUnit.
- TestNG uključuje atribut 'prioritet' za bilješku @Test koji prihvaća numeričku vrijednost.
JUNITET 5 | TestNG |
---|---|
@TestMethodOrder (alfanumerički.klasa) | @Test (prioritet = 1) |
Osnovni program za TestNG i JUnit 4
# 1) TestNG kôd
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'); } }
Očekivani rezultat:
# 2) JUnit 4 kod
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'); } }
Očekivani rezultat:
JUnit 5 vs TestNG: Razlika u značajkama s primjerima
# 1) Test Suite
- Paket za testiranje zbirka je testova, što znači da mi nekako zbrajamo više slučajeva iz više klasa.
- Pristup koji TestNG koristi paket je drugačiji i moćan u odnosu na pristup JUnit-a.
Probni paket u JUnit-u 5
Pogledajmo brzo kako JUnit 5 primjenjuje testni paket.
Pogledajte Vodič 8 - Jedinstveni testni paketi i filtriranje Slučajevi za bolje razumijevanje implementacije paketa testova u JUnit 4 i JUnit 5.
@RunWith(JUnitPlatform.class) @SelectClasses({JUnit5TestCase1.class, JUnit5TestCase2.class }) public class JUnitTestSuite { }
Probni paket u TestNG-u
TestNG koristi XML kao predložak u nastavku za umotavanje svih logički povezanih klasa testa
# 2) Parametarski test
I TestNG i JUnit omogućuju parametrizaciju testova što nije ništa drugo nego izvođenje istih testova s varijacijama podataka.
Parametarski test u JUnit-u 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); } }
Parametarski test u TestNG
Postoje 2 načina na koje biste mogli koristiti parametrizaciju u TestNG-u
- @Parameters i prolazak kroz TestNG XML
- Bilješka @DataProvider
a) @Parameters i prolazak kroz 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 za isto
b) DataProvider
Bilješka DataProvider uvijek vraća Object () () koji je niz objekata.
@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) Istek vremena
Ako se određeni test ne završi u predviđenom vremenu, dobiva vremensko ograničenje. U drugom slučaju, nit se prekida.
najbolje web stranice za preuzimanje youtube videozapisa
Istek u JUnit-u
Postoje različiti pristupi provedbi vremenskog ograničenja u JUnit-u. Ovi su:
- Upotreba uobičajenog vremenskog ograničenja s određenim milisekundama
- Koristeći timeout s tvrdnjom
- Korištenje globalnog vremenskog ograničenja
Imat ćemo detaljan vodič s naglaskom na vremensko ograničenje za JUnit 4 i JUnit 5.
Ispod je isječak koji prikazuje upotrebu uobičajenog vremenskog ograničenja u JUnit 5:
@Test(timeout = 5000) public void testTimeout() throws InterruptedException { while (true) { } }
Gornje vremensko ograničenje testa nakon 5 sekundi.
Istek vremena u TestNG-u
TestNG također koristi jednostavan način provedbe vremenskog ograničenja:
@Test(timeout = 5000) public void testTimeout() throws InterruptedException { while (true) { } }
# 4) Test iznimke
Test iznimke osigurava da se, kada postoji ovaj unaprijed definirani izuzetak, graciozno uhvati i obavijesti na zapisnicima.
Test iznimke u JUnit-u 4
@Test (expected = NumberFormatException.class) public void converttoint() { Int j=Integer.parseInt(“Four”); }
Bit će izdvojena lekcija koja će detaljno obrađivati iznimke za JUnit 4 i 5.
Test iznimke u TestNG-u
Postoji mala promjena u testu izjave o iznimci u TestNG-u:
@Test (expectedExceptions = NumberFormatException.class) public void converttoint() { Int j=Integer.parseInt(“Four”); }
# 5) Onemogući test
I TestNG i JUnit omogućuju onemogućavanje testa za izvršenje.
Onemogućeni test u JUnit 5
koji sloj osi modela radi s okvirima?
Oznaka @Disabled kada se koristi na vrhu razreda, svi testovi unutar klase preskaču se radi izvršenja. Napomena kada se koristi povrh određene metode @Test, taj je specifični testni slučaj onemogućen za izvršenje.
import org.junit.AfterClass; @Disabled('the testcase is under development') public class JUnitProgram {
Onemogućeni test u TestNG
TestNG omogućuje testiranje da onemogući izvršavanje testa kada je atribut 'omogućen' bilješke @Test postavljen na false i omogućen je kada je atribut postavljen na true. Ako svi testovi unutar klase moraju biti omogućeni, tada izričito označite enabled = true za svaku @Test metodu.
Ispod je isječak koda koji pokazuje preskakanje testa.
@Test(enabled=false) public void f_validate(){ // let us skip this function}
# 6) Grupni testovi
Bilo je kontradiktornih izjava na više web lokacija i foruma gdje su ljudi spominjali da JUnit nikada nije podržavao grupiranje testova s određenim nazivom grupe.
Bilješke @BeforeGroups i @AfterGroups dolaze samo s TestNG, no grupiranje je dopušteno u JUnit 4, kao i u JUnit 5. Ovdje ćemo brzo pokazati upotrebu grupnih testova u JUnit 5. Grupni testovi nazivaju se kategorijama u JUnit 4 i Oznake u JUNITU 5.
Možete se pozvati na Vodič 8 - JUnit ispitni paketi i testovi filtriranja za detalje o upotrebi u JUnit-u.
Grupni testovi u JUnit-u 5
@Tag(“Regression”) @Test public void junitMethod1(){} @Tag(“SmokeTest”) @Test public void junitMethod2(){
Isječak koda s JUnit5TestSuite.java:
Dolje navedeni kôd uključuje grupu s imenom 'Regresija' i isključuje grupu 'SmokeTest' koja pretpostavlja da će junitMethod1 () biti pokrenuta, ali junitMethod2 () je isključena.
@RunWith(JUnitPlatform.class) @SelectPackages({“demo.tests“}) @IncludeTags(“Regression”) @ExcludeTags(“SmokeTest”) public class JUnit5TestSuite { }
Grupni testovi u TestNG-u
Ako gornji isječak treba protumačiti u TestNG-u, onda je ispod kôd za isti:
@Test(groups={“Regression” }) public void junitMethod1(){} @Test(groups={“SmokeTest” }) public void junitMethod2(){}
TestNG XML je kako slijedi:
Ovdje su metode regresijske grupe uključene u pokretač, dok je ostatak grupa, uključujući SmokeTest, isključen.
# 7) Paralelna ispitivanja
Ovo je značajka koja je dostupna samo s TestNG-om. Obično su test slučajevi vrste niti koje se prizivaju jedna za drugom. Međutim, ako želite uštedjeti na vremenu izvršenja, to možete kontrolirati u TestNG-u postavljanjem testova koji će se izvoditi paralelno i pružanjem broja niti koje se trebaju istodobno pokrenuti.
Ukratko ćemo pokazati upotrebu ovisno o metodama ovdje i nećemo raspravljati o ovisno o skupinama.
Ovisni test o drugoj metodi postavlja se putem TestNG XML kako slijedi:
# 8) Ovisni testovi
Ovisni testovi napredne su značajke dostupne samo uz TestNG. Ovisnosti mogu biti na testu ili na grupi.
@Test mytest1(){ System.out.println(“My test : mytest1”); } @Test (dependensOnMethods={“mytest1”}) public void mytest2(){ System.out.println(“My test : mytest2”); }
U gornjem programu, budući da mytest2 ovisi o mytest1, prvo se pokreće mytest1, a zatim se pokreće mytest2. Ako mytest1 ne uspije, tada se neće pokrenuti mytest2. Na ovaj se način mogu unaprijed definirati ovisni testni slučajevi za kontrolu određenog tijeka rada koji želite izvršiti.
# 9) Slušatelji
Slušatelji slušaju svaki događaj koji se dogodi u okviru testova. Slušatelji su podržani kako u JUnit-u, tako i u TestNG-u. Dakle, ako želite izvršiti određene zadatke ili prikazati određenu poruku u zapisniku prije početka testa, nakon završetka testa, kada se test preskoči, kada je test položen ili nije uspio, imamo ove funkcije slušatelja koje nam omogućuju napravi to
JUnit koristi klasu slušatelja, a TestNG sučelje slušatelja. TestNG napiši klasu slušatelja definirajući metode sučelja slušatelja, a drugi je korak pozvati ovo ime klase slušatelja pomoću bilješke @Listeners u glavnoj klasi.
JUnit također nasljeđuje metode iz roditeljske klase slušatelja nakon čega je definirana klasa tricača slušatelja koja primjenjuje funkcije slušatelja na jednu ili više glavnih klasa.
Slušatelj u TestNG-u
Postoji sučelje ITestListener iz kojeg je implementiran TestNG.
Ispod su metode koje treba definirati kada se implementira ITestListener -
- OnTestStart ()
- OnTestFailure ()
- OnTestSuccess ()
- OnTestSkipped ()
- OnStart ()
- OnFinish ()
Ispod je isječak koda koji demonstrira onTestStart () i 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()); }
Pozovite ovu klasu slušatelja u svoju glavnu klasu, kao što je prikazano dolje, pomoću bilješke @Listener:
import org.testng.annotations.Listeners; import org.testng.annotations.Test; @Listeners(com.javatpoint.Listener.class) public class MymainClass { @Test public void sum() {
Slušatelj u JUnit 5
RunListener je klasa koju vaša klasa slušatelja treba proširiti kako bi se definirale funkcije slušatelja.
Za JUnit imamo metode kako slijedi:
- testRunStarted
- testRunFinished
- testFailure
- tesIgnorirano
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()); }
Potrebno je stvoriti klasu izvršavanja slušatelja da bi se pozvala navedena klasa slušatelja.
Možete primijeniti klasu slušatelja Mylistener na više klasa s test metodama.
public class ListenerRunner { public static void main(String() args) { JUnitCore runme = new JUnitCore(); runme.addListener(new ListenerRunner()); runner.run(FirstClass.class, SecondClass.class); }
Zaključak
U ovom uputstvu za JUnit Vs TestNG usporedili smo okvire TestNG i JUnit. Saznali smo zajedničke značajke podržane u oba okvira, kao i dodatne značajke podržane samo u TestNG-u. Očigledno postoji nekoliko dodatnih značajki samo u TestNG-u, poput paralelnog izvršavanja i testova ovisnosti. Većina značajki koje podržava TestNG također je dostupna u JUnit-u.
Postoje mala odstupanja u pogledu sintakse, terminologije u JUnit-u u odnosu na TestNG za zajedničke značajke. Oni koji su potkopali snagu JUnit-a u odnosu na TestNG, do sada bi shvatili, tj. JUnit je također jedan od moćnih okvira automatizacije.
Vratit ćemo se s još mnogo zanimljivih aspekata JUnit-a. Držite se nadolazećih tutorijala !!!
Preporučena literatura
- JUnit lekcije za početnike - što je JUnit testiranje
- Popis JUnit napomena: JUnit 4 vs JUnit 5
- Kako koristiti bilješku JUnit 5 @Ponovljeni test s primjerima
- JUnit Ignore Test Case: JUnit 4 @Ignore Vs JUnit 5 @Disabled
- Instalacija TestNG-a, osnovni program i izvješća
- Bilješke i slušatelji TestNG-a
- Vodič za TestNG: Uvod u TestNG Framework
- Tvrdnje u selenu korištenjem Junit i TestNG okvira