Как передать аргумент в задачу Ant?
Я не очень хорош с Ant, но мы используем его как инструмент сборки. Прямо сейчас мы можем запустить "ant test", и он будет проходить через все модульные тесты.
Однако мне бы хотелось сделать что-то вроде ant test some_module
и принять его some_module
как параметр и только проверить это.
Мне не удалось найти, как передать аргументы командной строки в Ant - любые идеи?
Ответы
Ответ 1
Одним из решений может быть следующее. (У меня есть проект, который делает это.)
У вас есть отдельная цель, похожая на 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>
Ответ 2
Как насчет использования некоторых условных условий в тестовой цели и указании -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.
Ответ 3
Вы можете определить свойство в командной строке при вызове ant:
ant -Dtest.module=mymodulename
Затем вы можете использовать его как любое другое свойство ant:
...
<fileset dir="${test.dir}" includes="**/${test.module}.class" />
...
Посмотрите Ant руководство.
Ответ 4
Вы также можете определить свойство с необязательным значением по умолчанию, которое можно заменить с помощью командной строки, например
<target name="test">
<property name="moduleName" value="default-module" />
<echo message="Testing Module: ${moduleName}"/>
....
</target>
и запустите его как:
ant test -DmoduleName=ModuleX
Ответ 5
Я попробовал решения, размещенные здесь для того же самого оригинального вопроса. Да, просто используйте ant -D<arg_name>
. Я думаю, что -D
является ключевым словом. Я не эксперт ant и не читал руководства подробно. Затем внутри XML файлов ant можно получить доступ, например: ${arg_name}
Например, у вас может быть имя аргумента вроде: arg.myarg
, поэтому в XML ${arg.myarg}
.
Ответ 6
Ant действительно не имеет параметров_ для файла сборки. Я могу придумать несколько способов сделать это:
Используйте специальную цель для задания тестов. Вы можете использовать задачу <for/>
из AntContrib, чтобы вы могли указать несколько тестов. Вам нужно будет скачать файл Ant-Contrib jar. Я рекомендую разместить его внутри вашего проекта в каталоге `$ {basedir}/antlib/antcontrib. Таким образом, когда другие проверяют ваш проект, они получают необходимый файл Ant -Contrib jar.
<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
Ответ 7
Для аргументов существует свойство, называемое Facility. Вам нужно установить свойство. Как и в ANT простые аргументы принимаются как имя цели.
Ответ 8
Допустим, у вас есть два модуля в вашем проекте 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>