web-dev-qa-db-ja.com

antを使用して「純粋な」JUnit4テストを実行する

JUnit4とant1.7の両方に移行しました

テストはEclipseで正常に実行されますが、antを使用してテストを実行する場合、アノテーションは無視されます。

Ant junitタスクによると ドキュメント

また、注釈のみを使用し、JUnit4TestAdapterを使用しない「純粋な」JUnit4テストを含むJUnit4.0でも機能します。

ただし、ドキュメントでは、構成方法について詳しく説明していません。

Junitタスクに必要な特別な設定はありますか?私は何かが足りないのですか? TestCaseを拡張するテスト(つまり3.8スタイル)と「純粋な」JUnit 4テストの両方がありますが、それが問題になる可能性がありますか?

23
LiorH

Antで純粋なJUnit4テストを使用しています。

これが私のビルドファイルの興味深い部分です:

<junit printsummary="yes" haltonfailure="yes">
    <formatter type="xml"/>
    <classpath refid="path.test"/>
    <batchtest fork="yes" todir="${dir.report.unittests.xml}">
        <fileset dir="src">
            <include name="**/*Test*.Java"/>
        </fileset>
    </batchtest>
</junit>

Antのlibディレクトリに最新バージョンのjunit.jarファイルがあることを確認してください。私の知る限り、必要なバージョンはant1.7以降のバージョンで提供されます...

14
Homes2001

Antには、デフォルトでJUnit3のバージョンが付属しています。 JUnit 3は、テストアノテーションをサポートしていません。

JunitタスクからJUnit4アノテーションを使用するには、junitタスクのネストされたクラスパス要素にJUnit 4 jarの場所を指定してください( ant FAQのこのエントリ を参照)。

<junit showoutput="yes" fork="true">
    <classpath>
        <!-- The location of the JUnit version that you want to use -->
        <pathelement location="lib/junit-4.9b1.jar"/>
    </classpath>

    <formatter type="plain" usefile="false" />

    <batchtest>
        <fileset dir="${tests.dir}"/>
    </batchtest>
</junit>

これは、ANT_HOME/libのant-junit.jarを上書きするための推奨されるソリューションです。これは、コードと一緒にJUnit jarをソース管理に保持して、後のバージョンに簡単にアップグレードできることを意味します。

上記のファイルセットにインクルードパターンを指定していませんが、これは、junitタスクがそのディレクトリ構造内のすべてのクラスに対してJUnitを実行しようとすることを意味し、含まれていないクラスが多数含まれる可能性があることに注意してください。ソースファイルの構造に応じたテスト。

7
MikeD

最終的には、ant 1.9.3+で追加されたskipNonTestsパラメーターを使用してのみテストを見つけて実行できます。

これは、上記で受け入れられた回答のコードスニペットです(新しいskipNonTestsパラメーターを除き、ファイル名要件の「テスト」を削除します)。

<junit printsummary="yes" haltonfailure="yes">
    <formatter type="xml"/>
    <classpath refid="path.test"/>
    <batchtest skipNonTests="true" fork="yes" todir="${dir.report.unittests.xml}">
        <fileset dir="src">
            <include name="**/*.Java"/>
        </fileset>
    </batchtest>
</junit>
3
11101101b

これは私に起こりました、そしてそれは私が注釈を使用していて、TestCaseを拡張していたからでした。

public class TestXXX extends TestCase {

    @Test
    public void testSimpleValidCase() {
        // this was running
    }

    @Test
    public void simpleValidCase() {
        // this wasn't running
    }
}

TestCaseを拡張すると、JUnit3スタイルを想定しているため、JUnit4アノテーションは無視されます。

解決策は、TestCaseの拡張を停止することです。

2
alves

クラスパス定義を確認してください...これで私の問題は解決しました。

<path id="classpath" description="Classpath do Projeto">
    <fileset dir="${LIB}">
        <include name="**/*.jar" />
        <exclude name="**/.SVN/*.*"/>
    </fileset>
</path>
1
wagner.santos

このアノテーションを他のクラスに適用しますorg.junit.Ignore

0
Dennis C

これは私の一般的なantスクリプトの関連部分です...それがあなたを助けるかどうかはわかりません。

 <junit fork="true"
        forkmode="once"
        haltonfailure="false"
        haltonerror="false"
        failureproperty="tests.failures"
        errorproperty="tests.errors"
        includeantruntime="true"
        showoutput="true"
        printsummary="true">
     <classpath>
         <path refid="path-id.test.classpath.run"/>
     </classpath>

     <formatter type="xml"/>

     <batchtest fork="yes"
                todir="${dir.build.testresults}">
         <fileset dir="${dir.src.tests}">
             <include name="**/*Test.Java"/>
         </fileset>
     </batchtest>
 </junit>
0
TofuBeer

また、JUnit4TestAdapterを使用せずに、つまりメソッドを使用せずに、JUnit4.0でテストを実行しようとしました。
public static junit.framework.Test suite(){return new JUnit4TestAdapter(SomeTestClass.class); }

私はant1.9.4を使用しています。 ant test verbose(ant -v)を実行すると、

[junit]同じVMで複数のテストを実行する
[junit] /usr/share/Java/junit.jar:/usr/sharejava/ant-launcher.jar:/usr/share/Java/ant.jar:/usr/share/Java/を暗黙的に追加しますant /ant-junit.jarからCLASSPATHへ

ああ、でもまだいくつかのant-junit-taskがあります。これをダウンロードすると、暗黙的に追加されていない/usr/share/Java/ant/ant-junit4.jarが追加で表示されます。明示的に追加しました:

<junit printsummary="yes" 
    fork="yes" 
    forkmode="once"
    maxmemory="1023m" 
    showoutput="no">
    ...
   <classpath>
     <pathelement path="...:${junitJar}:${hamcrestJar}:/usr/share/Java/ant/ant-junit4.jar" />
   </classpath>
...
</junit>

そしてそれはうまくいった。なし:いいえ。私はこの解決策がまったく美しくないことを知っています...

0
user2609605