web-dev-qa-db-ja.com

Antタスクに引数を渡すにはどうすればよいですか?

私はAntにはあまり向いていませんが、ビルドツールとして使用しています。今、「ant test」を実行でき、すべての単体テストを実行します。

ただし、ant test some_modulesome_moduleをパラメーターとして使用し、それのみをテストします。

コマンドライン引数をAntに渡す方法を見つけることができませんでした-アイデアはありますか?

43
Jonathan Haddad

1つの解決策は次のとおりです。 (これを行うプロジェクトがあります。)

テストを1つのクラスのみに制限する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>
38
martin clayton

テストターゲットでいくつかの条件を使用し、-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 から少し変更しました。

6
Rich Schuler

オプションのデフォルト値を使用してプロパティを定義することもできます。デフォルト値は、コマンドラインを介して置き換えることができます。

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

そして次のように実行します:

ant test -DmoduleName=ModuleX
6
JeanValjean

Antを呼び出すときに、コマンドラインでプロパティを定義できます。

ant -Dtest.module=mymodulename

次に、他のantプロパティとして使用できます。

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

Antのマニュアル をご覧ください。

4
Petr Kozelka

これを試して、一度に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をさらに変更する必要がある場合があります。

2
Chandrani H

まったく同じ元の質問に対して、ここに投稿された解決策を試しました。はい、単にant -D<arg_name>を使用します。 -Dは私が推測する「キーワード」です。私はアリの専門家ではなく、マニュアルを詳しく読んでいません。その後、ant XMLファイル内で次のようにアクセスできます:${arg_name}

たとえば、arg.myargのような引数名を持つことができます。したがって、XMLでは${arg.myarg}です。

1
Jose Quijada

あなたのプロジェクトModuleXとModuleYに2つのモジュールがあり、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
Ganesh Raja

Antには、ビルドファイル用のparameters_はありません。これを行ういくつかの方法を考えることができます。

特別なターゲットを使用して、テストを指定します。 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
0
David W.

引数には、プロパティと呼ばれる機能があります。プロパティを設定する必要があります。 ANTのように、単純な引数がターゲット名として使用されます。

0
SteveScm