Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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
 ...
Let's Talk About Junit 5
RoadMap Junit 5
Phase 0: Crowdfunding Campaign
Phase 1: Kickoff Meeting -> 22.10.2015
Phase 2: Th...
Let's Talk About Junit 5
Архитектура
JUnit 5 = Platform + Jupiter + Vintage
Platform
Vintage Jupiter
Старые
тесты
Новые
те...
Let's Talk About Junit 5
Нововведение: #1
Изменились имена аннотаций жизненного цикла
Junit 5Junit 5 Junit 4Junit 4
@Befor...
Let's Talk About Junit 5
Нововведение: #2
Теперь @Ignore -> @Disabled
Junit 5Junit 5 Junit 4Junit 4
@Test
@Disabled(“No Ru...
Let's Talk About Junit 5
Junit 5Junit 5 Junit 4Junit 4
Сколько отличий между Junit 5 vs Junit 4?
import org.junit.jupiter....
Let's Talk About Junit 5
Junit 5Junit 5 Junit 4Junit 4
import org.junit.Assert;
import org.junit.Test;
//Code
@Test
public...
Let's Talk About Junit 5
Нововведение: #4
Теперь @Category-> @Tag
Junit 5Junit 5 Junit 4Junit 4
@Tag("work hard")
@Test
vo...
Let's Talk About Junit 5
Нововведение: #5
Проверка групповых условий
Junit 5Junit 5 Junit 4Junit 4@Rule
public ErrorCollec...
Let's Talk About Junit 5
Результат выполнения
org.opentest4j.MultipleFailuresError: numbers (2 failures)
expected: <0> but...
@Test
void test(TestInfo tInfo) {
log.info(tInfo.getDisplayName());
}
Let's Talk About Junit 5
Нововведение: #5
Внедрение ...
Let's Talk About Junit 5
Нововведение: #6
Более детальная информация об исключении
Let's Talk About Junit 5
Нововведение: #7
@DisplayName("СББОЛ TK API - Отправка писем в банк")
public class BDDStyleTest {...
Let's Talk About Junit 5
Результат выполнения
Результаты теста с использованием
@Nested и @Display в IDEA
Let's Talk About Junit 5
Нововведение: #8
Обновленные параметризированные возможности
@RunWith(value =
Parameterized.class...
Let's Talk About Junit 5
Нововведение: #9
Повторяющие и динамические тесты
@DisplayName(“Test Method Name")
@RepeatedTest(...
Let's Talk About Junit 5
Нововведение: #10
Отдельные методы для работы с timeout
Junit 5Junit 5 Junit 4Junit 4
@Test(timeo...
Let's Talk About Junit 5
Модель расширений
“Prefer extension points over features”“Prefer extension points over features”
...
Let's Talk About Junit 5
Абстрактный пример
 Один интерфейс на каждый extension point
 Управление контекстом происходит ...
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
Задача
Мы хотим узнать, сколько каждый тест
занимает времени. Как это сделать?
Использовать интер...
Let's Talk About Junit 5
Реализация
public class PerfomanceBenchmark implements
BeforeEachCallback, AfterEachCallback {
@O...
Let's Talk About Junit 5
Применение через @ExtendWith
@ExtendWith(PerfomanceBenchmark.class)
public class JUnit5Test {
//Т...
Let's Talk About Junit 5
Применение через мета аннотацию
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(PerfomanceBenchma...
Требуется записать видео прохождения теста.
А еще хотелось бы знать время затраченное
на каждый тест. Как быть?
Let's Talk...
Let's Talk About Junit 5
Реализация
public class VideoCondition implements BeforeEachCallback,
AfterEachCallback {
@Overri...
Let's Talk About Junit 5
Использование
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(VideoCondition.class)
public @inter...
Хочу перезапустить тест, если они упадет по
определенному Exception. Что делать?
Let's Talk About Junit 5
Задача
Использов...
Let's Talk About Junit 5
Реализация
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@TestTemplate
@ExtendW...
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...
Let's Talk About Junit 5
Setup
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId...
Let's Talk About Junit 5
Top questions
1. Difference between @Before, @BeforeClass, @BeforeEach and @BeforeAll
2. Surefire...
Let's Talk About Junit 5
Вывод
 Использование Java 8;
 Много нового функционала;
 Один модуль, одна задача;
 Гибкое AP...
Let's Talk About Junit 5
Вопросы?
Артем Соковец
AVSokovets.SBT@sberbank.ru
github.com/artsok/Junit5-QADAY
goo.gl/zZebHt
gi...
Let's Talk About Junit 5
Спасибо за внимание!
Let's Talk About Junit 5
Upcoming SlideShare
Loading in …5
×

Let's Talk About Junit 5

967 views

Published on

Доклад Артема Соковца на конференции SQA Days-21
www.sqadays.com

Published in: Education
  • Be the first to comment

Let's Talk About Junit 5

  1. 1. Software quality assurance days 21 Международная конференция по вопросам качества ПО sqadays.com Москва. 26–27 мая 2017 Соковец Артем Сбербанк-Технологии, Санкт-Петербург, Россия
  2. 2. Let's Talk About Junit 5 О себе Артем Соковец Менеджер направления Research and Development AVSokovets.SBT@sberbank.ru
  3. 3. http://blog.takipi.com/we-analyzed-60678-libraries-on-github-here-are-the-top-100/
  4. 4. Let's Talk About Junit 5 Содержание  Roadmap  Архитектура  Обзор нововведений  Extension Points  TestNG vs Junit 5  Setup  Top User Questions  Итоги
  5. 5. 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
  6. 6. Let's Talk About Junit 5 Архитектура JUnit 5 = Platform + Jupiter + Vintage Platform Vintage Jupiter Старые тесты Новые тесты Third Party IDEs/Build Tools TestNG, Spock, Cucumber
  7. 7. 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 () {}
  8. 8. 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); }
  9. 9. 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); }
  10. 10. 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
  11. 11. 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 {}
  12. 12. 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)); }
  13. 13. 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> Вывод при ошибке:
  14. 14. @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
  15. 15. Let's Talk About Junit 5 Нововведение: #6 Более детальная информация об исключении
  16. 16. 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() { /*...*/ } } } Организуемые и легкочитаемые тесты
  17. 17. Let's Talk About Junit 5 Результат выполнения Результаты теста с использованием @Nested и @Display в IDEA
  18. 18. 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
  19. 19. 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))); }
  20. 20. 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)); }
  21. 21. Let's Talk About Junit 5 Модель расширений “Prefer extension points over features”“Prefer extension points over features” Основной принцип Junit 5 Extension Points
  22. 22. Let's Talk About Junit 5 Абстрактный пример  Один интерфейс на каждый extension point  Управление контекстом происходит через аргументы метода Использование несколько extension points в реализации public class OurPoint implements ExtensionPoints { // @Override method’s which we need to override! }
  23. 23. Let's Talk About Junit 5 Расширения Test Instance Post Processing Parameter Resolution Conditional Test Execution
  24. 24. Let's Talk About Junit 5 Применения Extension Points @ExtendWith(Clazz.class) Мета-аннотация
  25. 25. Let's Talk About Junit 5 Задача Мы хотим узнать, сколько каждый тест занимает времени. Как это сделать? Использовать интерфейсы Extension Point: BeforeEachCallback, AfterEachCallBack
  26. 26. 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 }
  27. 27. Let's Talk About Junit 5 Применение через @ExtendWith @ExtendWith(PerfomanceBenchmark.class) public class JUnit5Test { //Тесты  }
  28. 28. Let's Talk About Junit 5 Применение через мета аннотацию @Retention(RetentionPolicy.RUNTIME) @ExtendWith(PerfomanceBenchmark.class) public @interface PerfomanceBenchmarks {} Junit 5 рекурсивно проверяет аннотации у элемента @Test @PerfomanceBenchmarks void ourThirdTest() { assertTrue(true, "DEVDAY СБТ"); }
  29. 29. Требуется записать видео прохождения теста. А еще хотелось бы знать время затраченное на каждый тест. Как быть? Let's Talk About Junit 5 Задача Использовать интерфейсы Extension Point: BeforeEachCallback, AfterEachCallBack
  30. 30. 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 { //Остановить видеозапись } }
  31. 31. 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{}
  32. 32. Хочу перезапустить тест, если они упадет по определенному Exception. Что делать? Let's Talk About Junit 5 Задача Использовать интерфейсы Extension Point: TestTemplateInvocationContextProvider, AfterTestExecutionCallback TestTemplateInvocationContext
  33. 33. 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 {…}
  34. 34. Let's Talk About Junit 5 Реализация
  35. 35. Let's Talk About Junit 5 TestNG vs Junit 5 slides.com/sergeypirogov/testng-vs-junit-battle#/26
  36. 36. 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
  37. 37. 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
  38. 38. 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
  39. 39. Let's Talk About Junit 5 Вывод  Использование Java 8;  Много нового функционала;  Один модуль, одна задача;  Гибкое API для построения своего фреймворка.
  40. 40. 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
  41. 41. Let's Talk About Junit 5 Спасибо за внимание!

×