JUnit ErrorCollector @Rule із прикладом

⚡ Розумний підсумок

JUnit ErrorCollector – це правило, яке дозволяє тесту продовжувати роботу після невдачі, збираючи кожен об'єкт помилки та повідомляючи про них разом після завершення методу тестування, а не зупиняючи його.ping при першій проблемі.

  • 🔘 Мета: Продовжуйте тестування після невдалої перевірки твердження, мережі або графічного інтерфейсу, а потім повідомляйте про кожну зібрану помилку одночасно.
  • ☑️ Декларація: @Rule для публічного нестатичного поля ErrorCollector повідомляє JUnit прикріпити правило до кожного тесту.
  • ✅ Збір: addError(Throwable) зберігає будь-які помилки або винятки, оскільки Throwable є батьківським елементом для обох.
  • 🧪 Перевірка: checkThat() оцінює зіставлення та реєструє невідповідність, не перериваючи виконання інших операторів.
  • 🛠️ звітність: Провал trace перераховує кожен зібраний об'єкт для кидання з його власним номером рядка в JUnit вид
  • 📌 JUnit 5: Правила зникли з Юпітера, тому assertAll() або AssertJ SoftAssertions грають ту саму роль.

JUnit Правило ErrorCollector збирає кілька помилок за один тестовий запуск

У звичайному сценарії, коли ви виявляєте будь-яку помилку під час виконання тесту, ви зупиняєте тест, виправляєте помилку та повторно запускаєте тест.

Можливості JUnit має дещо інший підхід. З JUnit Колектор помилок, ви можете продовжувати виконання тесту навіть після виявлення проблеми або невдалого проходження тесту. Колектор помилок збирає всі об'єкти помилок і повідомляє про них лише один раз, після завершення виконання тесту.

Навіщо використовувати Error Collector?

Під час написання тестового скрипта потрібно виконати всі тести, навіть якщо будь-який рядок коду завершиться невдачею через збій мережі, невдачу твердження або з будь-якої іншої причини. У такому випадку ви все ще можете продовжувати виконання тестового скрипта, використовуючи спеціальну функцію, що надається JUnit відомий як «колектор помилок».

Для цього, JUnit використовує Анотація @Rule, який використовується для створення об'єкта збирача помилок. Після створення об'єкта для збирача помилок ви можете легко додати всі помилки до об'єкта за допомогою методу addError (можлива помилка)Як ви знаєте, Кидальний є суперкласом Виняток та помилка заняття в JavaКоли ви додаєте помилки таким чином, ці помилки будуть записані в журнал JUnit результат тесту.

Перевага додавання всіх помилок до колекціонера помилок полягає в тому, що ви можете перевірити всі помилки одночасно. Крім того, якщо скрипт завершується невдачею посеред виконання, виконання все одно продовжується до кінця методу тестування.

Примітка:У випадку використання простого твердження або блоку try/catch, використання методу збирання помилок буде неможливим.

Зразок коду

Щоб дізнатися більше про Колектор помилок, дивіться приклад коду нижче, який демонструє, як створити об'єкт Колектор помилок та додати всі помилки до цього об'єкта до tracпитання:

package guru99.junit;		

import org.junit.Rule;		
import org.junit.Test;		
import org.junit.rules.ErrorCollector;		

public class ErrorCollectorExample {				
    @Rule		
    public ErrorCollector collector = new ErrorCollector();							

    @Test		
    public void example() {					
    collector.addError(new Throwable("There is an error in first line"));							
    collector.addError(new Throwable("There is an error in second line"));							
    collector.checkThat(getResults(),			
                not(containsString("here is an error")));			
    // all lines of code will execute and at the end a combined failure will		
    be logged in.		
    }		
}	

Примітка: це ілюстративний прикладtract, не компільований файл. Його кінцевий коментар переноситься на другий рядок без початкового //, а getResults() та зіставники Hamcrest не відображаються. Повна версія, яку можна виконати, наведена нижче. Приклад використання ErrorCollector.

Що таке @Rule? JUnit?

JUnit забезпечує спеціальний вид обробки тестів, Тестовий випадок або набір тестів за допомогою Анотація @RuleВикористовуючи @Rule, ви можете легко додати або перевизначити поведінку тесту.

Існує кілька вбудованих правил, передбачених JUnit API, який може використовувати тестер, а також ви можете написати власне правило. Поле правила має бути публічним, нестатичним та такого типу, що реалізує TestRule.

Дивіться рядок коду нижче, який показує, як використовувати анотацію @Rule разом зі збирачем помилок:

@Rule				
public ErrorCollector collector= new ErrorCollector();

JUnit Примітка за 5 рік: Юпітер замінив правила API розширення, тому @Rule та ErrorCollector не існують в org.junit.jupiter. Найближчими еквівалентами є Assertions.assertAll() та AssertJ SoftAssertions. JUnit 4 код, показаний тут, все ще працює через вінтажний двигун. Дивіться JUnit анотації посібник для повної картиping.

Приклад використання ErrorCollector

Щоб зрозуміти збирач помилок, давайте створимо клас і правило для збору всіх помилок. Ви додасте всі помилки за допомогою addError(throwable).

Дивіться код нижче, який просто створює правило, що є не чим іншим, як «об’єктом збору помилок». Він також використовується для додавання всіх помилок, щоб повідомити про проблему в кінці:

ErrorCollectorExample.java

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Rule;		
import org.junit.Test;		
import org.junit.rules.ErrorCollector;		

public class ErrorCollectorExample {				
    @Rule		
    public ErrorCollector collector = new ErrorCollector();							

    @Test		
    public void example() {					
    collector.addError(new Throwable("There is an error in first line"));							
    collector.addError(new Throwable("There is an error in second line"));							

        System.out.println("Hello");					
        try {			
            Assert.assertTrue("A " == "B");					
        } catch (Throwable t) {					
            collector.addError(t);					
        }		
        System.out.println("World!!!!");					
    }		
}		

TestRunner.java

Давайте додамо наведений вище клас тестування до програми виконання тестів та виконаємо його, щоб зібрати всі помилки. Дивіться код нижче:

package guru99.junit;		

import org.junit.runner.JUnitCore;		
import org.junit.runner.Result;		
import org.junit.runner.notification.Failure;		

public class TestRunner {				
			public static void main(String[] args) {									
      Result result = JUnitCore.runClasses(ErrorCollectorExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      

вихід:

Дивіться на невдачу tracе, який tracвсі помилки в одному місці. JUnit view зараховує один запуск, але повідомляє про дві помилки та одну невдачу, кожна з яких має свій власний номер рядка:

Eclipse JUnit недостатність trace перерахування двох помилок Throwable та однієї помилки AssertionError, зібраних за один прогін

Переваги JUnit ErrorCollector

Можна використовувати a JUnit затвердження для функціональної або графічної перевірки, наприклад:

  1. assertEquals(String message, Object expected, Object actual), що порівнює, чи є два об'єкти рівними.
  2. Подібним чином assertTrue(булева умова) підтверджує, що умова є істинною.

Використання тверджень спрощує валідаційне тестування. Але одна з головних проблем полягає в тому, що виконання тесту зупиниться, навіть якщо одне твердження завершиться невдачею.

Безперервність тестування та обробка відновлення мають вирішальне значення для успіху автоматизації тестування, і це найбільше значення має в довгостроковій перспективі. Selenium потоки, де перезапуск браузера після кожної невдалої перевірки є дорогим. Збірник помилок – найкращий спосіб обробки таких сценаріїв.

Поширені запитання

addError(Throwable) записує помилку, яку ви вже перехопили або створили. checkThat(value, matcher) оцінює зіставлення Hamcrest та автоматично записує невідповідність, тому це читається як твердження, водночас дозволяючи виконувати інші оператори.

Так. Метод виконується до завершення, тоді JUnit позначає невдачу та виводить усі зібрані кидки під час невдачі trace. На прикладі знімка екрана показано дві помилки та один збій одного методу тестування.

JUnit сканує тестовий клас на наявність публічних полів екземпляра, анотованих @Rule, та застосовує кожне з них до кожного тестового методу. Приватне або статичне поле ігнорується, і JUnit викликає помилку ініціалізації замість запуску тесту.

Ні. Юпітер відмовився від механізму правил, тому org.junit.rules.ErrorCollector існує лише в JUnit 4. Використовуйте Assertions.assertAll() для згрупованих тверджень або додайте AssertJ SoftAssertions, коли потрібні більш розширені методи зіставлення.

Так, і це поширена закономірність. Сторінку з кількома полями можна перевірити за один прохід, зібравши всі невідповідності замість переривання на першому ж, що дозволяє уникнути перезапуску сеансу браузера для кожного знайденого дефекту.

Обидва відкладають звітування, але SoftAssert вимагає явного виклику assertAll() в кінці тесту, тоді як ErrorCollector повідомляє автоматично, коли метод повертає результат. Забуття assertAll() в TestNG мовчки приховує невдачі.

Група помічників зі штучним інтелектом зазнала тривалого провалу tracе за першопричиною, тому двадцять зібраних кидків зводяться до кількох окремих дефектів. Вони також пропонують, які перевірки належать до одного зібраного запуску, а не до окремих тестів.

Копілот GitHub легко записує поле @Rule, але часто змішує його з тестовим класом Jupiter, де правил не існує. Переконайтеся, що імпортовані дані мають формат org.junit, перш ніж запускати пакет.

Підсумуйте цей пост за допомогою: