Пропустить *тест* с плагином cobertura

Мы находимся в процессе разработки большого проекта, над которым работает множество взаимодействующих модулей и команд. мы внедрили 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, когда он использует тестовую цель.


person JGN    schedule 05.01.2015    source источник
comment
Какую команду Maven вы используете в Jenkins для запуска сборки?   -  person user944849    schedule 05.01.2015
comment
Цели Maven чисты и развернуты. Есть еще один шаг к цели, который работает только с пакетом Fitnesse.   -  person JGN    schedule 05.01.2015


Ответы (1)


Вы всегда можете использовать профили maven: http://maven.apache.org/guides/introduction/introduction-to-profiles.html

Отдельные тесты для разных каталогов, например:

testsType1
    SomeTest1.java
    SomeTest2.java
testsType2
    OtherTest1.java
    OtherTest2.java

Затем в pom определите правильный профиль для каждого типа теста, например:

    <profile>
        <id>testsType1</id>
        <properties>
            <testcase.include>%regex[.*/testsType1/.*[.]class]</testcase.include>
            <testcase.exclude>%regex[.*/testsType2/.*[.]class]</testcase.exclude>
        </properties>
    </profile>

Чтобы определить профиль по умолчанию:

        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>

И, наконец, определите плагин surefire:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>>
            <configuration>
                <includes>
                    <include>${testcase.include}</include>
                </includes>
                <excludes>
                    <exclude>${testcase.exclude}</exclude>
                </excludes>
            </configuration>
        </plugin>

Чтобы использовать его, позвоните

 mvn test #to use default profile
 mvn test -P profileName #to use defined profileName
person kkamilpl    schedule 05.01.2015
comment
Спасибо, я попробую это и приму ответ, если проблема будет решена. - person JGN; 07.01.2015