Какая польза от аннотации @TestInstance в JUnit 5? - PullRequest
0 голосов
/ 28 сентября 2018

Не могли бы вы дать простое объяснение аннотации @TestInstance и как она может быть полезна в JUnit 5?

Я думаю, что мы можем достичь того же эффекта, вероятно, сделав наши поля статичными.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Эта аннотация была введена для уменьшения количества объектов, создаваемых при выполнении ваших модульных тестов.

Добавление @TestInstance(TestInstance.Lifecycle.PER_CLASS) в ваш тестовый класс позволит избежать создания нового экземпляра вашего класса для каждого теста вучебный класс.Это особенно полезно, когда у вас много тестов в одном и том же классе тестов, а создание экземпляров этого класса стоит дорого.

Эту аннотацию следует использовать с осторожностью.Все юнит-тесты должны быть изолированными и независимыми друг от друга.Если один из тестов изменяет состояние тестового класса, вам не следует использовать эту функцию.

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

0 голосов
/ 28 сентября 2018

@TestInstance используется для настройки жизненного цикла тестовых экземпляров для аннотированного класса тестирования или интерфейса тестирования:

  • PER_CLASS: Новый экземпляр теста будет создан один раз для каждого класса теста.
  • PER_METHOD: Новый экземпляр теста будет создан для каждого метода теста, метода фабрики тестов илиметод тестового шаблона.Этот режим аналогичен поведению, обнаруженному в версиях JUnit с 1 по 4.

Если @TestInstance явно не объявлено в тестовом классе или в тестовом интерфейсе, реализованномВ тестовом классе для режима жизненного цикла по умолчанию будет неявно установлено значение PER_METHOD.


При установке режима жизненного цикла экземпляра теста на PER_CLASS включаются следующие функции:

  • Состояние экземпляра общего теста между методами теста в данном классе теста, а также между нестатическими методами @BeforeAll и @AfterAll в классе теста.
  • Объявление *Методы 1039 * и @AfterAll в @Nested тестовых классах.
  • Объявление @BeforeAll и @AfterAll в методах интерфейса по умолчанию.
  • Упрощенное объявление @BeforeAll и @AfterAllметоды в тестовых классах, реализованные на языке программирования Kotlin.

Дополнительные сведения см. в документации жизненного цикла экземпляра теста .

0 голосов
/ 28 сентября 2018

Я думаю, документы дают полезную сводку:

Если вы предпочитаете, чтобы JUnit Jupiter выполнял все методы теста в одном и том же экземпляре теста, просто аннотируйте свой класс теста с помощью@TestInstance (Lifecycle.PER_CLASS).При использовании этого режима новый экземпляр теста будет создаваться один раз для каждого класса теста.Таким образом, если ваши тестовые методы основаны на состоянии, хранящемся в переменных экземпляра, вам может потребоваться сбросить это состояние в методах @BeforeEach или @AfterEach.

Режим «на класс» имеет некоторые дополнительные преимущества по сравнению с настройками по умолчанию ».для каждого метода ».В частности, в режиме «для каждого класса» становится возможным объявить @BeforeAll и @AfterAll для нестатических методов, а также для методов интерфейса по умолчанию.Следовательно, режим «для каждого класса» также позволяет использовать методы @BeforeAll и @AfterAll в классах @Nested test.

Но вы, вероятно, уже это прочитали, и вы правы, считая, чтосоздание статического поля будет иметь тот же эффект, что и объявление поля в качестве переменной экземпляра и использование @TestInstance(Lifecycle.PER_CLASS).

Итак, возможно, ответ на вопрос «как это может быть полезно в JUnit 5» заключается в том, чтоa @TestInstance ...

  • Явно о ваших намерениях.Можно предположить, что использование статического ключевого слова было случайным, тогда как использование @TestInstance менее вероятно, будет случайным или результатом хотя бы копирования-n-paste.
  • Делегирует ответственность за управление областью действия и жизненным циклом иприведите себя в порядок вместо того, чтобы помнить, чтобы управлять этим самостоятельно.
...