如何将参数传递给Ant任务?

时间:2009-12-16 00:41:10

标签: ant

我对Ant不太满意,但我们将它用作构建工具。现在,我们可以运行“蚂蚁测试”,它将贯穿所有单元测试。

但是,我希望能够做ant test some_module这样的事情并让它接受some_module作为参数,并且只测试它。

我无法找到如何将命令行参数传递给Ant - 任何想法?

9 个答案:

答案 0 :(得分:38)

一种解决方案可能如下。 (我有一个项目可以做到这一点。)

有一个与test类似的单独目标,其中fileset仅将测试限制为一个类。然后在ant命令行使用-D传递该类的名称:

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>

答案 1 :(得分:6)

如何在测试目标中使用某些条件并指定-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改编了一下。

答案 2 :(得分:6)

您还可以使用可选的默认值定义属性,该值可以通过命令行替换,例如

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

并将其运行为:

ant test -DmoduleName=ModuleX

答案 3 :(得分:4)

您可以在调用ant时在命令行上定义属性:

ant -Dtest.module=mymodulename

然后您可以将其用作任何其他ant属性:

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

查看Ant's manual

答案 4 :(得分:1)

我尝试了这里发布的解决方案,用于原始问题。是的,只需使用ant -D<arg_name>。我猜-D是一个“关键字”。我不是蚂蚁专家,也没有详细阅读过这些手册。然后在ant XML文件中可以访问:${arg_name}

例如,您可以使用参数名称:arg.myarg,因此在XML ${arg.myarg}中。

答案 5 :(得分:1)

您可以尝试一次访问一个目标。将这些行添加到build.xml文件中:

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

这允许您输入要执行的模块并执行该模块而不是运行整个build.xml

您可能需要对build.xml进行一些更改才能使其完美运行。

答案 6 :(得分:0)

Ant实际上没有构建文件的参数_。我可以想到几种方法:

使用特殊目标指定测试。您可以使用AntContrib中的<for/>任务来指定多个测试。您需要下载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 :(得分:0)

对于参数,有一个称为属性的Facility。您需要设置属性。与在ANT中一样,普通参数被视为目标名称。

答案 8 :(得分:0)

请注意,您的项目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>