2015-10-20 3 views
1

В моем проекте используется Ant, и в нем есть несколько тестовых наборов. Поскольку каждый люкс побежал подобным образом, есть макрос, определенный:Запуск Ant-макроса из задачи покрытия Jacoco

<macrodef name="exec-tests"> 
    <attribute name="test-suite" /> 
    <element name="test-run" implicit="yes" /> 
    <sequential> 
     <junit printsummary="yes" haltonfailure="true" haltonerror="true" showoutput="true" outputtoformatters="true" fork="true" maxmemory="512m"> 
      <jvmarg value="-XX:MaxPermSize=256m" /> 
      <jvmarg value="-Xmx512m" /> 
      <jvmarg value="-Xms512m" /> 
      <classpath refid="test.run.class.path" /> 
      <formatter type="plain" usefile="false" /> 
      <formatter type="xml" usefile="true" /> 
      <test name="@{test-suite}" todir="${test.build.results.dir}" /> 
     </junit> 
    </sequential> 
</macrodef> 

Таким образом, существует несколько задач, работающих различных наборов, как это:

<target name="run-xxx-tests" depends="build-tests"> 
    <exec-tests test-suite="com.mycompany.XxxTestsSuite" /> 
</target> 

<target name="run-yyy-tests" depends="build-tests"> 
    <exec-tests test-suite="com.mycompany.YyyTestsSuite" /> 
</target> 

Теперь я также хочу, чтобы запустить тестовый набор с охватом Якоко. Так что было бы неплохо сделать это:

<target name="run-xxx-tests-with-coverage" depends="build-tests"> 
    <jacoco:coverage destfile="${test.coverage.unit.file}"> 
     <exec-tests test-suite="com.mycompany.XxxTestsSuite" /> 
    </jacoco:coverage> 
</target> 

Однако Jacoco, кажется, не поддерживает макросы внутри тега покрытия, так как я получаю сообщение об ошибке:

Caused by: C:\Users\taavi\projects\cds\build.xml:87: exec-tests is not a valid child of the coverage task 
    at org.jacoco.ant.CoverageTask.addTask(CoverageTask.java:68) 
    at org.apache.tools.ant.UnknownElement.handleChildren(UnknownElement.java:367) 

Сейчас я создал еще один macrodef, который очень похож на «exec-tests», но просто добавляет покрытие. Это не критично, но мне интересно, есть ли способ избежать этой дублирующей части задачи «junit»?

k6ps

ответ

2

<jacoco:coverage> задача имеет an enabled attribute, что может быть полезно ...

If set to true coverage data will be collected for the contained task.

Чтобы использовать enabled, вы могли бы сделать несколько изменений <exec-tests>:

  • движение <jacoco:coverage> в него
  • Добавить необязательный coverage.destfile атрибут

Как это будет выглядеть ...

<macrodef name="exec-tests"> 
    <attribute name="test-suite" /> 
    <!-- If <test-suite> is called without coverage.destfile, then --> 
    <!-- coverage.enabled won't be set to true and coverage info won't --> 
    <!-- be collected. --> 
    <attribute name="coverage.destfile" default="" /> 
    <element name="test-run" implicit="yes" /> 
    <sequential> 
     <local name="coverage.enabled" /> 
     <condition property="coverage.enabled" value="false" else="true"> 
      <equals arg1="@{coverage.destfile}" arg2="" /> 
     </condition> 
     <jacoco:coverage enabled="${coverage.enabled}" destfile="@{coverage.destfile}"> 
      <junit ...> 
      ... 
      </junit> 
     </jacoco:coverage> 
    </sequential> 
</macrodef> 

Затем каждый тест может указать, если информация покрытия должны быть собраны ...

<exec-tests 
    test-suite="com.mycompany.XxxTestsSuite" 
    coverage.destfile="${test.coverage.unit.file}" /> 

В приведенном выше примере, охват информация будет собрана, поскольку предоставляется coverage.destfile.

+0

Да, эта идея сработала для меня. Мне даже не нужен локальный тег, я просто представил свойство с включенным покрытием для макродефа: ' ' – k6ps