Мы находимся в процессе разработки большого проекта, над которым работает множество взаимодействующих модулей и команд. мы внедрили CI с помощью jenkins, который выполняет периодические сборки и сборки при фиксации, которые запускают тесты junit, фитнес-тесты и покрытие cobertura.
Поскольку мы взаимодействуем со многими компонентами, для некоторых конкретных проектов мы реализовали интеграционные тесты, которые вызывают контекст Spring и запускают множество тестовых случаев, имитирующих важные части потока приложения. Они реализованы как Junit для простоты/удобства, помещены в папки src/test, но не модульные тесты.
Наша проблема заключается в том, что некоторые сборки компонентов выполняются очень долго, и одна из выявленных проблем заключается в том, что длительные интеграционные тесты выполняются дважды, один раз на этапе тестирования и один раз на этапе кобертуры (поскольку кобертура обрабатывает классы, а затем запускает тесты снова). Что приводит к вопросу: можно ли исключить тест из выполнения cobertura?
Использование exclude или ignore в конфигурации pom cobertura работает только для классов src/java, а не для тестовых классов. Я ничего не нашел в документации плагина cobertura. Я пытаюсь найти способ сделать это через конфигурацию. Я думаю, что единственный другой способ, которым это можно сделать, - это переместить эти тесты в другой модуль maven, в котором не включен плагин cobertura, и сделать этот модуль домом для интеграционных тестов. Таким образом, сборка родительского pom вызовет интеграционные тесты, но не попадет под действие cobertura. Но если бы это можно было сделать с помощью конфигурации, было бы намного проще :)
Заранее спасибо, JG
==== ОБНОВЛЕНИЕ И РЕШЕНИЕ ====
Немного поработав над ответом kkamilpl (еще раз спасибо!) Я смог включить и исключить необходимые тесты, ничего не меняя в структуре каталогов. Только с помощью выражений в стиле Java, как только вы поймете, что переопределяет настройку плагина surefire, вы можете запустить «все, кроме пакета»/«только этот пакет», например:
<profiles>
<profile>
<id>unit-tests</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<testcase.include>**/*.class</testcase.include>
<testcase.exclude>**/integration/*.class</testcase.exclude>
</properties>
</profile>
<profile>
<id>integration-tests</id>
<properties>
<testcase.include>**/integration/*.class</testcase.include>
<testcase.exclude>**/dummyStringThatWontMatch/*.class</testcase.exclude>
</properties>
</profile>
</profiles>
Я смог запустить все модульные тесты (то есть все, кроме содержимого тестовой папки integration
) с целью test
и профилем по умолчанию, а затем вызвать цель test
с профилем integration-tests
, чтобы просто запустить интеграционный тест. Затем нужно добавить вызов в новый профиль в jenkins в качестве нового целевого вызова верхнего уровня (он нацелен на родительский pom), чтобы сборка jenkins запускала интеграционные тесты, но только один раз, вместо их повторного запуска от cobertura, когда он использует тестовую цель.