Как передать аргумент в задачу Ant? - PullRequest
43 голосов
/ 16 декабря 2009

Я не очень хорош в Ant, но мы используем его как инструмент для сборки. Прямо сейчас мы можем запустить «тест муравья», и он пройдет все юнит-тесты.

Однако я бы хотел иметь возможность сделать что-то вроде ant test some_module и сделать так, чтобы оно принимало some_module в качестве параметра, и только проверять это.

Я не смог найти, как передать аргументы командной строки в Ant - есть идеи?

Ответы [ 9 ]

38 голосов
/ 16 декабря 2009

Одним из решений может быть следующее. (У меня есть проект, который делает это.)

Имейте отдельную цель, похожую на test с fileset, которая ограничивает тест только одним классом. Затем передайте имя этого класса, используя -D в командной строке ant:

ant -Dtest.module=MyClassUnderTest single_test

В build.xml (сильно уменьшено):

<target name="single_test" depends="compile" description="Run one unit test">
    <junit>
        <batchtest>
            <fileset dir="${test.dir}" includes="**/${test.module}.class" />
        </batchtest>
    </junit>
</target>
6 голосов
/ 11 октября 2016

Вы также можете определить свойство с необязательным значением по умолчанию, которое можно заменить с помощью командной строки, например,

<target name="test">
  <property name="moduleName" value="default-module" />
  <echo message="Testing Module: ${moduleName}"/>
  ....
</target>

и запустите его как:

ant test -DmoduleName=ModuleX
6 голосов
/ 16 декабря 2009

Как насчет использования некоторого условия в вашей цели теста и указания -Dcondition=true?

<target name="test" depends="_test, _test_if_true>
   ...
</target> 

<target name="_test_if_true" if="condition">
   ...
</target>

<target name="_test" unless="condition">
   ...
</target>

Немного адаптировано из ant faq .

4 голосов
/ 20 ноября 2012

Вы можете определить свойство в командной строке при вызове ant:

ant -Dtest.module=mymodulename

Тогда вы можете использовать его как любое другое свойство муравья:

...
    <fileset dir="${test.dir}" includes="**/${test.module}.class" />
...

Взгляните на Руководство Муравья .

1 голос
/ 10 мая 2018

Вы можете попробовать это, чтобы получить доступ к одной цели за раз. Добавьте эти строки в файл build.xml:

<project name="whatever" default="default">
    <input message="Please select module:" addproperty="mod" />
    <target name="default" depends="${mod}/>
...
</project>

Это позволяет вам ввести модуль, который вы хотите выполнить, и выполнить его самому вместо запуска всего build.xml

Вам может потребоваться внести еще несколько изменений в свой build.xml, чтобы это работало идеально.

1 голос
/ 30 мая 2013

Я попробовал опубликованные здесь решения для того же оригинального вопроса. Да, просто используйте ant -D<arg_name>. -D это "ключевое слово", я думаю. Я не специалист по муравьям и не читал руководства подробно. Тогда внутри муравья XML файлы могут быть доступны как: ${arg_name}

Например, у вас может быть имя аргумента, например: arg.myarg, поэтому в XML ${arg.myarg}.

0 голосов
/ 08 сентября 2014

Допустим, у вас есть два модуля в вашем проекте ModuleX и ModuleY, где ModuleX имеет 2 тестовых сценария для запуска и ModuleY с 10 тестовыми сценариями.

Вы могли бы сделать что-то вроде этого:

ant runTestsOnModule -Dtestmodule="ModuleX" 
       OR to test all modules by calling 
ant tests

<target name="runTestsOnModule">
  <antCall target="testcase${testmodule}"/>
</target>'

<! -- run single module -->
<target name="runTestsOnModule">
  <antCall target="testcase${testmodule}"/>
</target>

<!--run all tests-->    
<target name="tests">
   <antcall target="testcaseModuleX">
   <antcall target="testCaseModuleY">
</target>

<target name="testcaseModuleX">
   ..run junit task to call 2 testcase
</target>

<target name="testcaseModuleY">
  ....run junit task to call 10 testcase
</target>
0 голосов
/ 26 ноября 2013

Для аргументов есть объект, называемый свойством. Вам необходимо установить свойство. Как и в ANT, в качестве имени цели принимаются простые аргументы.

0 голосов
/ 30 мая 2013

У Ant действительно нет параметров_ для файла сборки. Я могу придумать несколько способов сделать это:

Используйте специальную цель для определения тестов. Вы можете использовать задачу <for/> из AntContrib , чтобы указать несколько тестов. Вам нужно скачать файл Ant-Contrib jar. Я рекомендую поместить его в ваш проект в каталог `$ {basedir} / antlib / antcontrib". Таким образом, когда другие проверяют ваш проект, они получают необходимый jar-файл Ant-Contrib.

<property name="antlib.dir"     value="${basedir}/antlib"/>
<property name="antcontrib.dir" value="${antlib}/antcontrib"/>

<!-- Set up the ant contrib tasks for your use -->
<taskdef resource="net/sf/antcontrib/antlib.xml">
    <classpath>
        <fileset dir="${antcontrib.dir}"/>
    </classpath>
</taskdef>

<target name="select-test"
    description="Select the tests to run"
    depends="test-compile"
    if="junit-tests">
       <for parameter="module" 
          list="${junit-tests}"
          delimiter=" ">
          <sequential>
              <junit
                 fork="true"
                 ...>
                 <batchtest todir="$target/unit-tests">
                 <fileset dir="${test.destdir}">
                    <include name="**/@{module}.class"/>
                 </fileset>
             </junit>
         </sequential>
      </for>
</target>

Теперь вы можете запустить несколько тестов, например:

$ ant -D"test-one test-two test-three" select-test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...