web-dev-qa-db-fra.com

Comment passer un argument à une tâche Ant?

Je ne suis pas très bon avec Ant, mais nous l'utilisons comme outil de construction. À l'heure actuelle, nous pouvons exécuter "ant test" et il exécutera tous les tests unitaires.

Cependant, j'aimerais pouvoir faire quelque chose comme ant test some_module et le laisser accepter some_module en tant que paramètre et le tester uniquement.

Je n'ai pas réussi à trouver comment passer des arguments en ligne de commande à Ant - des idées?

42
Jonathan Haddad

Une solution pourrait être la suivante. (J'ai un projet qui fait ça.)

Avoir une cible distincte semblable à test avec une fileset qui limite le test à une seule classe. Ensuite, transmettez le nom de cette classe en utilisant -D sur la ligne de commande ant:

ant -Dtest.module=MyClassUnderTest single_test

Dans le build.xml (fortement réduit):

<target name="single_test" depends="compile" description="Run one unit test">
    <junit>
        <batchtest>
            <fileset dir="${test.dir}" includes="**/${test.module}.class" />
        </batchtest>
    </junit>
</target>
37
martin clayton

Qu'en est-il de l'utilisation de certaines conditions dans votre cible de test et de la spécification de -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>

Adapté un peu du ant faq .

6
Rich Schuler

Vous pouvez également définir une propriété avec une valeur par défaut facultative pouvant être remplacée via une ligne de commande, par exemple.

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

et lancez le comme:

ant test -DmoduleName=ModuleX
6
JeanValjean

Vous pouvez définir une propriété sur la ligne de commande lorsque vous appelez ant:

ant -Dtest.module=mymodulename

Ensuite, vous pouvez l'utiliser comme n'importe quelle autre propriété ant:

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

Regardez le manuel de Ant .

4
Petr Kozelka

Vous pouvez essayer ceci pour accéder à une cible à la fois. Ajoutez ces lignes à votre fichier build.xml:

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

Cela vous permet d’entrer dans le module que vous voulez exécuter et de l’exécuter lui-même au lieu d’exécuter tout le fichier build.xml

Vous devrez peut-être apporter quelques modifications supplémentaires à votre build.xml pour que cela fonctionne parfaitement.

1
Chandrani Halder

J'ai essayé les solutions affichées ici pour la même question initiale. Oui, utilisez simplement ant -D<arg_name>. Le -D est un "mot clé" je suppose. Je ne suis pas un expert en fourmis et je n'ai pas lu les manuels en détail. Ensuite, à l’intérieur de la fourmi, les fichiers XML peuvent être consultés comme suit: ${arg_name}

Par exemple, vous pouvez avoir un nom d'argument tel que: arg.myarg, donc en XML ${arg.myarg}.

1
Jose Quijada

De toute façon, vous avez deux modules dans votre projet ModuleX et ModuleY, où ModuleX doit exécuter 2 cas de test et ModuleY avec 10 cas de test.

Vous pouvez faire quelque chose comme ça:

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

Ant n'a pas vraiment de paramètres pour le fichier de construction. Je peux penser à quelques manières de faire ceci:

Utilisez une cible spéciale pour spécifier les tests. Vous pouvez utiliser la tâche <for/> à partir de AntContrib pour vous permettre de spécifier plusieurs tests. Vous devrez télécharger le fichier Ant-Contrib jar. Je vous recommande de le placer dans votre projet dans le répertoire `$ {basedir}/antlib/antcontrib". Ainsi, lorsque les autres personnes extrairont votre projet, elles obtiendront le fichier jar Ant-Contrib nécessaire.

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

Vous pouvez maintenant exécuter plusieurs tests comme ceci:

$ ant -D"test-one test-two test-three" select-test
0
David W.

Pour les arguments, il existe une propriété appelée propriété. Vous devez définir la propriété. Comme dans ANT, les arguments simples sont pris comme nom de cible.

0
SteveScm