2014-09-30 4 views
0

У меня есть модуль в моем проекте Java с несколькими интеграционными тестами. Два из них - UpgradeDatabase.java и CreateDatabase.java, которые в настоящее время выполняются при каждом запуске на этапе предварительной интеграции. Я хочу, чтобы они запускались только раз в то время (скажем, ежемесячно), потому что они слишком долго выполняются (многие базы данных созданы и т. Д.), Как я могу это достичь? Моей безотказная конфигурация плагина выглядит следующим образом (обратите внимание, параметр skip.selenium.tests ложна):Условный запуск интеграционных тестов в maven

<plugin> 
      <artifactId>maven-failsafe-plugin</artifactId> 
      <configuration> 
       <forkMode>${tests.forkMode}</forkMode> 
       <skip>${skip.selenium.tests}</skip> 
       <environmentVariables> 
        ...this area skipped...as it's non important 
       </environmentVariables> 
       <systemPropertyVariables> 
        <!--<rc.count.firefox>${rc.count.firefox}</rc.count.firefox>--> 
        <selenium.browser>firefox</selenium.browser> 
        <user.home>${env.USERPROFILE}</user.home> 
       </systemPropertyVariables> 
      </configuration> 

      <executions> 
       <!--before the tests--> 
       <execution> 
        <id>upgrade-the-database</id> 
        <configuration> 
         <includes> 
          <include>**/UpgradeDatabase.java</include> 
         </includes> 
        </configuration> 
        <phase>pre-integration-test</phase> 
        <goals> 
         <goal>integration-test</goal> 
         <goal>verify</goal> 
        </goals> 
       </execution> 
       <!--before the tests--> 
       <execution> 
        <id>recreate-the-database</id> 
        <configuration> 
         <testFailureIgnore>false</testFailureIgnore> 
         <includes> 
          <include>**/CreateDatabase.java</include> 
         </includes> 
        </configuration> 
        <phase>pre-integration-test</phase> 
        <goals> 
         <goal>integration-test</goal> 
         <goal>verify</goal> 
        </goals> 
       </execution> 

      </executions> 
     </plugin> 
+0

Вы используете JUnit или TestNG? – luboskrnac

+0

Я использую JUnit – misha

ответ

0

Если вы используете TestNG, я хотел бы предложить, чтобы справиться с этим с помощью тестовых групп.

Вы можете указать для каждого теста, в какую группу/группы входит тест (например, @Test(groups = { "SlowIntegrationTest" })). Затем, когда вы запускаете maven, вы можете указать, какие группы должны быть выполнены (например, clean test -Dgroups=UnitTest,IntegrationTest).

Конечно, это включает в себя дисциплину от разработчиков, чтобы правильно маркировать тесты. Но если кто-то забывает отметить тест, он не будет выполнен, и он должен появиться в статистике покрытия для определенного модуля (это снизится до качества вашего процесса CI).

1

Посмотрите на Build Profiles.

Вкратце. Заключите конфигурацию с:

<profiles> 
    <profile> 
    <id>monthly</id> 

     ... your configuration ... 

    </profile> 
</profiles> 

Добавьте его в settings.xml, если вы хотите, чтобы быть активирована по умолчанию:

<activeProfiles> 
    <activeProfile>monthly</activeProfile> 
</activeProfiles> 

Или активировать его на CMD линии:

mvn -P monthly ... 
+0

Герольд, я не понимаю ваше решение здесь. Во-первых, какие настройки.xml вы подтверждаете? это% USER_HOME% /. M2/settings.xml ИЛИ% M2_HOME%/conf/settings.xml – misha

+0

@misha Вы прочитали раздел _complete_, к которому я привязан? Re 'settings.xml': Если вы хотите активировать профиль только через строку cmd, этот параметр не нужен в' settings.xml'. Это была дополнительная информация, на всякий случай ... Если вы хотите использовать это, это зависит от того, хотите ли вы, чтобы конфигурация была доступна для всех или только для определенных пользователей на машине, см. [Maven, Краткий обзор] (https://maven.apache.org/settings.html): _ «Если оба файла существуют, их содержимое объединяется, а пользовательские параметры settings.xml являются доминирующими». _ –

+0

Но у меня есть только один построить конфигурацию в моей среде CI, поэтому мне все равно придется вручную активировать/инактивировать профиль, чтобы настроить мою среду с новыми базами данных. Мне действительно нужно полностью автоматизировать это, возможно, использовать некоторый скрипт для проверки в первый день месяца и инициировать выполнение другого профиля (который включает мои тесты UpgradeDatabase.java и CreateDatabase.java) – misha

0

Вы может переместить код установки/обновления БД в new module. Затем вы можете использовать build profiles, чтобы скрыть этот новый модуль в стандартной сборке (т. Е. При вызове Maven без профиля). На вашем CI-сервере вы можете запускать Maven один раз через некоторое время (возможно, каждую ночь) с -P name, чтобы включить профиль name, который должен включать новый модуль.

Обратите внимание, что Maven выполняет модули в указанном вами порядке, если они не зависят друг от друга. Во втором случае Maven будет изменять порядок модулей, чтобы убедиться, что сначала построены зависимости.

+0

Просто потому, что мне любопытно : Почему вы предлагаете перейти к новому модулю? Если я не активирую профиль, его конфигурация не активна независимо от того, где находится объект, на который ссылается конфигурация. –

+0

Это просто еще один вариант. Я предпочитаю модули, когда конфигурация для плагинов сложна (т. Е. Поддерживать простой XML) или когда я хочу отделить вещи, которые просто не принадлежат одному модулю (например, модульные тесты и тесты интеграции). –

0

@misha Re ваш комментарий к my previous answer:

  1. Pure активации внешний профиль Maven:

    сделать регулярную работу сборки параметризованных с параметром PROFILE, например, и пустой значение параметра (или просто символ пробела, если пустое значение не поддерживается) по умолчанию. Добавьте этот параметр в вашей МВН CMD линии:

    mvn ${PROFILE} ...

    Такое, пустое значение (или пробел) добавляется в CMD линии делать ... ничего.

    Создать ежемесячную работу сборки, которая запускает регулярную и впрыскивает этот параметр со значением -Р ежемесячного, так что CMD линия вашего обычным строить становится:

    mvn -P monthly ...
  2. Смешанного внешний и POM внутреннего Maven активация профиля:

    См. 5.3. Profile Activation или Introduction to Build Profiles, Details on profile activation.

    Добавить раздел активации вашего профиля, как:

    <activation> 
        <property> 
        <name>monthly</name> 
        </property> 
    </activation>

    ... и поставить МВН CMD линию вашей обычной строить с соответствующим свойством:

    mvn -D monthly ...

    ... используя например, метод 1. выше.

+0

Я создал профиль, который переопределяет отказоустойчивый плагин и дополнительно выполняет тесты инициализации, но в TeamCity нет возможности активировать этот профиль на основе ежемесячного расписания, т.е. я могу запустить ежемесячную сборку, но не могу ввести этот параметр -P ежемесячно , Заметьте, что я использую TeamCity 8.1.3 – misha

+0

@misha Извините. Я не знаком с TeamCity. Я думаю, это стоит нового вопроса. –