web-dev-qa-db-ja.com

JUnit 4で条件付きでテストを無視する

OK、それで@Ignoreアノテーションはテストケースを実行してはならないことを示すのに適しています。

ただし、ランタイム情報に基づいたテストを無視したい場合があります。一例として、一定数のコアを持つマシンで実行する必要がある同時実行性テストがある場合があります。このテストがユニプロセッサマシンで実行された場合、(テストが実行されていないので)テストに合格するだけで正しいとは思わず、テストに失敗してビルドを中断することは間違いありません。

だから、これは正しい結果のように思えるので、実行時にテストを無視できるようにしたいです(テストフレームワークではビルドはパスできますが、テストは実行されなかったことを記録するため)。注釈によってこの柔軟性が得られないことは十分に確信しており、問題のクラスのテストスイートを手動で作成する必要があると思われます。ただし、ドキュメントではこれについて何も言及されておらず、 API を調べると、これがプログラムでどのように行われるかが明確ではありません(つまり、Testまたは類似の@Ignoreアノテーションで作成されたものと同等ですか?)。

誰かが過去に似たようなことをしたことがある、または私がこれについて他にどのようにすればよいかについて明るい考えを持っているなら、私はそれについて聞いてうれしいです。

329
Andrzej Doyle

JUnitの方法は、実行時にこれを行うことですorg.junit.Assumeです。

 @Before
 public void beforeMethod() {
     org.junit.Assume.assumeTrue(someCondition());
     // rest of setup.
 }

@Beforeメソッドまたはテスト自体で実行できますが、@Afterメソッドでは実行できません。テスト自体で実行すると、@Beforeメソッドが実行されます。クラスの初期化を防ぐために、@BeforeClass内で実行することもできます。

仮定の失敗によりテストは無視されます。

編集:junit-ext@RunIf注釈と比較すると、サンプルコードは次のようになります。

@Test
public void calculateTotalSalary() {
    assumeThat(Database.connect(), is(notNull()));
    //test code below.
}

Database.connect()メソッドからの接続をこの方法でキャプチャして使用する方がはるかに簡単であることは言うまでもありません。

425
Yishai

Junit-ext プロジェクトをチェックアウトする必要があります。以下のような条件付きテストを実行するRunIf注釈があります。

@Test
@RunIf(DatabaseIsConnected.class)
public void calculateTotalSalary() {
    //your code there
}

class DatabaseIsConnected implements Checker {
   public boolean satisify() {
        return Database.connect() != null;
   }
}

[チュートリアルから取得したコードサンプル]

46
notnoop

JUnit 4では、テストがカスタム基準を満たす必要があることを示す注釈を作成し、独自のリフレクションを使用してデフォルトのランナーを拡張し、カスタム基準に基づいて決定することもできます。次のようになります。

public class CustomRunner extends BlockJUnit4ClassRunner {
    public CTRunner(Class<?> klass) throws initializationError {
        super(klass);
    }

    @Override
    protected boolean isIgnored(FrameworkMethod child) {
        if(shouldIgnore()) {
            return true;
        }
        return super.isIgnored(child);
    }

    private boolean shouldIgnore(class) {
        /* some custom criteria */
    }
}
7
Kyle Shrader