JUnit Учебное пособие по аннотациям с примером: что такое @Test и @After

⚡ Умное резюме

JUnit Аннотации — это форма синтаксических метаданных, добавляемых к Java Исходный код, чтобы средство запуска тестов знало, какие методы выполнять, когда их запускать и сколько времени может занять каждый из них.

  • 🔘 @Тест: Помечает публичный метод void, который JUnit Выполняется как единый тестовый случай.
  • ☑️ Жизненный цикл: Антеги @Before и @After охватывают каждый тест, а аннотации @BeforeClass и @AfterClass — сам класс.
  • ✅ Управление @Ignore пропускает тест, @Test(timeout) ограничивает время выполнения, @Test(expected) проверяет наличие выброшенного исключения.
  • 🧪 Утверждения: org.junit.Assert предоставляет функции assertEquals, assertTrue, assertNull, assertSame и fail().
  • 🇧🇷 Наследие: TestCase, TestResult и TestSuite относятся к более старому пакету junit.framework.
  • 📊 JUnit 5: Jupiter переименовывает их в @BeforeEach, @AfterEach, @BeforeAll, @AfterAll и @Disabled.

JUnit Учебное пособие по аннотациям, охватывающее @Test, @Before и @After.

Что такое JUnit Аннотации?

JUnit аннотации представляют собой особую форму синтаксических метаданных, которые можно добавить к Java Исходный код для лучшей читаемости и структуры кода. Переменные, параметры, пакеты, методы и классы могут быть аннотированы. Аннотации были введены в JUnit 4, что делает Java Код становится более читабельным и простым. В этом и заключается главное отличие. JUnit 3 и JUnit 4: JUnit 4 основан на аннотациях.

Обладая практическими знаниями этих аннотаций, можно легко изучить и внедрить... JUnit тест. Ниже приведены важные и часто используемые JUnit список аннотаций, с JUnit Рядом с каждым из них находится 5 эквивалентов (Юпитер):

S.No. Аннотации Описание JUnit 5 эквивалентов
1. @Контрольная работа Эта аннотация заменяет аннотацию `junit.framework.TestCase` и указывает, что открытый метод `void`, к которому она прикреплена, может быть выполнен в качестве тестового случая. @Test (org.junit.jupiter.api)
2. @Перед Эта аннотация используется, если вы хотите выполнить какой-либо оператор, например предварительные условия, перед каждым тестовым примером. @BeforeEach
3. @BeforeClass Эта аннотация используется, если вы хотите выполнить какие-либо операторы перед всеми тестовыми случаями, например, тестовое соединение, которое должно быть открыто перед всеми тестовыми случаями. @BeforeAll
4. @После Эту аннотацию можно использовать, если вы хотите выполнить несколько операторов после каждого Тестовый кейснапример, сброс переменных или удаление временных файлов. @ПослеКаждого
5. @После занятий Эта аннотация может использоваться, если вы хотите выполнить определенные операторы после всех тестовых случаев, например, освободить ресурсы после выполнения всех тестовых случаев. @После всего
6. @ Игнорировать Эта аннотация может использоваться, если вы хотите игнорировать некоторые операторы во время выполнения тестов, например, отключать некоторые тестовые случаи во время выполнения тестов. @Неполноценный
7. @Тест (время ожидания = 500) Эта аннотация может использоваться, если вы хотите установить тайм-аут во время выполнения тестов, например, если вы работаете в рамках соглашения об уровне обслуживания (SLA) и тесты должны быть завершены в течение указанного времени. @Timeout или assertTimeout
8. @Test(ожидается=IllegalArgumentException.class) Эта аннотация может использоваться, если вы хотите обработать какое-либо исключение во время выполнения теста. Например, если вы хотите проверить, генерирует ли конкретный метод указанное исключение или нет. assertThrows

JUnit Пример аннотации

Давайте создадим класс, охватывающий важные JUnit аннотации с помощью простых операторов печати и выполнить их с помощью класса запуска тестов:

Шаг 1) Рассмотрим ниже Java Класс, содержащий различные методы, к которым привязаны указанные выше аннотации:

JunitAnnotationsExample.java

package guru99.junit;		

import static org.junit.Assert.assertEquals;				
import static org.junit.Assert.assertFalse;				

import java.util.ArrayList;		

import org.junit.After;		
import org.junit.AfterClass;		
import org.junit.Before;		
import org.junit.BeforeClass;		
import org.junit.Ignore;		
import org.junit.Test;		

public class JunitAnnotationsExample {				

    private ArrayList<String> list;					

    @BeforeClass		
    public static void m1() {							
        System.out.println("Using @BeforeClass , executed before all test cases ");					
    }		

    @Before		
    public void m2() {					
        list = new ArrayList<String>();					
        System.out.println("Using @Before annotations ,executed before each test cases ");					
    }		

    @AfterClass		
    public static void m3() {							
        System.out.println("Using @AfterClass ,executed after all test cases");					
    }		

    @After		
    public void m4() {					
        list.clear();			
        System.out.println("Using @After ,executed after each test cases");					
    }		

    @Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

    @Ignore		
    public void m6() {					
        System.out.println("Using @Ignore , this execution is ignored");					
    }		

    @Test(timeout = 10)			
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

    @Test(expected = NoSuchMethodException.class)					
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					

    }		

}		

Шаг 2) Давайте создадим класс для запуска тестов, чтобы выполнить вышеуказанный тест:

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(JunitAnnotationsExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

ожидаемый результат

  • Все тестовые случаи будут выполняться по очереди, и все сообщения для вывода будут отображаться в консоли.
  • Как указано в таблице выше, @Before и @BeforeClass в JUnit Методы m2() и m1() будут выполняться перед каждым тестовым случаем и перед всеми тестовыми случаями соответственно.
  • Аналогичным образом @After и @AfterClass в JUnit Методы m4() и m3() будут выполняться после каждого тестового случая и после всех тестовых случаев соответственно. Аннотация @Ignore (метод m6()) будет рассматриваться как игнорирование теста.

Давайте проанализируем тестовые примеры, использованные выше. Java класс подробно:

  1. Рассмотрим метод m5(), представленный ниже:
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

В описанном выше методе вы добавляете строку в переменную «list»:

  • список.isEmpty() вернет false.
  • AssertFalse(list.isEmpty()) должен возвращать истину.
  • В результате тестовый пример будет pass.

Поскольку вы добавили в список только одну строку, его размер равен единице.

  • список.размер() Должен возвращать целочисленное значение «1».
  • So AssertEquals(1, list.size()) должен возвращать истину.
  • В результате тестовый пример будет pass.
  1. Рассмотрим метод m7(), представленный ниже:
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

Как обсуждалось выше, @Test (время ожидания = 10) Используется для установки тайм-аута в тестовом случае. Значение указывается в миллисекундах, поэтому функция m7() должна завершиться в течение 10 мс.

  1. Рассмотрим метод m8(), представленный ниже:
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

Как обсуждалось выше, @Test(ожидается) В процессе выполнения будет произведена проверка на наличие указанного исключения, поэтому метод m8() выбросит исключение «No Such Method Exception». В результате тест будет выполнен с исключением.

Примечание о точности: Функция m8() только выводит строку, поэтому объявленное исключение фактически никогда не выбрасывается. JUnit 4 сообщает о неудачной проверке. Сопоставьте ожидаемый тип с тем, что на самом деле выдает метод. JUnit 5 пишет это с assertThrows.

Поскольку все тестовые случаи пройдены, это приводит к успешному выполнению теста.

Фактический результат

Поскольку в приведенном выше примере три тестовых случая, все тестовые случаи будут выполняться по очереди. См. скриншот консоли ниже:

Eclipse Вывод в консоль, отображающий операторы print @BeforeClass, @Before, @After и @AfterClass.
Вывод в консоль, созданный функцией JunitAnnotationsExample

См. ниже операторы печати, которые можно увидеть на консоли:

Использование @BeforeClass, выполняемое перед всеми тестовыми примерами.

Использование аннотаций @Before, выполняемых перед каждым тестовым примером.

Использование @After, выполняемого после каждого тестового примера

Использование аннотаций @Before, выполняемых перед каждым тестовым примером.

Используя @Test(timeout), его можно использовать для обеспечения тайм-аута в JUnit4 тестовых примера

Использование @After, выполняемого после каждого тестового примера

Использование аннотаций @Before, выполняемых перед каждым тестовым примером.

Используя @Test(expected), он проверит наличие указанного исключения во время выполнения.

Использование @After, выполняемого после каждого тестового примера

Использование @AfterClass, выполняемого после всех тестовых случаев

JUnit Утверждать класс

Аннотации определяют, когда выполняется метод; методы assert определяют, проходит ли он проверку.

Этот класс предоставляет набор методов проверки утверждений, полезных при написании тестовых случаев. Если все утверждения пройдены успешно, результаты теста считаются успешными. Если хотя бы одно утверждение не пройдено, результаты теста считаются неудачными. Этот класс предоставляет множество методов проверки утверждений, полезных при написании тестовых случаев. JUnit утверждать В этом руководстве подробно рассматривается каждый метод.

Как вы уже видели ранее, в таблице ниже описаны важные методы Assert и их описание:

S.No. Способ доставки Описание
1. void AssertEquals (ожидаемое логическое значение, фактическое логическое значение) Эта проверка сравнивает два значения, аналогично методу equals класса Object.
2. void AssertFalse (логическое условие) Функциональность заключается в проверке того, что условие ложно.
3. void AssertNotNull (объект объекта) Функциональность «assertNotNull» предназначена для проверки того, что объект не является нулевым.
4. void AssertNull (объект объекта) Функциональность «assertNull» предназначена для проверки того, что объект имеет значение NULL.
5. void AssertTrue (логическое условие) Функциональность «assertTrue» предназначена для проверки истинности условия.
6. недействительный сбой() Если вы хотите вызвать ошибку утверждения, функция fail() всегда выдаст сообщение об ошибке.
7. void AssertSame([Строковое сообщение] Функциональность «assertSame» заключается в проверке того, что два объекта ссылаются на один и тот же объект.
8. void AssertNotSame([Строковое сообщение] Функция «assertNotSame» предназначена для проверки того, что два объекта не ссылаются на один и тот же объект.

JUnit Класс тестовых примеров

Для запуска нескольких тестов доступен класс TestCase. junit.framework пакет. Аннотация @Test указывает JUnit что этот публичный метод void (здесь представлен тестовый пример), к которому он прикреплен, может быть запущен в качестве тестового примера.

Примечание к версии: Прецедент, Результат испытаний и Тестирование принадлежать наследию junit.framework пакет от JUnit 3. Они по-прежнему поставляются в составе артефакта junit 4.x, но тесты на основе аннотаций не расширяют TestCase.

В таблице ниже представлены некоторые важные методы, доступные в junit.framework.TestCase учебный класс:

S.No. Способ доставки Описание
1. int countTestCases() Этот метод используется для подсчета количества выполненных тестовых случаев. запустить (TestResult tr) метод.
2. Результат теста createResult() Этот метод используется для создания Результат испытаний объект.
3. Строка getName () Этот метод возвращает строку, которая представляет собой не что иное, как Прецедент имя.
4. ТестРезультат запуска() Этот метод используется для выполнения теста, который возвращает результат. Результат испытаний объект.
5. void run (результат TestResult) Этот метод используется для выполнения теста, имеющего Результат испытаний объект, который ничего не возвращает.
6. void setName (имя строки) Этот метод используется для задания имени Прецедент.
7. недействительный набор() Этот метод используется для написания кода, связывающего ресурсы, например, для создания подключения к базе данных.
8. недействительный разрыв() Этот метод используется для написания кода освобождения ресурсов, например, для освобождения соединения с базой данных после выполнения транзакционной операции.

JUnit Класс ТестРезультат

При выполнении теста возвращается результат (в виде Результат испытаний Объект TestResult можно использовать для анализа результирующего объекта. Результатом теста может быть либо неудача, либо успех.

В таблице ниже перечислены важные методы, используемые в классе junit.framework.TestResult:

S.No. Способ доставки Описание
1. void addError (Тестовый тест, Throwable t) Этот метод используется, если вам необходимо добавить ошибку в тест.
2. void addFailure (Тестовый тест, AssertionFailedError t) Этот метод используется, если необходимо добавить ошибку в список ошибок.
3. void endTest (Тестовый тест) Этот метод используется для уведомления о том, что тест выполнен (завершен).
4. int errorCount() Этот метод используется для получения информации об ошибках, обнаруженных во время выполнения тестов.
5. Перечисление ошибки() Этот метод просто возвращает коллекцию (в данном случае перечисление) ошибок.
6. интервал неудачиCount() Этот метод используется для получения количества ошибок, обнаруженных во время выполнения теста.
7. void run (тест TestCase) Этот метод используется для выполнения тестового примера.
8. интервал runCount() Этот метод просто подсчитывает количество выполненных тестов.
9. void startTest (Тестовый тест) Этот метод используется для уведомления о запуске теста.
10. недействительная остановка() Этот метод используется для остановки выполнения теста.

JUnit Класс тестового набора

Если вы хотите выполнить несколько тестов в указанном порядке, это можно сделать, объединив все тесты в одном месте. Это место называется набором тестов, и JUnit тестирование В обучающем видео подробно разбирается полный пример.

В таблице ниже приведены важные методы, используемые в junit.framework.TestSuite учебный класс:

S.No. Способ доставки Описание
1. void addTest (Тестовый тест) Этот метод используется, если вы хотите добавить тест в комплект.
2. void addTestSuite (Класс тесткласс) Этот метод используется, если вы хотите указать класс при добавлении теста в набор.
3. int countTestCases() Этот метод используется, если вы хотите подсчитать количество тестовых случаев.
4. Строка getName () Этот метод используется для получения имени набора тестов.
5. void run (результат TestResult) Этот метод используется для выполнения теста и сбора результатов теста в Результат испытаний объект.
6. void setName (имя строки) Этот метод используется для задания имени Тестирование.
7. Тест testAt(int index) Этот метод используется, если вам нужно вернуть результат теста по заданному индексу.
8. int testCount() Этот метод используется, если вам нужно вернуть количество тестов в наборе.
9. статическое тестовое предупреждение (строковое сообщение) Этот метод возвращает тест, который завершится неудачно, и зарегистрирует предупреждающее сообщение.

Часто задаваемые вопросы (FAQ)

Да. Метод обычно содержит аннотацию @Test вместе с @Ignore, или @Test с указанием таймаута и ожидаемого исключения. Нельзя использовать две аннотации жизненного цикла, такие как @Before и @After, одновременно в одном методе.

@Ignore только подавляет метод JUnit Уже распознан как тест. Без аннотации @Test рядом с ним исполнитель никогда не получит этот метод, поэтому он не будет запущен и не будет отмечен как пропущенный.

JUnit Метод выполняется в отдельном потоке и завершается с ошибкой TestTimedOutException после истечения лимита времени. Поток прерывается, а не завершается принудительно, поэтому блокирующий вызов может продолжать выполняться.

Только через винтажный движок. Добавление junit-vintage-engine позволяет... JUnit Платформа запускает существующие тесты org.junit без изменений, но тесты Jupiter должны импортировать org.junit.jupiter.api. Смешивание обоих наборов импортов в одном классе приводит к ошибке.

Только для технического обслуживания. Устаревшие наборы тестов, расширяющие TestCase и создающие объекты TestSuite, по-прежнему распространены в старых кодовых базах, поэтому знание API полезно. Новые тесты должны основываться на аннотациях.

JUnit Создает новый экземпляр тестового класса для каждого тестового метода, поэтому его не существует, когда необходимо выполнить настройку на уровне класса. Статическому методу экземпляр не нужен, и JUnit Отклоняет нестатическое объявление.

Искусственный интеллект-ассистенты считывают тестируемый метод и предлагают, следует ли использовать аннотацию `setup` в `@Before` или `@BeforeClass`, а также нужно ли использовать `@Test(expected)` или `assertThrows` для пути обработки ошибки. Каждое предложение следует рассматривать как черновик.

Второй пилот GitHub Обычно правильно размещаются элементы для монтажа и демонтажа, но часто происходит смешение. JUnit Импорт 4 и Jupiter осуществляется в одном файле. Проверьте блок импорта перед запуском набора тестов.

Подведем итог этой публикации следующим образом: