junit vs testng what are differences
Изчерпателно сравнение между JUnit Vs TestNG рамки. Включва сравнение на анотациите и сравнение на функции с примери:
В предишния урок научихме анотацията на DisplayName и условното изпълнение на теста въз основа на различни критерии като версия на JRE, променливи на околната среда и др. Обсъдихме и някои важни въпроси около темата.
Тъй като непрекъснато учим за JUnit в предишни уроци, този ще работи като отдих за нашата аудитория, тъй като за известно време ще преместим фокуса си от JUnit като единствен дневен ред към сравнението между JUnit срещу TestNG.
=> Вижте тук перфектното ръководство за обучение на JUnit.
Какво ще научите:
- JUnit Vs TestNG: Сравнение
- Заключение
JUnit Vs TestNG: Сравнение
Характеристика | JUnit | ТестNG |
---|---|---|
Време за изчакване за тестове | Да | Да |
Рамка на отворен източник | Да JUnit е рамка на отворен източник | Да TestNG е рамка на отворен източник |
Удобен за потребителя | JUnit се разпределя между различни модули, пример: ? За параметризация може да ви е необходим JUnit Jupiter. ? Това прави JUnit леко тромав за използване в сравнение с TestNG | Всички функции на TestNG се предлагат в един модул. Това прави TestNG по-удобен за потребителя. |
Основна поддръжка на IDE ( Пример: Eclipse, IntelliJ) | Да И двете поддържат еднакво повечето IDE | Да И двете поддържат еднакво повечето IDE |
Прилагане на анотации | Да JUnit работи върху анотации с леки вариации за различни функции | Да TestNG работи върху анотации с леки вариации за различни функции |
Прилагане на твърдения | Да JUnit предоставя достатъчно твърдения за валидиране на очаквани и действителни резултати с някои вариации на твърдения в TestNG | Да TestNG също поддържа огромен списък с твърдения за сравнение на очакваните и действителните резултати. Освен това TestNG предоставя два механизма за твърдения - Soft Assertion и Hard Assertion |
Изключения | Да JUnit предоставя функцията за тест за изключение с леко отклонение от TestNG | Да TestNG предоставя и функцията за тест за изключение |
Параметризирани тестове | Да JUnit поддържа параметризирани тестове | Да TestNG също поддържа параметризирани тестове |
Тестови пакет | Да JUnit поддържа използването на тестови пакети | Да TestNG също поддържа Test Suite. |
Тест за зависимост | Не JUnit не поддържа функцията за тест за зависимост | Да Това е усъвършенствана функция в TestNG през JUnit. С тази функция един метод може да бъде направен зависим от друг, така че методът да се изпълнява само след като зависимият метод се изпълни и премине в противен случай зависимият тест няма да се изпълни. |
Изпълнение на паралелен тест | Не Паралелното изпълнение не е налично в JUnit | Да TestNG поддържа паралелно изпълнение на тестове, но JUnit не. Има TestNG xml, където може да се зададе паралелно изпълнение |
Maven интеграция | Да И двата инструмента поддържат Maven Integration | Да И двата инструмента поддържат Maven Integration |
Изпълнения на предположения | Да Предположенията се използват за пропускане на тестове въз основа на определени предположения или условия и това е приложимо само в JUnit. | Не TestNG не поддържа предположения |
Ред за изпълнение на теста | Да Junit поддържа реда на изпълнение на теста. | Да TestNG поддържа реда на изпълнение на теста |
Прилагане на слушатели | Да JUnit поддържа слушатели не чрез анотации, а чрез API за слушатели. | Да TestNG поддържа слушатели чрез анотации. |
Игнорирайте тестовете | Да И двете поддържат деактивиране на тестове, но JUnit поддържа деактивиране на тестове за изпълнение въз основа на различни условия | Да И двете поддържат деактивиране на тестове |
Отчитане | Да JUnit трябва да бъде интегриран с maven, за да генерира HTML отчети | Да TestNG има вградени HTML отчети. Той може да бъде интегриран както с maven, така и с външни библиотеки за отчитане като отчети ATU или отчети Extent |
Сравнение на анотациите
И двете TestNG и JUnit са модулни тестови рамки от света на Java. И двете изпълняват много по-близки и подобни функции. В този раздел ще разгледаме някои прилики при внедряването на няколко функции, докато ще видим и няколко други функции, които са внедрени по различен начин в JUnit и TestNG.
# 1) Анотация на метода за тестване
Няма разлика в начина, по който определяме метод като метод за тестване както в JUnit, така и в TestNG.
JUnit 5 | ТестNG |
---|---|
@Тест | @Тест |
# 2) Анотация, свързана със Suite
- Метод с анотация @BeforeSuite се изпълнява веднъж преди да се стартира текущият тестов пакет.
- Тази анотация е приложима само в TestNG.
JUnit 5 | ТестNG |
---|---|
Не е приложимо | @BeforeSuite |
# 3) Анотация за метод преди Class
Това е анотацията за метода, който трябва да се изпълни веднъж преди да бъде изпълнен първият тестов метод в класа.
JUnit 5 | ТестNG |
---|---|
@BeforeAll | @BeforeClass |
# 4) Анотация за метод преди Тест
- Тази анотация се изпълнява веднъж преди методите, декларирани във вътрешния таг на testng.xml.
- Тази анотация е достъпна само за TestNG.
JUnit 5 | ТестNG |
---|---|
Не е приложимо | @BeforeTest |
# 5) Анотация за метода, който трябва да се изпълни преди всеки метод с извикване на @Test
JUnit 5 | ТестNG |
---|---|
@BeforeEach | @BeforeMethod |
# 6) Анотация за метода, който трябва да бъде изпълнен след всеки метод с извикване на @Test
JUnit 5 | ТестNG |
---|---|
@AfterEach | @AfterMethod |
# 7) Анотация за метод след тест
- Тази анотация се изпълнява веднъж след методите, декларирани във вътрешния таг на testng.xml.
- Тази анотация е достъпна само за TestNG.
JUnit 5 | ТестNG |
---|---|
Не е приложимо | @AfterTest |
# 8) Анотация за метод след клас
Това е анотацията за метода, който трябва да се изпълни веднъж след последния тестов метод в класа.
JUnit 5 | ТестNG |
---|---|
@След всичко | @След часовете |
# 9) Анотация за деактивиране на изпълнението на тестовия метод.
- JUnit 5 предоставя анотация за деактивиране на конкретно изпълнение на теста.
- TestNG предоставя атрибут за @Test, т.е. ‘активиран’ с булева стойност, която решава дали изпълнението на метода ще бъде деактивирано или активирано
JUnit 5 | ТестNG |
---|---|
@ignore | @ Тест (активиран = невярно) |
Препоръчай на Урок 7 Пропускане на изпълнение за да разберете как да деактивирате тестове в JUnit4 срещу JUnit 5
# 10) Анотация за изчакване
Анотацията е еднаква за JUnit 5 и TestNG
JUnit 5 | ТестNG |
---|---|
@ Тест (изчакване = 2000) | @ Тест (изчакване = 2000) |
# 11) Очакван атрибут на изключение
- Класът на изключение посочва, че когато тестът се изпълнява, се изключва изключението на дадения клас.
- Това се поддържа както в JUnit, така и в TestNG с промяна в начина, по който са декларирани.
JUnit 5 | ТестNG | |
---|---|---|
@Test (очаква се = NullPointerException.class) | @Test (очакваноException = NullPointerException.class) |
# 12) Анотация, свързана с Suite
- Метод с анотация @AfterSuite се изпълнява веднъж след стартиране на текущия тестов пакет.
- Тази анотация е приложима само в TestNG.
JUnit 5 | ТестNG |
---|---|
Не е приложимо | @AfterSuite |
# 13) Анотация, свързана с група
- Анотацията е достъпна само в TestNG.
- Методът с анотация @BeforeGroups работи преди тестовите методи, принадлежащи към определена група.
JUnit 5 | ТестNG | |
---|---|---|
Не е приложимо | @BeforeGroups |
- Анотацията е достъпна само в TestNG.
- Методът с анотация @BeforeGroups работи след като тестовите методи, принадлежащи към определена група, се изпълняват.
JUnit 5 | ТестNG |
---|---|
Не е приложимо | @AfterGroups |
# 14) Анотации, свързани с реда за изпълнение
Както JUnit, така и TestNG поддържат изрично задаване на реда на тестовете за изпълнение. С други думи, определяне на приоритета за тестови случаи.
- JUnit 5 има анотация @TestMethodOrder () с вградения клас на пакета MethodOrderer - Alphanumeric.class или OrderAnnotation.class или Random.class като входен параметър за анотацията.
Препоръчай на Урок 9 - Поръчка за изпълнение на тестове на Junit за повече подробности относно задаването на реда за изпълнение на теста в JUnit.
- TestNG включва атрибут ‘приоритет’ за анотация @Test, който приема числова стойност.
JUnit 5 | ТестNG |
---|---|
@TestMethodOrder (буквено-цифров.клас) | @ Тест (приоритет = 1) |
Основна програма за TestNG и JUnit 4
# 1) TestNG код
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'); } }
Очакван резултат:
# 2) Код JUnit 4
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'); } }
Очакван резултат:
JUnit 5 срещу TestNG: Разлика в характеристиките с примери
# 1) Тестови пакет
- Тестовият пакет е колекция от тестове, което означава, че сме нещо като обвързване на множество тестови случаи от множество класове заедно.
- Подходът, който TestNG използва, е различен и мощен в сравнение с този на JUnit.
Тестов пакет в JUnit 5
Нека бързо разгледаме как JUnit 5 прилага тестовия пакет.
Препоръчай на Урок 8 -Junit Test Suites & Filtering Тестови случаи за по-добро разбиране на изпълнението на тестовия пакет в JUnit 4 и в JUnit 5.
@RunWith(JUnitPlatform.class) @SelectClasses({JUnit5TestCase1.class, JUnit5TestCase2.class }) public class JUnitTestSuite { }
Тестов пакет в TestNG
TestNG използва XML като шаблон по-долу, за да обгърне всички логически свързващи класове Test
# 2) Параметризиран тест
Както TestNG, така и JUnit позволяват параметризиране на тестове, което не е нищо друго, освен провеждането на едни и същи тестове с вариации на данните.
Параметризиран тест в 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); } }
Параметризиран тест в TestNG
Има 2 начина как можете да използвате параметризацията в TestNG
- @ Параметри и преминаване през TestNG XML
- Анотация @DataProvider
а) @Parameters и преминаване през 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 за същото
б) DataProvider
Анотацията на DataProvider винаги връща Object () (), който е масивът от обекти.
@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) Време за изчакване
Ако определен тест не завърши в определеното време, той получава таймаут. В други, нишката се прекъсва.
какво е добро изтегляне на mp3 за android
Време за изчакване в JUnit
Има различни подходи за изпълнение на времето за изчакване в JUnit. Това са:
- Използване на обичайния таймаут с конкретни милисекунди
- Използване на времето за изчакване с твърдението
- Използване на глобално изчакване
Ще имаме подробен урок, фокусиран върху времето за изчакване за JUnit 4 и JUnit 5.
По-долу е фрагментът, показващ използването на обичайното изчакване в JUnit 5:
@Test(timeout = 5000) public void testTimeout() throws InterruptedException { while (true) { } }
Горното изчакване на теста след 5 секунди.
Време за изчакване в TestNG
TestNG използва и простия начин за изпълнение на времето за изчакване:
@Test(timeout = 5000) public void testTimeout() throws InterruptedException { while (true) { } }
# 4) Тест за изключение
Тестът за изключения гарантира, че когато има това предварително дефинирано изключение, то е изящно уловено и известено в дневниците.
Тест за изключение в JUnit 4
@Test (expected = NumberFormatException.class) public void converttoint() { Int j=Integer.parseInt(“Four”); }
Ще има отделен урок, обхващащ подробно изключения за JUnit 4 и 5.
Тест за изключение в TestNG
Има малка промяна в теста за декларация за изключение в TestNG:
урок за свързан списък c ++
@Test (expectedExceptions = NumberFormatException.class) public void converttoint() { Int j=Integer.parseInt(“Four”); }
# 5) Деактивиране на теста
Както TestNG, така и JUnit позволява деактивиране на тест за изпълнение.
Тест за инвалиди в JUnit 5
@Disabled анотация, когато се използва в горната част на класа, всички тестове в класа се пропускат за изпълнение. Анотацията, когато се използва върху определен метод @Test, този конкретен тестов случай е деактивиран за изпълнение.
import org.junit.AfterClass; @Disabled('the testcase is under development') public class JUnitProgram {
Деактивиран тест в TestNG
TestNG позволява тест, за да деактивира изпълнението на тест, когато атрибутът „активиран“ на анотация @Test е зададен на false и е активиран, когато атрибутът е зададен на true. Ако всички тестове в даден клас трябва да бъдат активирани, тогава изрично маркирайте enabled = true за всеки метод @Test.
По-долу е фрагментът от код, който демонстрира пропускане на тест.
@Test(enabled=false) public void f_validate(){ // let us skip this function}
# 6) Групови тестове
Има противоречиви твърдения в множество сайтове и форуми, където хората споменават, че JUnit никога не е поддържал групирането на тестове с конкретното име на група.
Анотации @BeforeGroups и @AfterGroups идват само с TestNG, но групирането е разрешено в JUnit 4, както и в JUnit 5. Тук ще демонстрираме бързо използването на групови тестове в JUnit 5. Груповите тестове са посочени като категории в JUnit 4 и тагове в JUnit 5.
Може да се обърнете към Урок 8 - JUnit Test Suites и тестове за филтриране за подробности относно използването в JUnit.
Групови тестове в JUnit 5
@Tag(“Regression”) @Test public void junitMethod1(){} @Tag(“SmokeTest”) @Test public void junitMethod2(){
Кодов фрагмент от JUnit5TestSuite.java:
Кодът по-долу включва групата с името „Регресия“ и изключва групата „SmokeTest“, която предполага, че junitMethod1 () ще бъде изпълнена, но junitMethod2 () е изключена.
@RunWith(JUnitPlatform.class) @SelectPackages({“demo.tests“}) @IncludeTags(“Regression”) @ExcludeTags(“SmokeTest”) public class JUnit5TestSuite { }
Групови тестове в TestNG
Ако горният фрагмент трябва да бъде интерпретиран в TestNG, тогава по-долу е кодът за същото:
@Test(groups={“Regression” }) public void junitMethod1(){} @Test(groups={“SmokeTest” }) public void junitMethod2(){}
TestNG XML е както следва:
Тук методите на групата за регресия са включени в бегача, докато останалите групи, включително SmokeTest, са изключени.
# 7) Паралелни тестове
Това е функцията, която е достъпна само с TestNG. Обикновено тестовите случаи са вид нишки, които се извикват една след друга. Ако обаче искате да спестите време за изпълнение, можете да контролирате това в TestNG, като зададете тестовете да се изпълняват паралелно и да предоставите броя на нишките, които трябва да се изпълнят наведнъж.
Ще демонстрираме накратко използването на зависи от методите тук и няма да обсъждаме зависи от групите.
Зависимият тест за друг метод се задава чрез TestNG XML, както следва:
# 8) Зависими тестове
Зависимите тестове са разширени функции, достъпни само с TestNG. Зависимостите могат да бъдат от тест или от група.
@Test mytest1(){ System.out.println(“My test : mytest1”); } @Test (dependensOnMethods={“mytest1”}) public void mytest2(){ System.out.println(“My test : mytest2”); }
В горната програма, тъй като mytest2 зависи от mytest1, първо mytest1 работи и след това mytest2 се изпълнява. Ако mytest1 не успее, тогава mytest2 няма да бъде извикан. Ето как зависимите тестови случаи могат да бъдат предварително дефинирани, за да контролират конкретен работен поток, който искате да изпълните.
# 9) Слушатели
Слушателите слушат всяко събитие, което се случва в рамките на тестове. Слушателите се поддържат както в JUnit, така и в TestNG. Така че, ако искате да изпълните определени задачи или да покажете конкретно съобщение в дневника преди началото на теста, след приключване на теста, когато тестът е пропуснат, когато тестът е преминат или е неуспешен, имаме тези функции на слушателя, които ни позволяват да направите това
JUnit използва класа Listener, а TestNG използва интерфейс Listener. TestNG напише клас на слушател, дефиниращ методите на интерфейса на слушателя, и втората стъпка е да извика името на този клас на слушател, като използва анотация @Listeners в основния клас.
JUnit също наследява методите от родителския клас на Listener, след което се определя клас на бегач на Listener, за да приложи функциите на слушателя в един или повече основни класа.
Слушател в TestNG
Има интерфейс ITestListener, от който е реализиран TestNG.
По-долу са посочени методите, които трябва да бъдат дефинирани при внедряване на ITestListener -
- OnTestStart ()
- OnTestFailure ()
- OnTestSuccess ()
- OnTestSkipped ()
- OnStart ()
- OnFinish ()
По-долу е фрагментът от код, демонстриращ onTestStart () и 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()); }
Обадете се на този клас на слушател във вашия основен клас, както е показано по-долу, като използвате анотация @Listener:
import org.testng.annotations.Listeners; import org.testng.annotations.Test; @Listeners(com.javatpoint.Listener.class) public class MymainClass { @Test public void sum() {
Слушател в JUnit 5
RunListener е класът, който трябва да бъде разширен от вашия клас слушател, за да се дефинират функциите на слушателя.
Имаме методи, както следва за JUnit:
- testRunStarted
- testRunFinished
- testFailure
- tesIgnored
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()); }
Трябва да има създаден клас за изпълнение на слушател, който да извика горния клас слушател.
Можете да приложите класа на слушателя Mylistener към множество класове с тестови методи.
public class ListenerRunner { public static void main(String() args) { JUnitCore runme = new JUnitCore(); runme.addListener(new ListenerRunner()); runner.run(FirstClass.class, SecondClass.class); }
Заключение
В този урок за JUnit Vs TestNG сравнихме рамките TestNG и JUnit. Научихме общите функции, поддържани и в двете рамки, както и допълнителни функции, поддържани само в TestNG. Очевидно има само няколко допълнителни функции само в TestNG, като паралелно изпълнение и тестове за зависимост. Повечето функции, поддържани от TestNG, се предлагат и в JUnit.
Има леки отклонения по отношение на синтаксиса, терминологиите в JUnit спрямо TestNG за общите характеристики. Тези, които подкопават силата на JUnit над TestNG, биха осъзнали досега, т.е. JUnit също е една от мощните рамки за автоматизация.
Ще се върнем с много по-интересни аспекти на JUnit. Придържайте се към предстоящите уроци !!!
Препоръчително четене
- Урок за JUnit за начинаещи - какво е тестване на JUnit
- Списък на анотациите на JUnit: JUnit 4 срещу JUnit 5
- Как да използвам JUnit 5 Анотация @RepeatedTest с примери
- JUnit Ignore Test Case: JUnit 4 @Ignore Vs JUnit 5 @Disabled
- Инсталация на TestNG, основна програма и отчети
- Анотации и слушатели на TestNG
- Урок за TestNG: Въведение в TestNG Framework
- Твърдения в селен с помощта на рамки Junit и TestNG