Junit 4, знаменитая рамка тестирования Java Unit, вышла в течение долгого времени. В то время я обнаружил, что Junit 5 был в бета -версии, поэтому я собирался написать статью, чтобы представить 5 Junit 5. Однако, потому что это все еще бета -версия, некоторые части не идеальны, и я немного ленив и не пишу их хорошо. Я вдруг вспомнил этот инцидент в эти дни. Когда я проверил его на официальном сайте, я обнаружил, что 10 сентября официальная версия Junit 5 наконец вышла! Затем я снова написал статью и представил вам последнюю среду Junit Framework.
Структура структуры
По сравнению с JUNIT 4 структура JUNIT 5 очень ясна и обеспечивает хорошую поддержку для расширенных функций, таких как пользовательские плагины, выполнение теста IDE и т. Д. Это можно увидеть из структуры проекта.
Юнит Платформа
Название пакета этой группы - org.junit.platform. Как вы можете видеть из имени, основная функция этой группы состоит в том, чтобы служить основной платформой для структуры тестирования. Модули в этом пакете включают в себя основные API, двигатели выполнения и исполнители, базовые функции выполнения командной строки, интерфейсы командной строки, плагины Maven и Gradle Test и другие основные функции.
Юнит Юпитер
Юпитер - это кодовое имя JUNIT 5. Модули в этом пакете содержат основные функции JUNIT 5. Если мы хотим использовать JUNIT 5, мы должны включить этот набор модулей.
Junit Vintage
Vintage - это кодовое имя для старой версии Junit. Модули в этом пакете позволяют нам провести тесты старого Junit 3 и 4 на новой платформе JUNIT.
Библиотека класса импорта
В то время как Junit 5 все еще находится на бета -фазе, есть примеры интеграции Junit 5 в Maven and Gradle в официальную документацию. Но в официальной версии содержимое этой части исчезло, оставив только две ссылки на образце проекта, давайте обратимся к ней (копировать и вставить).
Используя Maven
Junit5-Maven-Consumer является официальным примером Maven. Первоначально я собирался опубликовать соответствующую конфигурацию POM здесь, но когда я увидел, что конфигурация Maven была слишком длинной, я бы лучше забыл об этом. Если у вас есть какие -либо требования, пожалуйста, проверьте конфигурацию POM этого проекта самостоятельно.
Использование Gradle
Если вы используете Gradle, то эта проблема намного проще. Существуют также подробные описания в проекте выборки Junit5-Gradle-Consumer.
Прежде всего, Gradle не поддерживает Junit 5 по умолчанию, поэтому плагин Junit Platform Gradle должен быть включен для его поддержки.
BuildSSCORSIORS {Repositories {mavencentral ()} Depertive {classPath 'org.junit.platform: junit-platform-gradle-plugin: 1.0.0'}} Применить плагин: 'org.junit.platform.gradle.plugin'Тогда есть конфигурация этого плагина Gradle. По умолчанию будут выполнены все двигатели и теги. Если вы хотите выбирать, чтобы выполнить тесты только для определенных двигателей и тегов, вы можете расстроить следующее и изменить их в соответствии с вашими собственными потребностями. Конечно, если у вас нет этих расширенных требований, вы можете удалить эту часть.
junitplatform {// platterversion '1.0.0' filters {ingines {// include 'junit-jupiter', 'junit-vintage' // exklide 'custom-engine'} теги {// include 'Fast' Exculid file ('build/test-results/junit-platform') // Это по умолчанию // logmanager 'org.apache.logging.log4j.jul.logmanager'}Если вам нужно только запустить тесты Junit 5, просто импортируйте следующие две зависимости. Зависимости платформы JUNIT автоматически импортируются.
Зависимости {testcompile ("org.junit.jupiter: junit-jupiter-api: 5.0.0") testruntime ("org.junit.jupiter: junit-jupiter-engine: 5.0.0")}Если вы хотите запустить старые тесты Junit 3 и 4 под новой платформой, вам необходимо импортировать следующие зависимости.
Зависимости {testCompile ("Junit: Junit: 4.12") testruntime ("org.junit.vintage: junit-vintage-engine: 4.12.0")}Напишите тесты
Junit 4 Тест
Если вся предыдущая конфигурация завершена, вы можете начать писать тесты сейчас. Во -первых, давайте рассмотрим старый тест Junit 4.
открытый класс junit4test {@beforeclass public static void init () {System.out.println ("до класса");}@afterclass public static void clean () {system.out.println ("после класса");}@перед публичным void перед () {system.out.println («До»); {System.out.println ("after");}@test public void test1 () {system.out.println ("test 1");}@test public void test2 () {System.out.println ("test 2");}}Используйте тест Gradle и другие команды, чтобы выполнить этот тест. Результат аналогичен этому.
Перед классом класса 1test 2after Class
Тест 5 JUNIT
Давайте посмотрим, как написать эквивалентный тест Junit 5. Наиболее очевидное изменение можно увидеть: во -первых, несколько аннотаций были переименованы в более известные имена; Другим моментом является то, что метод испытаний не должен быть публичным методом, поэтому мы можем ввести клавиатуру несколько раз меньше.
открытый класс junit5test {@beforeall static void beafurell () {system.out.println ("перед всеми");}@afterlall static void afterall () {system.out.println ("Ведь");}@переде -void void перед () {system.out.println ("перед"); {System.out.println ("After");}@test void test1 () {System.out.println ("test 1");}@test void test2 () {System.out.println ("test 2");}}Напишите утверждения
Чтобы убедиться, что тестовые примеры правильны, нам нужно написать некоторые утверждения. Junit 5 поставляется со многими утверждениями, которые могут помочь нам написать тестовые примеры. Кроме того, эти утверждения поставляются с перегруженными версиями, которые могут принять выражения Lambda, которые очень подходят для использования Java 8. Конечно, я лично думаю, что это удобнее утверждать.
импорт static org.junit.assert.asserttrue; импорт static org.junit.jupiter.api.assertions.*; Assertequals (10, 10); asserttrue (true); Assertequals (100, 100, «два равных числа»); assertall ("number", () -> assertequals ("name", "name"), () -> assertequals (500, 500)); AssertTrows (InvalidParameterException.class, () -> {бросить новый InvalidParameterException ();}); int result = assertTimeout (duration.OfSeconds (5), () -> {int i = 0, j = 0; while (i <= 100) {for (; j <= 100000; j ++) j ++; i ++;} return i;}); Assertequals (100, результат); }}Инъекция зависимости
Теперь как конструктор, так и методы испытаний тестового класса могут принимать параметры. Интерфейс ParameterResolver определяет, как вводить параметры во время выполнения. Несколько встроенных позволяют нам получить информацию о времени выполнения тестового примера.
Во -первых, это TestinFoparameterresolver. Если в методе есть экземпляр Type TestInfo, структура JUNIT 5 автоматически вводит экземпляр. Несколько методов этого экземпляра могут позволить нам получить имя, отображение имени, метку и другую информацию о тестовом классе и методе испытаний.
public class DevidencyInctionDemo {@Test @DisplayName ("Инъекция зависимости") @Tag ("test") void testDisplayName (testinfo testinfo) {assertequals («Инъекция зависимости», testinfo.getDisplayName ()); assertequals (collections.singleton ("test"), testinfo.gettags ()); }}Существуют также встроенные анализаторы параметров, такие как RepetitionInfoParameterResolver, который будет представлен позже.
Общие аннотации
отображаемое имя
Мы можем добавить пользовательские имена в тестирование классов и методов испытаний, которые отображаются тестовым бегуном и отчетами о тестировании. Имя отображения не отображается как имя переменной. Это может быть длинная строка, содержащая пространства, или даже эмодзи эмодзи.
@Displayname («Тестовый класс может указать имя отображения») открытый класс DisplayNamedemo {@Test @DisplayName («Метод тестирования также может указать имя отображения») void testWithLongDisplayName () {} @Test @DisplayName («Имя дисплея также может содержать emoticons ��� �� �� �� �� �� �� �� �� �� ��� �� �� �� �� �� �� �� �� �� � �� �� �� �� �� �� �� �Отключить тестирование
Аннотация @disabled может использоваться в тестовых классах или методах испытаний, а соответствующий тест может быть отключен.
@Disabledpublic class disabledtestdemo {@test // @disabled void testdisabled () {}}Повторите тест
Если вам нужно пробежать метод тестирования несколько раз, используйте аннотацию @RepeatedTest.
открытый класс DeportEdTestDemo {@repeatedTest (10) void testRepeated10times () {}}Вы также можете внедрить повторение экземпляра для проверки текущего количества повторений и общего количества повторений.
открытый класс RepeatedTestDemo {@beforeeach void offeeach (repetitionInfo info) {System.out.printf (« %d - %d/n», info.getCurrentRepetition (), info.getTotalRepetitions ());}@reteedTest (10) void testRepeated10times () {}}@reteedTest (10) void -testRepeated10times () {}}}Поставляется с тегами
Когда я представил конфигурацию Gradle, я сказал, что вы можете фильтровать определенные этикетки в конфигурации. Также очень просто дать теги в коде, просто используйте аннотацию @TAG.
("TaggedTest") public Class tagdemo {@Test @Tag ("TaggedTest1") void testWitHtag1 () {} @Test @Tag ("TaggedTest2") void testWithTag2 () {}}Вложенные тесты
Иногда могут потребоваться вложенные тесты, чтобы указать взаимосвязь включения между определенными тестами. Вложенные тесты используют @nested Annotation.
@Displayname ("Внешний тест") открытый класс nesteddemo {@test void testouter () {} @nestest @displayname ("Inner Test") Class InnertestDemo {@Test void testinner () {}}}}}}}}}}}}}}}}Следует отметить, что только статические внутренние классы могут использовать вложенные аннотации. Кроме того, поскольку Java не позволяет внутренним классам иметь статические методы, у нее не может быть аннотации @beforeall и @afterall. Если вы хотите прорваться через это ограничение, вам нужно добавить аннотацию @TestInstance (LifeCycle.per_class) в вложенный внутренний класс. Для получения подробной информации, пожалуйста, обратитесь к жизненному циклу экземпляра тестового экземпляра.
IDE поддержка
Хотя 5 Junit 5 вышел. Тем не менее, поддержка различных инструментов не поддержала. В настоящее время только Intellij Idea и Eclipse 4.7 (кислород) добавили поддержку 5 Junit 5. Поэтому, если вы находитесь в официальной ситуации, более безопасно использовать JUNIT 4.
Часто задаваемые вопросы
Различать различные версии @Test Annotation
Так же, как я писал эту статью, я столкнулся с проблемой с моим тестовым примером. Тест не может быть прошел, и отображается сообщение об ошибке ниже.
Неудачи (1): junit vintage: yitian.study.test.assertionDemo: инициализация иррирор класса.
Студенты с хорошим английским языком должны быть в состоянии распознать это. В этом сообщении об ошибке говорится, что метод тестирования должен быть общедоступным. Но, как упоминалось ранее, Junit 5 отменил это ограничение, так почему же эта ошибка все еще происходит? Я внимательно посмотрел и нашел ошибку. Может быть, это потому, что в прошлом много использовался Junit 4, поэтому IDE по умолчанию по умолчанию в аннотации @Test, которая автоматически завершена.
Импорт org.junit.test;
Этот пакет является аннотацией @Test под Junit 4. Если мы хотим использовать JUNIT 5, нам нужна следующая аннотация @Test.
Импорт org.junit.jupiter.api.test;
После его изменения, запустите тест снова, и действительно не было никаких проблем. Конечно, ради обучения и использования, я также ссылаюсь на пакет JUNIT 4, поэтому этот конфликт происходит. Если у вас нет особых потребностей, рекомендуется импортировать только пакеты Junit 5 JAR, чтобы предотвратить путаницу. Конечно, импортировать их все в порядке, но вы должны быть осторожны, чтобы различить их и не писать аннотации Junit 4 до 5 -го теста Junit 5. Наконец, я прикреплю свои тестовые примеры. Те, кто заинтересован, могут посмотреть.
Суммировать
Выше приведено все содержание этой статьи о контенте, связанном с JUNIT5, и я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!