Я унаследовал множество тестов Junit, но эти тесты (помимо большинства неработающих) представляют собой смесь фактических модульных тестов и интеграционных тестов (требующих внешних систем, баз данных и т. Д.).
Поэтому я пытаюсь придумать способ фактически разделить их, чтобы я мог быстро и красиво запустить модульный тест, а после этого - интеграционные тесты.
Возможны следующие варианты ..
Разбейте их в отдельные каталоги.
Перейдите к Junit4 (из v3) и аннотируйте классы, чтобы разделить их.
Используйте соглашение об именах файлов, чтобы определить класс, например AdapterATest и AdapterAIntergrationTest.
3 имеет проблему, заключающуюся в том, что Eclipse имеет возможность «Запускать все тесты в выбранном проекте / пакете или папке». Так что было бы очень сложно просто запустить интеграционные тесты.
2: есть риск, что разработчики начнут писать интеграционные тесты в классах модульных тестов, и это станет беспорядочным.
1: Кажется, лучшее решение, но моя интуиция подсказывает, что должно быть лучшее решение.
Итак, вот мой вопрос: как разделить интеграционные тесты и правильные модульные тесты?
источник
Ответы:
В настоящее время я использую отдельные каталоги из-за организационной политики (и наследия Junit 3), но я сам собираюсь перейти на аннотации, теперь я использую Junit 4.
Я бы не стал особо беспокоиться о том, что разработчики помещают интеграционные тесты в ваши классы модульного тестирования - при необходимости добавьте правило в стандарты кодирования.
Мне интересно знать, какие еще могут быть решения, кроме аннотаций или физического разделения классов.
источник
Вы можете легко разделить их с помощью категорий JUnit и Maven.
Это очень и очень кратко показано ниже путем разделения модульного и интеграционного тестов.
Определить интерфейс маркера
Первым шагом в группировке теста по категориям является создание интерфейса маркера.Этот интерфейс будет использоваться для пометки всех тестов, которые вы хотите запустить как интеграционные.
Отметьте свои тестовые классы
Добавьте аннотацию категории в начало вашего тестового класса. Он берет имя вашего нового интерфейса.
Настроить модульные тесты Maven
Прелесть этого решения в том, что в части модульного тестирования ничего не меняется.Мы просто добавляем некоторую конфигурацию в плагин maven surefire, чтобы он игнорировал любые интеграционные тесты.
Когда вы выполняете mvn clean test, запускаются только немаркированные модульные тесты.
Настроить тесты интеграции Maven
И снова конфигурация для этого очень проста.Чтобы запустить только интеграционные тесты, используйте это:
Если вы заключите это в профиль с идентификатором
IT
, вы сможете запускать только быстрые тесты, используяmvn clean install
. Чтобы запустить только интеграционные / медленные тесты, используйтеmvn clean install -P IT
.Но чаще всего вам нужно запускать быстрые тесты по умолчанию и все тесты с
-P IT
. Если это так, то вам нужно использовать трюк:Как видите, я исключаю тесты, помеченные как
java.io.Serializable
. Это необходимо, потому что профиль унаследует конфигурацию по умолчанию плагина Surefire, поэтому, даже если вы скажете<excludedGroups/>
или<excludedGroups></excludedGroups>
, значениеcom.test.annotation.type.IntegrationTest
будет использоваться.Вы также не можете использовать,
none
поскольку это должен быть интерфейс в пути к классам (Maven проверит это).Ноты:
surefire-junit47
необходима только тогда, когда Maven не переключается на бегун JUnit 4 автоматически. Использование элементаgroups
илиexcludedGroups
должно вызвать срабатывание переключателя. Смотрите здесь .@RunWith()
аннотаций для запуска наборов или тестов на основе Spring.источник
Мы используем Maven Surefire Plugin для запуска модульных тестов и Maven Failsafe Plugin для запуска интеграционных тестов. Модульные тесты следуют
**/Test*.java **/*Test.java **/*TestCase.java
соглашениям об именах, интеграционные тесты -**/IT*.java **/*IT.java **/*ITCase.java
. Так что на самом деле это ваш вариант номер три.В паре проектов мы используем TestNG и определяем разные тестовые группы для интеграционных / модульных тестов, но это, вероятно, вам не подходит.
источник
Я бы перешел на Junit4 только за то, что он есть :)
Вы можете разделить их на разные наборы тестов. Я не знаю, как они организованы в Junit3, но в Junit4 должно быть легко просто создать наборы тестов и поместить все реальные модульные тесты в один из них, а затем использовать второй набор для интеграционных тестов.
Теперь определите конфигурацию запуска для обоих наборов в eclipse, и вы легко сможете запустить один набор. Эти комплекты также могут быть запущены из автоматизированного процесса, позволяющего запускать модульные тесты каждый раз при изменении источника и, возможно, интеграционные тесты (если они действительно большие) только один раз в день или один раз в час.
источник
Использование аннотации Spring IfProfileValue позволяет достичь этого без плагина maven или требуемой конфигурации.
Аннотируйте классы или методы интеграционных тестов с помощью IfProfileValue
Для запуска только с использованием модульных тестов:
Для запуска с использованием интеграционного теста и модульных тестов:
Кроме того, «Запустить весь тест» в среде IDE будет запускаться только модульный тест. Добавьте
-Dtest-groups=integration
к ВМ аргументы для запуска как интеграционных, так и модульных тестов.источник
Нет одного правильного ответа. Как вы объяснили, есть несколько эффективных способов сделать это. Я сделал и схему именования файлов, и разбил вещи по разным каталогам.
Похоже, что разделение файла на разные каталоги может сработать для вас лучше, и мне это кажется немного яснее, поэтому я бы склонился к этому.
Я не думаю, что буду пробовать аннотации, потому что мне это кажется более мелким. Вы действительно хотите, чтобы эти два типа тестов были смешаны в одном файле? Я бы не стал.
источник