4

batchtestjunit を使用してすべてのテスト クラスをテストする Ant ビルド ファイルがあります。

クラスがあるとします

class MyTest{
    @BeforeClass
    public static void setUpBeforeClass(){
       //some stuff
    }

    @Test
    public void test1(){
    }

    @Test
    public void test2(){
    }
}

JUnit がMyTestテスト メソッドごとにクラスの新しいインスタンスを作成することはわかっていますが、テスト メソッドごとに新しい VM を作成する必要があります。各テスト メソッドを個別の VM で実行し、MyTestテスト メソッドごとにクラスローダーを再度ロードする必要があります。それは可能ですか?

ドキュメントを読んで、この解決策を試しました:

<junit fork="yes" reloading="true" forkmode="perTest">
    <batchtest>
    </batchtest>
</junit>

しかし、これらのオプションを各テスト メソッドに使用した後でも、setUpBeforeClassメソッドは 1 回しか呼び出されません。私は何か間違ったことをしていますか?

編集:

なぜ私はそれをしたいのですか?

私のテストメソッドは、ものを使用するいくつかの共同作業者を使用しており、すべてのメソッドでそのものをクリアしstaticたいと考えています。static実際、私はテストがローカル環境で合格し、本番環境で失敗するという問題に直面しています。

4

1 に答える 1

0

機能していることを確認できる唯一の方法は、<test>要素の複数のインスタンスを持つことです。

<test>これに関する問題は、実行するメソッドを要素ごとに指定する必要があることです。静的初期化子と 2 つのテストを含む単一のテスト クラスを作成しました。次の<junit>タスクで、私はあなたが望むことをすることができました:

<junit fork="yes">
    <classpath>
        <path refid="classpath" />
    </classpath>
    <formatter type="xml"/>
    <test name="TestSimple" methods="testOne" toDir="firstRun" />
    <test name="TestSimple" methods="testTwo" toDir="secondRun"  />
</junit>

ビルド ログから得た情報から、それらが 2 つの異なる JVM で実行されたことは明らかです。

test:
    ...
    [junit] Executing 'C:\Program Files\Java\jdk1.7.0_25\jre\bin\java.exe' with arguments:
    [junit] '-classpath'
    ...
    [junit] 'org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner'
    [junit] 'TestSimple'
    [junit] 'methods=testOne'
    ...
    [junit] Executing 'C:\Program Files\Java\jdk1.7.0_25\jre\bin\java.exe' with arguments:
    [junit] '-classpath'
    ...
    [junit] 'org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner'
    [junit] 'TestSimple'
    [junit] 'methods=testTwo'
    ...
    [junit] Test TestSimple FAILED

System.outまた、各テストのレポートで静的イニシャライザに入れたステートメントも確認できます。

ここでの重要な詳細は、属性を使用して各<test>タグがレポートを別のディレクトリにリダイレクトするようにするtoDirか、属性を使用して出力ファイルの名前を変更する必要があることですoutfile。これは、レポート ファイル名が、実行中のメソッドではなく、クラスの名前を使用しているためです。つまり、2 回目の実行で最初の実行のレポートが上書きされます。

特定のケースでは、同じ JVM で問題なく実行できるすべてのテストに a を使用し、タグを<batchtest>追加して問題のあるテストの実行を回避できます。<exclude>次に、<test>問題のあるテストごとに特定のタグを追加します。

これは、methods属性が特定のメソッドを再実行するか、実行が遅すぎる別のテストを実行するように特別に設計されているためです。ドキュメントから:

メソッド属性は、次のシナリオで役立ちます。

  • テスト メソッドが失敗し、テスト メソッドを再実行して修正をテストするか、Java デバッガーでテストを再実行する必要があります。他の (実行時間が長い可能性がある) テスト メソッドが完了するのを待つ必要はありません。
  • 1 つまたは複数のテスト メソッドの実行が予想よりも遅く、Java プロファイラーでそれらを再実行したい (他のテスト メソッドが実行されている間にプロファイラーを実行するオーバーヘッドがない場合)。

しかし、個人的には、以前にあなたと同じ問題に遭遇した人から来て、静的初期化子は最悪です! できるだけ早くそれらを取り除くために一生懸命努力します。そして、@PeterNiederwieser を引用すると、テスト セットごとに新しい JVM を使用すると、テスト スイートの実行が非常に遅くなります。

于 2014-01-16T13:44:42.407 に答える