12

簡単な背景: ここ数日、Maven / Surefire のテスト実行中の問題を探し続けてきました。テストの疑いのある少数に絞り込みました。私が見ている動作は正気ではありません。私はmvn clean test: 250 のテストを実行し、0 をスキップしました。ここで、疑わしいテストを に移動してsrc/test/java再試行します: 146 個のテストが実行され、0 個がスキップされました! Maven の出力には、フラグ を使用しても、他のテストが実行されていないという手がかりはありません。-X

私がこのテストを「疑わしい」と呼ぶ理由は、クラス全体が @Ignore で装飾されているためです。そのため、テスト ソースにそれを含めてもまったく効果がないはずです。そこでふと思いついたのですが、これらのクラスには、ダミーの Zookeeper サーバーを管理する @BeforeClass/@AfterClass メソッドが あります。以前はおかしな動作になっていたため、@Ignored テストを使用しています。

JUnit が前/後のコードを実行しているが、テストを無視している場合、何が起こるかわかりません (しかし、それはおそらく非常に悪いことです)。これは起こっていますか?これは起こるはずですか?もしそうなら、@BeforeClass / @AfterClass が含まれている場合、「参照用に、動作するはずだが修正が必要なテストがあります」と言うにはどうすればよいですか? また、非常に興味深いのは、これが Surefire / Maven に何をしているのか、無関係なテストが地球の表面から落ちてしまうことです。

4

2 に答える 2

19

@Ignore アノテーションを使用したテストがある場合、すべてのテストが @Ignore であるかどうかに関係なく、@BeforeClass および @AfterClass が実行されるのは正常な動作です。

ただし、クラスに @Ignore アノテーションがある場合、@BeforeClass と @AfterClass は実行されません。

Mavenの場合、特定のクラスでテストを実行したくない場合は、確実またはフェイルセーフでそれらを無視する必要があります。これを Maven 構成に追加します ( Maven Surefire Pluginを参照) 。

<excludes>
 <exclude>**/FoobarTest.class</exclude>
</excludes>
于 2011-09-23T22:48:57.477 に答える
8

環境: JDK 1.6、surefire プラグイン 2.9、jUnit 4.8.1、Maven 3.0、3.0.3、2.2.1。

このテストクラスを作成しました:

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

@Ignore
public class IgnoreTest {

    @BeforeClass
    public static void beforeClass() {
        System.out.println("BEFORE CLASS");
    }

    @AfterClass
    public static void afterClass() {
        System.out.println("AFTER CLASS");
    }

    @Test
    public void test1() throws Exception {
        System.out.println("test1");
    }

    @Test
    public void test2() throws Exception {
        System.out.println("test2");
    }

    @Test
    public void test3() throws Exception {
        System.out.println("test3");
    }
}

次にmvn clean test、これを印刷します。

Running hu.palacsint.stackoverflow.q7535177.IgnoreTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0.015 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 1

あなたが期待したように動作します。を削除して再度@Ignore実行すると、次のように出力されます。mvn clean test

Running hu.palacsint.stackoverflow.q7535177.IgnoreTest
BEFORE CLASS
test2
test1
test3
AFTER CLASS
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.045 sec

Results :

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0

したがって、3 つの異なる Maven バージョンで動作します。いいえ@BeforeClass/はd クラス@AfterClassで実行されました。@Ignore

@BeforeClass/@AfterClassメソッドが@Ignored テスト クラスで実行できる状況が 1 つ (おそらくそれ以上) あります。無視されたクラスに無視されていないサブクラスがある場合です。

import org.junit.Test;

public class IgnoreSubTest extends IgnoreTest {

    @Test
    public void test4() throws Exception {
        System.out.println("test4 subclass");
    }

}

の結果mvn clean test:

Running hu.palacsint.stackoverflow.q7535177.IgnoreTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0.047 sec
Running hu.palacsint.stackoverflow.q7535177.IgnoreSubTest
BEFORE CLASS
test4 subclass
test1
test2
test3
AFTER CLASS
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.057 sec

Results :

Tests run: 5, Failures: 0, Errors: 0, Skipped: 1

この場合、@BeforeClassおよび@AfterClassメソッドはIgnoreSubTestテスト クラスのメソッドであるため実行されます。

于 2011-09-26T18:59:12.397 に答える