47

I'm not very good with Ant, but we're using it as a build tool. Right now, we can run "ant test" and it'll run through all the unit tests.

However, I'd love to be able to do something like ant test some_module and have it accept some_module as a parameter, and only test that.

I haven't been able to find how to pass command line args to Ant - any ideas?

martin clayton
  • 76,436
  • 32
  • 213
  • 198
Jonathan Haddad
  • 471
  • 1
  • 4
  • 3

9 Answers9

40

One solution might be as follows. (I have a project that does this.)

Have a separate target similar to test with a fileset that restricts the test to one class only. Then pass the name of that class using -D at the ant command line:

ant -Dtest.module=MyClassUnderTest single_test

In the build.xml (highly reduced):

<target name="single_test" depends="compile" description="Run one unit test">
    <junit>
        <batchtest>
            <fileset dir="${test.dir}" includes="**/${test.module}.class" />
        </batchtest>
    </junit>
</target>
martin clayton
  • 76,436
  • 32
  • 213
  • 198
  • 7
    Martin has understated the case here a bit. According to the ant FAQ, properties are THE way to do what you want. See http://ant.apache.org/faq.html#passing-cli-args for details – vkraemer Dec 16 '09 at 01:48
9

You can also define a property with an optional default value that can be replaced via command line, e.g.

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

and run it as:

ant test -DmoduleName=ModuleX
JeanValjean
  • 17,172
  • 23
  • 113
  • 157
6

What about using some conditional in your test target and the specifying -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>

Adapted a bit from the ant faq.

Rich Schuler
  • 41,814
  • 6
  • 72
  • 59
4

You can define a property on commandline when invoking ant:

ant -Dtest.module=mymodulename

Then you can use it as any other ant property:

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

Have a look at Ant's manual.

Petr Kozelka
  • 7,670
  • 2
  • 29
  • 44
1

I tried the solutions posted here for the very same original question. Yes just use ant -D<arg_name>. THe -D is a "keyword" I guess. I'm no ant expert and have not read the manuals in detail. Then inside the ant XML files can be accessed like: ${arg_name}

For instance you can have an argument name like: arg.myarg, so in XML ${arg.myarg}.

alecxe
  • 462,703
  • 120
  • 1,088
  • 1,195
Jose Quijada
  • 558
  • 6
  • 13
1

Ant really doesn't have parameters_ for the build file. I can think of a few ways to do this:

Use a special target to specify the tests. You can use the <for/> task from AntContrib to allow you to specify multiple tests. You'll need to download the Ant-Contrib jar file. I recommend placing it inside your project under the `${basedir}/antlib/antcontrib" directory. That way, when others checkout your project, they get the needed Ant-Contrib jar file.

<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>

You cab now run multiple tests like this:

$ ant -D"test-one test-two test-three" select-test
David W.
  • 105,218
  • 39
  • 216
  • 337
  • My friend passes different args, how he is doing that? Example: `ant osname stagingEnv browser regression/smoke/sanity` – paul Sep 19 '15 at 11:16
1

Lest say you have two modules in your project ModuleX and ModuleY where ModuleX has 2 testcases to run and ModuleY with 10 testcases.

You could do something like this :

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>
1

You could try this to access one target at a time. Add these lines to your build.xml file :

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

This allows you to enter the module you want to execute and execute that itself instead of running the whole build.xml

You might need to make a few more changes to your build.xml for this to work perfectly.

Chandrani H
  • 126
  • 2
  • 10
0

For the arguments , there is Facility called property. You need to set the property. As in ANT plain arguments is taken as target name.

SteveScm
  • 545
  • 1
  • 7
  • 15