- Последняя версия JUnit, JUnit5, использует возможности Java8, чтобы создать более читаемую, удобную и гибкую структуру.
Аннотации
- @TestFactory : Указывает, что метод является динамическим тестом.
- @Nested : Позволяет нам определять вложенные классы внутри тестового класса.
-
@ExtendWith : Он используется для добавления необязательного класса или пакета.
-
По умолчанию методы должны быть определены как статические как для JUnit 4, так и для JUnit 5, но в JUnit 5 аннотация @TestInstance(TestInstance.Lifecycle.PER_CLASS) используется для удаления требования использовать статические методы.
Утверждения
JUnit 4
- В Junit 4 в org.junit.Assert есть все методы assert для проверки ожидаемых и достигнутых результатов.
public static void assertEquals(long expected, long actual)
public static void assertEquals(String message, long expected, long actual)
- В качестве первого аргумента ожидается дополнительный параметр для сообщения об ошибке.
JUnit 5
- В JUnit 5 org.junit.jupiter.Assertions включает большинство методов assert, в том числе новые методы assertThrows() и assertAll().
public static void assertEquals(long expected, long actual)
public static void assertEquals(long expected, long actual, String message)
public static void assertEquals(long expected, long actual, Supplier messageSupplier)
-
Дополнительный параметр для сообщения об ошибке ожидается в качестве последнего аргумента.
-
Поставщик messageSupplier позволяет динамически определить ответ в случае ошибки, используя ссылку на метод или лямбда-операцию.
-
В JUnit 4 при проверке того, что исключение было выброшено, мы использовали анотацию @test(expected = InterruptedException.class), тогда как в JUnit 5 мы можем проверить с помощью assertThrows следующим образом.
@Test
public void shouldThrowAnCheckedException(){
Exception exception = Assertions.assertThrows(IOException.class, () -> {
throw new IOException(
"We interrupt this test to throw an checked exception");
});
}
- Аналогично, контроль таймаута был изменен на @test(timeout = 10), assertTimeout.
@Test
public void testFailWithTimeout() throws InterrptedException{
Assertions.assertTimeout(Duration.ofMiilis, () -> Thread.sleep(100);
}
Допущения
JUnit 4
- В Junit 4, org.junit.Assume включает методы для указания предположений об условиях, при которых тест является значимым. К ним относятся ;
- assumeFalse()
- assumeNoException()
- assumeNotNull()
- assumeThat()
- assumeTrue()
- В качестве первого аргумента ожидается дополнительный параметр для сообщения об ошибке.
JUnit 5
-
В JUnit 5 количество этих предположений сократилось, и их стало 3. Кроме того, эти методы теперь включают org.junit.jupiter.api.Assumptions.
- assumeFalse()
- assumingThat()
- assumeTrue()
-
Кроме того, методы могут быть перегружены, а желаемые операции могут быть заданы в качестве параметров в лямбда-форме.
@Test
void testSomething() throws Exception{
Assumptions.assumingThat("foo".equals("bar"),() ->{
assertEquals(...);
})
}
Набор тестов
- Когда мы хотим вызывать и использовать различные тестовые классы из одного места, при использовании структуры, подобной приведенной ниже, с JUnit 4,
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
ExceptionTest.class,
TimeoutTest.class
})
public class JUnit4Example
{
}
- В JUnit 5 Suite заменен на SelectPackages и SelectClasses. Это полезно с точки зрения Единой ответственности. Также аннотация @RunWith заменена на @ExtendWith, а ее параметр изменен на JUnitPlatform.class.
import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.runner.RunWith;
@ExtendWith(JUnitPlatform.class)
@SelectPackages("com.howtodoinjava.junit5.examples")
public class JUnit5Example
{
}
Архитектура
- В JUnit 4 все было в одном jar-файле, в JUnit 5 все по-другому.
- JUnit 5 состоит из 3 подэлементов;
- Платформа JUnit : Определяет API TestEngine для разработки новых тестовых сред, работающих на платформе.
- JUnit Jupiter : Содержит аннотации JUnit и реализации TestEngine для запуска тестов, написанных с использованием этих аннотаций.
- JUnit Vintage : Позволяет выполнять тесты, написанные на JUnit 3 и JUnit 4, на платформе JUnit 5.
- JUnit 4 предназначен для Java5 или более поздней версии, а JUnit 5 — для Java8 или более поздней версии.
Интеграция с третьими сторонами
-
В JUnit 4 не было никакой поддержки стороннего программного обеспечения, и его пытались обеспечить с помощью Java Reflection.
-
JUnit 5 поддерживает работу любого фреймворка, использующего API TestEngine, с платформой JUnit, которую он содержит для этой цели.
Дополнительно
Параметризированные тесты
- Хотя в JUnit 4 Parameterised Test поставлялся с различными библиотеками, в JUnit 5 он стал полностью встроенным.
@ParameterizedTest
@ValueSource(strings = {"foo", "bar"})
@NullAndEmptySource
void myParameterizedTest(String arg){
underTest.performAction(arg);
}
Выполнение условного теста
- В JUnit 5 API ExecutionCondition позволяет условно включать и выключать тесты.
- @EnabledOnOs и @DisabledOnOs: Включает проверку только на указанных операционных системах.
- @EnabledOnJre и @DisabledOnJre: Указывает, должен ли тест быть включен или отключен для определенных версий Java.
- @EnabledIfSystemProperty: Включает тест на основе значения системного свойства JVM.
- @EnabledIf: Использует логику сценария для включения теста при выполнении заданных в сценарии условий.