Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
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
Prochain SlideShare
Chargement dans…5
×

Let's Talk About Junit 5

1 139 vues

Publié le

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

Publié dans : Formation
  • Soyez le premier à commenter

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 Спасибо за внимание!

×