SlideShare a Scribd company logo
1 of 42
Software quality assurance days
21 Международная конференция
по вопросам качества ПО
sqadays.com
Москва. 26–27 мая 2017
Соковец Артем
Сбербанк-Технологии, Санкт-Петербург, Россия
Let's Talk About Junit 5
О себе
Артем Соковец
Менеджер направления Research and Development
AVSokovets.SBT@sberbank.ru
http://blog.takipi.com/we-analyzed-60678-libraries-on-github-here-are-the-top-100/
Let's Talk About Junit 5
Содержание
 Roadmap
 Архитектура
 Обзор нововведений
 Extension Points
 TestNG vs Junit 5
 Setup
 Top User Questions
 Итоги
Let's Talk About Junit 5
RoadMap Junit 5
Phase 0: Crowdfunding Campaign
Phase 1: Kickoff Meeting -> 22.10.2015
Phase 2: The Prototype -> 02.12.2015
Phase 3: Heading for an Alpha -> 01.02.2016
Phase 4: Working Toward a First Milestone -> 07.07.2016
Phase 5: Additional Milestones -> (M4) 01.04.2017
Phase 6: Release Candidates
Phase 7: GA Release
Q3 2017
Ответственные
Johannes Link и
Marc Philipp
Let's Talk About Junit 5
Архитектура
JUnit 5 = Platform + Jupiter + Vintage
Platform
Vintage Jupiter
Старые
тесты
Новые
тесты
Third Party
IDEs/Build
Tools
TestNG,
Spock,
Cucumber
Let's Talk About Junit 5
Нововведение: #1
Изменились имена аннотаций жизненного цикла
Junit 5Junit 5 Junit 4Junit 4
@BeforeAll
static void beforeAll(){}
@BeforeEach
void beforeEach() {}
@AfterEach
void afterEach() {}
@AfterAll
static void afterAll() {}
@BeforeClass
public static void beforeClass() {}
@Before
public void before() {}
@After
public void after() {}
@AfterClass
public static void afterClass () {}
Let's Talk About Junit 5
Нововведение: #2
Теперь @Ignore -> @Disabled
Junit 5Junit 5 Junit 4Junit 4
@Test
@Disabled(“No Run")
void test() {
assertTrue(false,"SQADAYS");
}
@Test
@Ignore(“No Run")
public void test() {
assertTrue("SQADAYS“, false);
}
Let's Talk About Junit 5
Junit 5Junit 5 Junit 4Junit 4
Сколько отличий между Junit 5 vs Junit 4?
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
//Code
@Test
void ourTest() {
Assertions
.assertTrue(true,
() -> "SQADays");
}
import org.junit.Assert;
import org.junit.Test;
//Code
@Test
public void ourTest() {
Assert
.assertTrue("SQADays",
true);
}
Let's Talk About Junit 5
Junit 5Junit 5 Junit 4Junit 4
import org.junit.Assert;
import org.junit.Test;
//Code
@Test
public void ourTest() {
Assert
.assertTrue("SQADays",
true);
}
Не требуется указывать модификатор видимости
public. Изменилось расположение сообщения.
Поменялось расположение @Test и assert’ов
Нововведение: #3
Let's Talk About Junit 5
Нововведение: #4
Теперь @Category-> @Tag
Junit 5Junit 5 Junit 4Junit 4
@Tag("work hard")
@Test
void test() {
//Code
}
@RunWith(Categories.class)
@IncludeCategory(UnitTests.class)
@SuiteClasses( {TestClass1.class})
public class CategoryTest {}
@Category(UnitTests.class)
@Test
public void test() {
//Code
}
@RunWith(JUnitPlatform.class)
@IncludeTags("work hard")
class TagsTest {}
Let's Talk About Junit 5
Нововведение: #5
Проверка групповых условий
Junit 5Junit 5 Junit 4Junit 4@Rule
public ErrorCollector er =
new ErrorCollector();
@Test
public void groupassert() {
int[] numbers = {0, 1, 2, 3,
4};
er.checkThat(numbers[0],
is(1));
er.checkThat(numbers[3],
is(3));
er.checkThat(numbers[4],
is(1));
}
@Test
void groupAssertions() {
int[] numbers = {0, 1, 2, 3, 4};
assertAll("numbers",
() ->
assertEquals(numbers[0], 1),
() ->
assertEquals(numbers[3], 3),
() ->
assertEquals(numbers[4], 1));
}
Let's Talk About Junit 5
Результат выполнения
org.opentest4j.MultipleFailuresError: numbers (2 failures)
expected: <0> but was: <1>
expected: <4> but was: <1>
org.opentest4j.MultipleFailuresError: numbers (2 failures)
expected: <0> but was: <1>
expected: <4> but was: <1>
Вывод при ошибке:
@Test
void test(TestInfo tInfo) {
log.info(tInfo.getDisplayName());
}
Let's Talk About Junit 5
Нововведение: #5
Внедрение параметров в тестовые методы и в
конструкторы тестового класса.
@Rule
public TestName testName
= new TestName();
@Test
public void test() {
log.info(
testName.getMethodName());
}
@Test
void test1(TestReporter tReport) {
tReport.publishEntry
("SQADAYS", “true 100%");
}
Junit 5Junit 5 Junit 4Junit 4
Let's Talk About Junit 5
Нововведение: #6
Более детальная информация об исключении
Let's Talk About Junit 5
Нововведение: #7
@DisplayName("СББОЛ TK API - Отправка писем в банк")
public class BDDStyleTest {
@Test
@DisplayName("Дано пользователь авторизовался в систему")
void login() { /*...*/ }
@Test
@DisplayName("Когда пользователь отправляет сообщение")
void sendMess() { /*...*/ }
@Nested
@DisplayName("Тогда система присылает ответ")
class AfterSending {
@Test
@DisplayName("идентификатор уникальный")
void checkTicket() { /*...*/ }
@Test
@DisplayName("идентификатор заполнен корректно")
void checkTicketField() { /*...*/ }
}
}
Организуемые и легкочитаемые тесты
Let's Talk About Junit 5
Результат выполнения
Результаты теста с использованием
@Nested и @Display в IDEA
Let's Talk About Junit 5
Нововведение: #8
Обновленные параметризированные возможности
@RunWith(value =
Parameterized.class)
public class HelloTest {
//Параметры и конструктор
@Parameterized.Parameters
public static Collection<Object[]>
data() {return asList(
new Object[][]{{1}});
}
@Test
public void compareTest() {
assertTrue(numberA > 0);}}
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void valueSource(int arg) {
assertTrue(arg > 0);
}
Junit 5Junit 5 Junit 4Junit 4
@ParameterizedTest
@MethodSource(names = "dProvider")
void methodSource(String arg) {
assertNotNull(arg);}
@ParameterizedTest
@CsvFileSource(resources =“.csv")
//Code
@ParameterizedTest
@ArgumentsSource(Provider.class)
//Code
Let's Talk About Junit 5
Нововведение: #9
Повторяющие и динамические тесты
@DisplayName(“Test Method Name")
@RepeatedTest(value = 5, name = "{currentRepetition} из
{totalRepetitions}")
void customDisplayName(TestInfo tInfo, RepetitionInfo rInfo) {
repetitionInfo.getCurrentRepetition()
repetitionInfo.getTotalRepetitions());
}
@DisplayName("Проверка отправки сообщений в mq очередь")
@TestFactory
Collection<DynamicTest> testDynamicTest() {
return Arrays.asList(
DynamicTest.dynamicTest("Тест №1",
() -> Assertions.assertTrue(true)),
DynamicTest.dynamicTest("Тест №2",
() -> Assertions.assertFalse(false)));
}
Let's Talk About Junit 5
Нововведение: #10
Отдельные методы для работы с timeout
Junit 5Junit 5 Junit 4Junit 4
@Test(timeout=1000)
public void testWithTimeout() {
//Code
}
@Test
void testWithTimeout() {
assertTimeout(ofSeconds(5),
() -> TimeUnit.SECONDS.sleep(10));
}
Let's Talk About Junit 5
Модель расширений
“Prefer extension points over features”“Prefer extension points over features”
Основной принцип Junit 5
Extension Points
Let's Talk About Junit 5
Абстрактный пример
 Один интерфейс на каждый extension point
 Управление контекстом происходит через аргументы
метода
Использование несколько extension points в реализации
public class OurPoint implements ExtensionPoints {
// @Override method’s which we need to override!
}
Let's Talk About Junit 5
Расширения
Test Instance Post Processing
Parameter Resolution
Conditional Test Execution
Let's Talk About Junit 5
Применения Extension Points
@ExtendWith(Clazz.class)
Мета-аннотация
Let's Talk About Junit 5
Задача
Мы хотим узнать, сколько каждый тест
занимает времени. Как это сделать?
Использовать интерфейсы Extension Point:
BeforeEachCallback, AfterEachCallBack
Let's Talk About Junit 5
Реализация
public class PerfomanceBenchmark implements
BeforeEachCallback, AfterEachCallback {
@Override
public void afterEach(TestExtensionContext con) throws
Exception {
//Code
}
@Override
public void beforeEach(TestExtensionContext con) throws
Exception {
//Code
}
Let's Talk About Junit 5
Применение через @ExtendWith
@ExtendWith(PerfomanceBenchmark.class)
public class JUnit5Test {
//Тесты 
}
Let's Talk About Junit 5
Применение через мета аннотацию
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(PerfomanceBenchmark.class)
public @interface PerfomanceBenchmarks {}
Junit 5 рекурсивно проверяет аннотации у элемента
@Test
@PerfomanceBenchmarks
void ourThirdTest() {
assertTrue(true, "DEVDAY СБТ");
}
Требуется записать видео прохождения теста.
А еще хотелось бы знать время затраченное
на каждый тест. Как быть?
Let's Talk About Junit 5
Задача
Использовать интерфейсы Extension Point:
BeforeEachCallback, AfterEachCallBack
Let's Talk About Junit 5
Реализация
public class VideoCondition implements BeforeEachCallback,
AfterEachCallback {
@Override
public void beforeEach(TestExtensionContext con) throws Exception {
//Получить значение параметра аннотации, начать видеозапись
}
@Override
public void afterEach(TestExtensionContext con) throws Exception {
//Остановить видеозапись
}
}
Let's Talk About Junit 5
Использование
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(VideoCondition.class)
public @interface Video {}
@VideoAndPerfomanceBenchmarks
void ourTest() {…}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Video
@PerfomanceBenchmarks
@Test
public @interface VideoAndPerfomanceBenchmarks{}
Хочу перезапустить тест, если они упадет по
определенному Exception. Что делать?
Let's Talk About Junit 5
Задача
Использовать интерфейсы Extension Point:
TestTemplateInvocationContextProvider,
AfterTestExecutionCallback
TestTemplateInvocationContext
Let's Talk About Junit 5
Реализация
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@TestTemplate
@ExtendWith(RepeatIfExceptionsCondition.class)
public @interface RepeatedIfExceptionsTest {…}
@Override
public boolean supports(ContainerExtensionContext context) {
return isAnnotated(context.getTestMethod(), RepeatedIfExceptionsTest.class);
}
@Override
public Stream<TestTemplateInvocationContext> provide(ContainerExtensionContext context) {…}
Spliterator<TestTemplateInvocationContext> spliterator =
spliteratorUnknownSize(new TestTemplateIterator(), Spliterator.NONNULL);
@RepeatedIfExceptionsTest(repeats = 5, exceptions = IOException.class
void reRunTest() {…}
@Override
public void afterTestExecution(TestExtensionContext context) throws Exception {…}
Let's Talk About Junit 5
Реализация
Let's Talk About Junit 5
TestNG vs Junit 5
slides.com/sergeypirogov/testng-vs-junit-battle#/26
Let's Talk About Junit 5
Setup
Maven -> use maven-surefire-plugin
Gradle -> Gradle plugin
Eclipse -> Eclipse Oxygen 4.7 M7 (Beta)
Intellij -> IDEA 2016.2
Console Launcher -> work
Let's Talk About Junit 5
Setup
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.0.0-M3</version>
<scope>compile</scope>
</dependency>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>${junit.platform.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
Maven
Let's Talk About Junit 5
Top questions
1. Difference between @Before, @BeforeClass, @BeforeEach and @BeforeAll
2. Surefire is not picking up Junit 5 tests
3. Как запускать тесты, когда IDE не поддерживает Junit 5
4. Пропал метод asertThat()
5. Интеграция с Allure 2.0/Allure
Let's Talk About Junit 5
Вывод
 Использование Java 8;
 Много нового функционала;
 Один модуль, одна задача;
 Гибкое API для построения своего
фреймворка.
Let's Talk About Junit 5
Вопросы?
Артем Соковец
AVSokovets.SBT@sberbank.ru
github.com/artsok/Junit5-QADAY
goo.gl/zZebHt
github.com/sbtqagithub.com/sbtqa
goo.gl/wf7Yxi
goo.gl/4CB6e1
Let's Talk About Junit 5
Спасибо за внимание!

More Related Content

Similar to Let's Talk About Junit 5

Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовMskDotNet Community
 
КГТУ Лекция 6: Обеспечение Качества Программного Обеспечения
КГТУ Лекция 6: Обеспечение Качества Программного Обеспечения КГТУ Лекция 6: Обеспечение Качества Программного Обеспечения
КГТУ Лекция 6: Обеспечение Качества Программного Обеспечения Iosif Itkin
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterAleksandr Tarasov
 
Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Dmitry Buzdin
 
Разработка и сопровождении авто-тестов (Selenium)
Разработка и сопровождении авто-тестов (Selenium)Разработка и сопровождении авто-тестов (Selenium)
Разработка и сопровождении авто-тестов (Selenium)Paul Stashevsky
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?COMAQA.BY
 
Управление компанией с использованием метода критического цепи (МКЦ)
Управление компанией с использованием метода критического цепи (МКЦ)Управление компанией с использованием метода критического цепи (МКЦ)
Управление компанией с использованием метода критического цепи (МКЦ)Евгений Пикулев
 
Victor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysVictor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysLiloSEA
 
Маргарита Сафарова - Аудит процессов тестирования при смене проектной команды
Маргарита Сафарова - Аудит процессов тестирования при смене проектной командыМаргарита Сафарова - Аудит процессов тестирования при смене проектной команды
Маргарита Сафарова - Аудит процессов тестирования при смене проектной командыSQALab
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...yaevents
 
Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...
Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...
Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...Mail.ru Group
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишковcorehard_by
 
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgIT61
 
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!SPB SQA Group
 
iPhone Unit Testing (Google tool Box)
iPhone Unit Testing (Google tool Box)iPhone Unit Testing (Google tool Box)
iPhone Unit Testing (Google tool Box)Yandex
 

Similar to Let's Talk About Junit 5 (20)

Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
 
КГТУ Лекция 6: Обеспечение Качества Программного Обеспечения
КГТУ Лекция 6: Обеспечение Качества Программного Обеспечения КГТУ Лекция 6: Обеспечение Качества Программного Обеспечения
КГТУ Лекция 6: Обеспечение Качества Программного Обеспечения
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot Starter
 
Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?
 
Разработка и сопровождении авто-тестов (Selenium)
Разработка и сопровождении авто-тестов (Selenium)Разработка и сопровождении авто-тестов (Selenium)
Разработка и сопровождении авто-тестов (Selenium)
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?
 
Управление компанией с использованием метода критического цепи (МКЦ)
Управление компанией с использованием метода критического цепи (МКЦ)Управление компанией с использованием метода критического цепи (МКЦ)
Управление компанией с использованием метода критического цепи (МКЦ)
 
Victor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysVictor Kuliamin.CSEDays
Victor Kuliamin.CSEDays
 
Маргарита Сафарова - Аудит процессов тестирования при смене проектной команды
Маргарита Сафарова - Аудит процессов тестирования при смене проектной командыМаргарита Сафарова - Аудит процессов тестирования при смене проектной команды
Маргарита Сафарова - Аудит процессов тестирования при смене проектной команды
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
 
10_tips_for_become_qa
10_tips_for_become_qa10_tips_for_become_qa
10_tips_for_become_qa
 
Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...
Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...
Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
 
10M tests per day
10M tests per day10M tests per day
10M tests per day
 
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
 
iPhone Unit Testing (Google tool Box)
iPhone Unit Testing (Google tool Box)iPhone Unit Testing (Google tool Box)
iPhone Unit Testing (Google tool Box)
 

More from SQALab

Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировкуSQALab
 
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаSQALab
 
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиSQALab
 
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияSQALab
 
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...SQALab
 
Continuous performance testing
Continuous performance testingContinuous performance testing
Continuous performance testingSQALab
 
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженSQALab
 
Команда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииSQALab
 
API. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовSQALab
 
Добиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовSQALab
 
Делаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsSQALab
 
Вредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеSQALab
 
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииSQALab
 
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеSQALab
 
Стили лидерства и тестирование
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестированиеSQALab
 
"Давайте не будем про качество"
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"SQALab
 
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовSQALab
 
Тестирование геолокационных систем
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных системSQALab
 
Лидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросSQALab
 
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...SQALab
 

More from SQALab (20)

Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировку
 
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщика
 
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
 
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
 
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
 
Continuous performance testing
Continuous performance testingContinuous performance testing
Continuous performance testing
 
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нужен
 
Команда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихии
 
API. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советов
 
Добиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестов
 
Делаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIs
 
Вредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджменте
 
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
 
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
 
Стили лидерства и тестирование
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестирование
 
"Давайте не будем про качество"
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"
 
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектов
 
Тестирование геолокационных систем
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных систем
 
Лидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопрос
 
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
 

Let's Talk About Junit 5

  • 1. Software quality assurance days 21 Международная конференция по вопросам качества ПО sqadays.com Москва. 26–27 мая 2017 Соковец Артем Сбербанк-Технологии, Санкт-Петербург, Россия
  • 2.
  • 3. Let's Talk About Junit 5 О себе Артем Соковец Менеджер направления Research and Development AVSokovets.SBT@sberbank.ru
  • 5. Let's Talk About Junit 5 Содержание  Roadmap  Архитектура  Обзор нововведений  Extension Points  TestNG vs Junit 5  Setup  Top User Questions  Итоги
  • 6. Let's Talk About Junit 5 RoadMap Junit 5 Phase 0: Crowdfunding Campaign Phase 1: Kickoff Meeting -> 22.10.2015 Phase 2: The Prototype -> 02.12.2015 Phase 3: Heading for an Alpha -> 01.02.2016 Phase 4: Working Toward a First Milestone -> 07.07.2016 Phase 5: Additional Milestones -> (M4) 01.04.2017 Phase 6: Release Candidates Phase 7: GA Release Q3 2017 Ответственные Johannes Link и Marc Philipp
  • 7. Let's Talk About Junit 5 Архитектура JUnit 5 = Platform + Jupiter + Vintage Platform Vintage Jupiter Старые тесты Новые тесты Third Party IDEs/Build Tools TestNG, Spock, Cucumber
  • 8. Let's Talk About Junit 5 Нововведение: #1 Изменились имена аннотаций жизненного цикла Junit 5Junit 5 Junit 4Junit 4 @BeforeAll static void beforeAll(){} @BeforeEach void beforeEach() {} @AfterEach void afterEach() {} @AfterAll static void afterAll() {} @BeforeClass public static void beforeClass() {} @Before public void before() {} @After public void after() {} @AfterClass public static void afterClass () {}
  • 9. Let's Talk About Junit 5 Нововведение: #2 Теперь @Ignore -> @Disabled Junit 5Junit 5 Junit 4Junit 4 @Test @Disabled(“No Run") void test() { assertTrue(false,"SQADAYS"); } @Test @Ignore(“No Run") public void test() { assertTrue("SQADAYS“, false); }
  • 10. Let's Talk About Junit 5 Junit 5Junit 5 Junit 4Junit 4 Сколько отличий между Junit 5 vs Junit 4? import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; //Code @Test void ourTest() { Assertions .assertTrue(true, () -> "SQADays"); } import org.junit.Assert; import org.junit.Test; //Code @Test public void ourTest() { Assert .assertTrue("SQADays", true); }
  • 11. Let's Talk About Junit 5 Junit 5Junit 5 Junit 4Junit 4 import org.junit.Assert; import org.junit.Test; //Code @Test public void ourTest() { Assert .assertTrue("SQADays", true); } Не требуется указывать модификатор видимости public. Изменилось расположение сообщения. Поменялось расположение @Test и assert’ов Нововведение: #3
  • 12. Let's Talk About Junit 5 Нововведение: #4 Теперь @Category-> @Tag Junit 5Junit 5 Junit 4Junit 4 @Tag("work hard") @Test void test() { //Code } @RunWith(Categories.class) @IncludeCategory(UnitTests.class) @SuiteClasses( {TestClass1.class}) public class CategoryTest {} @Category(UnitTests.class) @Test public void test() { //Code } @RunWith(JUnitPlatform.class) @IncludeTags("work hard") class TagsTest {}
  • 13. Let's Talk About Junit 5 Нововведение: #5 Проверка групповых условий Junit 5Junit 5 Junit 4Junit 4@Rule public ErrorCollector er = new ErrorCollector(); @Test public void groupassert() { int[] numbers = {0, 1, 2, 3, 4}; er.checkThat(numbers[0], is(1)); er.checkThat(numbers[3], is(3)); er.checkThat(numbers[4], is(1)); } @Test void groupAssertions() { int[] numbers = {0, 1, 2, 3, 4}; assertAll("numbers", () -> assertEquals(numbers[0], 1), () -> assertEquals(numbers[3], 3), () -> assertEquals(numbers[4], 1)); }
  • 14. Let's Talk About Junit 5 Результат выполнения org.opentest4j.MultipleFailuresError: numbers (2 failures) expected: <0> but was: <1> expected: <4> but was: <1> org.opentest4j.MultipleFailuresError: numbers (2 failures) expected: <0> but was: <1> expected: <4> but was: <1> Вывод при ошибке:
  • 15. @Test void test(TestInfo tInfo) { log.info(tInfo.getDisplayName()); } Let's Talk About Junit 5 Нововведение: #5 Внедрение параметров в тестовые методы и в конструкторы тестового класса. @Rule public TestName testName = new TestName(); @Test public void test() { log.info( testName.getMethodName()); } @Test void test1(TestReporter tReport) { tReport.publishEntry ("SQADAYS", “true 100%"); } Junit 5Junit 5 Junit 4Junit 4
  • 16. Let's Talk About Junit 5 Нововведение: #6 Более детальная информация об исключении
  • 17. Let's Talk About Junit 5 Нововведение: #7 @DisplayName("СББОЛ TK API - Отправка писем в банк") public class BDDStyleTest { @Test @DisplayName("Дано пользователь авторизовался в систему") void login() { /*...*/ } @Test @DisplayName("Когда пользователь отправляет сообщение") void sendMess() { /*...*/ } @Nested @DisplayName("Тогда система присылает ответ") class AfterSending { @Test @DisplayName("идентификатор уникальный") void checkTicket() { /*...*/ } @Test @DisplayName("идентификатор заполнен корректно") void checkTicketField() { /*...*/ } } } Организуемые и легкочитаемые тесты
  • 18. Let's Talk About Junit 5 Результат выполнения Результаты теста с использованием @Nested и @Display в IDEA
  • 19. Let's Talk About Junit 5 Нововведение: #8 Обновленные параметризированные возможности @RunWith(value = Parameterized.class) public class HelloTest { //Параметры и конструктор @Parameterized.Parameters public static Collection<Object[]> data() {return asList( new Object[][]{{1}}); } @Test public void compareTest() { assertTrue(numberA > 0);}} @ParameterizedTest @ValueSource(ints = {1, 2, 3}) void valueSource(int arg) { assertTrue(arg > 0); } Junit 5Junit 5 Junit 4Junit 4 @ParameterizedTest @MethodSource(names = "dProvider") void methodSource(String arg) { assertNotNull(arg);} @ParameterizedTest @CsvFileSource(resources =“.csv") //Code @ParameterizedTest @ArgumentsSource(Provider.class) //Code
  • 20. Let's Talk About Junit 5 Нововведение: #9 Повторяющие и динамические тесты @DisplayName(“Test Method Name") @RepeatedTest(value = 5, name = "{currentRepetition} из {totalRepetitions}") void customDisplayName(TestInfo tInfo, RepetitionInfo rInfo) { repetitionInfo.getCurrentRepetition() repetitionInfo.getTotalRepetitions()); } @DisplayName("Проверка отправки сообщений в mq очередь") @TestFactory Collection<DynamicTest> testDynamicTest() { return Arrays.asList( DynamicTest.dynamicTest("Тест №1", () -> Assertions.assertTrue(true)), DynamicTest.dynamicTest("Тест №2", () -> Assertions.assertFalse(false))); }
  • 21. Let's Talk About Junit 5 Нововведение: #10 Отдельные методы для работы с timeout Junit 5Junit 5 Junit 4Junit 4 @Test(timeout=1000) public void testWithTimeout() { //Code } @Test void testWithTimeout() { assertTimeout(ofSeconds(5), () -> TimeUnit.SECONDS.sleep(10)); }
  • 22. Let's Talk About Junit 5 Модель расширений “Prefer extension points over features”“Prefer extension points over features” Основной принцип Junit 5 Extension Points
  • 23. Let's Talk About Junit 5 Абстрактный пример  Один интерфейс на каждый extension point  Управление контекстом происходит через аргументы метода Использование несколько extension points в реализации public class OurPoint implements ExtensionPoints { // @Override method’s which we need to override! }
  • 24. Let's Talk About Junit 5 Расширения Test Instance Post Processing Parameter Resolution Conditional Test Execution
  • 25. Let's Talk About Junit 5 Применения Extension Points @ExtendWith(Clazz.class) Мета-аннотация
  • 26. Let's Talk About Junit 5 Задача Мы хотим узнать, сколько каждый тест занимает времени. Как это сделать? Использовать интерфейсы Extension Point: BeforeEachCallback, AfterEachCallBack
  • 27. Let's Talk About Junit 5 Реализация public class PerfomanceBenchmark implements BeforeEachCallback, AfterEachCallback { @Override public void afterEach(TestExtensionContext con) throws Exception { //Code } @Override public void beforeEach(TestExtensionContext con) throws Exception { //Code }
  • 28. Let's Talk About Junit 5 Применение через @ExtendWith @ExtendWith(PerfomanceBenchmark.class) public class JUnit5Test { //Тесты  }
  • 29. Let's Talk About Junit 5 Применение через мета аннотацию @Retention(RetentionPolicy.RUNTIME) @ExtendWith(PerfomanceBenchmark.class) public @interface PerfomanceBenchmarks {} Junit 5 рекурсивно проверяет аннотации у элемента @Test @PerfomanceBenchmarks void ourThirdTest() { assertTrue(true, "DEVDAY СБТ"); }
  • 30. Требуется записать видео прохождения теста. А еще хотелось бы знать время затраченное на каждый тест. Как быть? Let's Talk About Junit 5 Задача Использовать интерфейсы Extension Point: BeforeEachCallback, AfterEachCallBack
  • 31. Let's Talk About Junit 5 Реализация public class VideoCondition implements BeforeEachCallback, AfterEachCallback { @Override public void beforeEach(TestExtensionContext con) throws Exception { //Получить значение параметра аннотации, начать видеозапись } @Override public void afterEach(TestExtensionContext con) throws Exception { //Остановить видеозапись } }
  • 32. Let's Talk About Junit 5 Использование @Retention(RetentionPolicy.RUNTIME) @ExtendWith(VideoCondition.class) public @interface Video {} @VideoAndPerfomanceBenchmarks void ourTest() {…} @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Video @PerfomanceBenchmarks @Test public @interface VideoAndPerfomanceBenchmarks{}
  • 33. Хочу перезапустить тест, если они упадет по определенному Exception. Что делать? Let's Talk About Junit 5 Задача Использовать интерфейсы Extension Point: TestTemplateInvocationContextProvider, AfterTestExecutionCallback TestTemplateInvocationContext
  • 34. Let's Talk About Junit 5 Реализация @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @TestTemplate @ExtendWith(RepeatIfExceptionsCondition.class) public @interface RepeatedIfExceptionsTest {…} @Override public boolean supports(ContainerExtensionContext context) { return isAnnotated(context.getTestMethod(), RepeatedIfExceptionsTest.class); } @Override public Stream<TestTemplateInvocationContext> provide(ContainerExtensionContext context) {…} Spliterator<TestTemplateInvocationContext> spliterator = spliteratorUnknownSize(new TestTemplateIterator(), Spliterator.NONNULL); @RepeatedIfExceptionsTest(repeats = 5, exceptions = IOException.class void reRunTest() {…} @Override public void afterTestExecution(TestExtensionContext context) throws Exception {…}
  • 35. Let's Talk About Junit 5 Реализация
  • 36. Let's Talk About Junit 5 TestNG vs Junit 5 slides.com/sergeypirogov/testng-vs-junit-battle#/26
  • 37. Let's Talk About Junit 5 Setup Maven -> use maven-surefire-plugin Gradle -> Gradle plugin Eclipse -> Eclipse Oxygen 4.7 M7 (Beta) Intellij -> IDEA 2016.2 Console Launcher -> work
  • 38. Let's Talk About Junit 5 Setup <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.0.0-M3</version> <scope>compile</scope> </dependency> <build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.19</version> <dependencies> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-surefire-provider</artifactId> <version>${junit.platform.version}</version> </dependency> </dependencies> </plugin> </plugins> </build> Maven
  • 39. Let's Talk About Junit 5 Top questions 1. Difference between @Before, @BeforeClass, @BeforeEach and @BeforeAll 2. Surefire is not picking up Junit 5 tests 3. Как запускать тесты, когда IDE не поддерживает Junit 5 4. Пропал метод asertThat() 5. Интеграция с Allure 2.0/Allure
  • 40. Let's Talk About Junit 5 Вывод  Использование Java 8;  Много нового функционала;  Один модуль, одна задача;  Гибкое API для построения своего фреймворка.
  • 41. Let's Talk About Junit 5 Вопросы? Артем Соковец AVSokovets.SBT@sberbank.ru github.com/artsok/Junit5-QADAY goo.gl/zZebHt github.com/sbtqagithub.com/sbtqa goo.gl/wf7Yxi goo.gl/4CB6e1
  • 42. Let's Talk About Junit 5 Спасибо за внимание!

Editor's Notes

  1. Проблемы: Плагин в Idea не понимает файлы с названием $2_FeaturesTest, FeaturesTest1, а в таких файлов могут быть тесты. Плагин в Idea на версии Milistone 3.0, выкидывает ошибку, если тестовый метод называется test
  2. Все что я буду говорить и рассказывать основано на моем опыте и на моей точке зрения. За весь код, который будет продемонстрирован сегодня, ответственности не несу)
  3. На данном слайде представлена статистика использование junit на проектах github и мы видим, что Junit занимает лидирующую позицию. Сергей Пирогов, так же приводил статистику сравнения, у него выйграл TestNG, но это был какой-то зарубежный сайт. Кто использует этот фреймворк? Поднимите руки. А кто пользуется TestNG? – Вставить в речь!
  4. Рассказываю про roadmap Junit 5; Про этапы, которые были и будут; Рассказать, что Marc Philip будет на гейзенбаге и можно послушать его. Будет демонстрировать LiveCoding. Пользователи собрали денег. Нужны были крутые вищи Евро был под 70 руб за одно еуро)
  5. К самой сладки вещи перейти. Новая архитектура представляет из себя модульность. Сейчас у нас не большой толстый Jar-ник, который был в предыдущей версии 4, а от отдельные модули отвечающие за свою работу. Jupiter – с помощью данного модуля пишем тесты. Vintage – Запуск тестов версии 5, в версии 4 с помощью @RunWith. Легкая миграция тестов от версии 4 к 5 версии. Platroftm – Служит для запуска и выполнения тестов. Третьи лица, также могут вносить свои реализации тестового движка (через имплементацию junit-platform-engine и регистрацию их движков). Почему назвали Jupiter: Потому-что пятая планета от солнца. Почем назвали Vintage: Чтобы обозначить Legacy. Теперь можно к разработчикам ходить и говорить “Что это за винтажный код”. Слова к данному слайду: JUnit 5 by Marc Philipp - YouTube [720p] (Минута 26:39)
  6. Самая кил фича, которая всех убила – это изминение имен анноатций жизненого цикла теста.
  7. Дальше еще лучше! Теперь чтобы отключить тест мы используем, другую аннотацию.
  8. Кто ответит сколько отличий присутствует между Junit 4 vs Junit 5 тот получит приз? 1) Было:Asserts стало Assertions.assertTrue(); 2) Рассказать, что переехали пакеты! 3) Появилась возможность использовать лямбда выражения; Ленивая инициализация сообщения (т.е подгружаем, когда обращаемся). Принимает Supplier 4) Больше не надо модификатора доступа public – бережем наши пальчики от нажатия на клавиши 
  9. Правильно, Изменилось местоположение аннотации @Test Класс Assert изменен на Assertions и поменялось так же его расположение Не требуется модификатора доступа public Изменены расположение параметров в методе AssertTrue Появилось лямбда выражение 1) Было:Asserts стало Assertions.assertTrue(); 2) Рассказать, что переехали пакеты! 3) Появилась возможность использовать лямбда выражения; Ленивая инициализация сообщения (т.е подгружаем, когда обращаемся). Принимает Supplier 4) Больше не надо модификатора доступа public – бережем наши пальчики от нажатия на клавиши 
  10. В Junit 4, чтобы реализовать групповые проверки (т.е делаем ассерт и если проверка не прошла то проверяем дальше, то необходимо было использовать правило ErrorCollector). Теперь в Junit 5, больше нету правил – их убрали. Для того чтобы сделать групповую проверку используем метод assertAll, которые принимает варарг проверок.
  11. Dependency Injection for Constructors and Methods 1) The TestInfo can then be used to retrieve information about the current test such as the test’s display name, the test class, the test method, or associated tags 2) The TestReporter can be used to publish additional data about the current test run. The data can be consumed through TestExecutionListener.reportingEntryPublished() and thus be viewed by IDEs or included in reports. 3) ParameterResolver defines the API for Extensions that wish to dynamically resolve parameters at runtime.If a constructor for a test class or a @Test, @BeforeEach, @AfterEach, @BeforeAll, or @AfterAll method accepts a parameter, the parameter must be resolved at runtime by a ParameterResolver. Implementations must provide a no-args constructor.
  12. Чтобы запускать параметрезированные тесты в 4-ой версии, нам необходимо было указать наш раннер класс (Parameterized.класс), добавить конструктор и дата провайдер с аннотацией @Parameterized.Parameters, который генерил наши данные для тестов. Минус в том, что мы не смогли комбинировать раннеры в месте. В 5-ой версии, механизм работы с параметризованными тестами был доработано. Теперь поддержка параметризованных тестов допускается с помощью аннотаций на методы. Мы должны явно указать что это параметризованный тест и указать конкретный источник по генерации данных. В текущей версии допускается, следующие типы: @ValueSource, @EnumSource, @MethodSource (Два провайдера переберут все значение в каждом провайдере). Дата провайдеры по генерации тестовых данных должны быть static.
  13. Чтобы запускать параметрезированные тесты в 4-ой версии, нам необходимо было указать наш раннер класс (Parameterized.класс), добавить конструктор и дата провайдер с аннотацией @Parameterized.Parameters, который генерил наши данные для тестов. Минус в том, что мы не смогли комбинировать раннеры в месте. В 5-ой версии, механизм работы с параметризованными тестами был доработано. Теперь поддержка параметризованных тестов допускается с помощью аннотаций на методы. Мы должны явно указать что это параметризованный тест и указать конкретный источник по генерации данных. В текущей версии допускается, следующие типы: @ValueSource, @EnumSource, @MethodSource (Два провайдера переберут все значение в каждом провайдере). Дата провайдеры по генерации тестовых данных должны быть static.
  14. Conditional Test Execution = ContainerExecutionCondition and TestExecutionCondition Test Instance Post Processing = Внедрение зависимостей тестовый инстанс, вовлекая различные кастомные методы в тестовый инстанс
  15. Наследуем интерфейсы: TestTemplateInvocationContextProvider и TestTemplateInvocationContextProvider
  16. Но как мы знаем что интерфейс: TestTemplateInvocationContext предоставляем метод getDisplayName () для работы с именем теста, то мы можем модифицировать имена.
  17. От каких болей Junit избавляет. Рассказать почему Juinit порвет testnG - интерактив
  18. Цель сделать наши тесты понятными с минимальным количеством кода
  19. Ассерты остались такие же, кроме того что изминилась расположение сообщений. assertThat в Junit 5 больше нет, но если необходимо то можно его подключить из библиотеки org.hamcrest Добавить еще ссылки Дамы и господа, спасибо за внимание. Всем желаю успехов в использовании Junit 5. На этом все. Готов услышать ваши вопросы.