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 забезпечує два механізми тверджень - м'яке твердження та тверде твердження |
Винятки | Так JUnit надає функцію для тесту на винятки з невеликим відхиленням від TestNG | Так TestNG також надає функцію тесту на винятки |
Параметризовані тести | Так JUnit підтримує параметризовані тести | Так TestNG також підтримує параметризовані тести |
Тестовий набір | Так JUnit підтримує використання тестових наборів | Так TestNG також підтримує Test Suite. |
Тест на залежність | Не JUnit не підтримує функцію тесту на залежність | Так Це вдосконалена функція в TestNG над JUnit. За допомогою цієї функції один метод можна зробити залежним від іншого, таким чином, що метод буде запускатися лише після того, як залежний метод буде запущений і пройде, інакше залежний тест не буде запущений. |
Паралельне виконання тесту | Не Паралельне виконання недоступне в JUnit | Так TestNG підтримує паралельне виконання тестів, але JUnit - ні. Існує TestNG xml, де може бути встановлено паралельне виконання |
Інтеграція Maven | Так Обидва інструменти підтримують інтеграцію Maven | Так Обидва інструменти підтримують інтеграцію Maven |
Реалізація припущень | Так Припущення використовуються для пропуску тестів на основі певних припущень або умов і це застосовне лише в JUnit. | Не TestNG не підтримує припущення |
Порядок виконання тесту | Так Junit підтримує порядок виконання тесту. | Так TestNG підтримує порядок виконання тесту |
Впровадження слухачів | Так JUnit підтримує слухачів не через анотації, а через Listeners API. | Так TestNG підтримує слухачів за допомогою анотацій. |
Ігнорувати тести | Так Обидва підтримують відключення тестів, але JUnit підтримує відключення тестів для виконання на основі різних умов | Так Обидва підтримують відключення тестів |
Звітність | Так JUnit потрібно інтегрувати з maven для створення HTML-звітів | Так TestNG має вбудовані звіти HTML. Він може бути інтегрований з Maven, а також із зовнішніми бібліотеками звітів, такими як звіти ATU або звіти Extent |
Порівняння анотацій
І TestNG, і JUnit - це модульні модулі тестування зі світу Java. Обидва реалізують дуже близькі та подібні функції. У цьому розділі ми розглянемо деякі подібності в реалізації декількох функцій, а також побачимо кілька інших функцій, які реалізовані по-різному в JUnit та TestNG.
# 1) Анотація методу випробування
Немає різниці в тому, як ми визначаємо метод як метод тестування як в JUnit, так і в TestNG.
ТОП 5 | ТестNG |
---|---|
@ Тест | @ Тест |
# 2) Анотація, пов’язана із сюїтою
- Метод із анотацією @BeforeSuite виконується один раз перед запуском поточного набору тестів.
- Ця анотація застосовується лише в TestNG.
ТОП 5 | ТестNG |
---|---|
Не застосовується | @BeforeSuite |
# 3) Анотація до методу перед класом
Це анотація для методу, який повинен бути виконаний один раз перед запуском першого тестового методу в класі.
ТОП 5 | ТестNG |
---|---|
@BeforeAll | @BeforeClass |
# 4) Анотація до методу перед тестом
- Ця анотація виконується один раз перед методами, оголошеними всередині тегу testng.xml.
- Ця анотація доступна лише для TestNG.
ТОП 5 | ТестNG |
---|---|
Не застосовується | @BeforeTest |
# 5) Анотація для методу, що виконується перед кожним методом із викликом @Test
ТОП 5 | ТестNG |
---|---|
@BeforeEach | @BeforeMethod |
# 6) Анотація для методу, який буде виконуватися після кожного методу з викликами @Test
ТОП 5 | ТестNG |
---|---|
@AfterEach | @AfterMethod |
# 7) Анотація до методу після тесту
- Ця анотація виконується один раз після методів, оголошених всередині тегу testng.xml.
- Ця анотація доступна лише для TestNG.
ТОП 5 | ТестNG |
---|---|
Не застосовується | @AfterTest |
# 8) Анотація до методу після класу
Це анотація для методу, що виконується один раз після запуску останнього методу тестування в класі.
ТОП 5 | ТестNG |
---|---|
@Після всього | @Після занять |
# 9) Анотація про відключення виконання методу тесту.
- JUnit 5 забезпечує анотацію для вимкнення конкретного виконання тесту.
- TestNG надає атрибут для @Test, тобто ‘enabled’ з логічним значенням, яке вирішує, чи буде вимкнено чи ввімкнено виконання методу
ТОП 5 | ТестNG |
---|---|
@ignore | @Test (увімкнено = false) |
Відноситься до Підручник 7 Пропуск виконання щоб зрозуміти, як відключити тести в JUnit4 проти JUnit 5
# 10) Анотація тайм-ауту
Анотація однакова для JUnit 5 та TestNG
ТОП 5 | ТестNG |
---|---|
@Test (таймаут = 2000) | @Test (таймаут = 2000) |
# 11) Очікуваний атрибут виключення
- Клас винятків стверджує, що під час виконання тесту створюється виняток даного класу.
- Це підтримується як у JUnit, так і в TestNG із різними способами декларування обох.
ТОП 5 | ТестNG | |
---|---|---|
@Test (очікується = NullPointerException.class) | @Test (очікуванийException = NullPointerException.class) |
# 12) Анотація, пов’язана із сюїтою
- Метод з анотацією @AfterSuite виконується один раз після запуску поточного набору тестів.
- Ця анотація застосовується лише в TestNG.
ТОП 5 | ТестNG |
---|---|
Не застосовується | @AfterSuite |
# 13) Анотація, пов’язана з групою
- Анотація доступна лише у TestNG.
- Метод із анотацією @BeforeGroups запускається до запуску методів тестування, що належать до певної групи.
ТОП 5 | ТестNG | |
---|---|---|
Не застосовується | @BeforeGroups |
- Анотація доступна лише у TestNG.
- Метод із анотацією @BeforeGroups запускається після запуску методів тестування, що належать до певної групи.
ТОП 5 | ТестNG |
---|---|
Не застосовується | @AfterGroups |
# 14) Порядок виконання анотацій, пов’язаних із виконанням
Як JUnit, так і TestNG підтримують чітке встановлення порядку тестів для виконання. Іншими словами, встановлення пріоритету для тестових випадків.
- JUnit 5 має анотацію @TestMethodOrder () із вбудованим класом пакета MethodOrderer - Alphanumeric.class або OrderAnnotation.class або Random.class як вхідний параметр для анотації.
Відноситься до Підручник 9 - Порядок виконання пробного тесту для отримання детальної інформації про встановлення порядку виконання тесту в JUnit.
- TestNG включає атрибут ‘priority’ для анотації @Test, який приймає числове значення.
ТОП 5 | ТестNG |
---|---|
@TestMethodOrder (Буквено-цифровий.клас) | @Test (пріоритет = 1) |
Основна програма для TestNG та JUnit 4
# 1) TestNG Code
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 Suite & Filtering Тестові кейси для кращого розуміння реалізації набору тестів у JUnit 4 та JUnit 5.
@RunWith(JUnitPlatform.class) @SelectClasses({JUnit5TestCase1.class, JUnit5TestCase2.class }) public class JUnitTestSuite { }
Набір тестів у TestNG
TestNG використовує XML як наведений нижче шаблон, щоб обернути всі логічно пов’язані класи тесту
# 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
а) @ Параметри та проходження через 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) Час очікування
Якщо певний тест не проходить у встановлений час, він отримує тайм-аут. В іншому, Потік переривається.
який інструмент можна використовувати для візуального представлення та аналізу бази даних?
Час очікування в 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:
@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 дозволяє тесту відключити виконання тесту, коли для атрибута “enabled” анотації @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 Suite & Filtering Tests для отримання детальної інформації про використання в JUnit.
Групові тести в JUnit 5
@Tag(“Regression”) @Test public void junitMethod1(){} @Tag(“SmokeTest”) @Test public void junitMethod2(){
Фрагмент коду з JUnit5TestSuite.java:
Наведений нижче код включає групу з назвою “Regression” та виключає групу “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, після чого визначений клас runner 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 проти 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: Вступ до Framework TestNG
- Твердження в селені за допомогою середовищ Junit та TestNG