OK、それで@Ignore
アノテーションはテストケースを実行してはならないことを示すのに適しています。
ただし、ランタイム情報に基づいたテストを無視したい場合があります。一例として、一定数のコアを持つマシンで実行する必要がある同時実行性テストがある場合があります。このテストがユニプロセッサマシンで実行された場合、(テストが実行されていないので)テストに合格するだけで正しいとは思わず、テストに失敗してビルドを中断することは間違いありません。
だから、これは正しい結果のように思えるので、実行時にテストを無視できるようにしたいです(テストフレームワークではビルドはパスできますが、テストは実行されなかったことを記録するため)。注釈によってこの柔軟性が得られないことは十分に確信しており、問題のクラスのテストスイートを手動で作成する必要があると思われます。ただし、ドキュメントではこれについて何も言及されておらず、 API を調べると、これがプログラムでどのように行われるかが明確ではありません(つまり、Test
または類似の@Ignore
アノテーションで作成されたものと同等ですか?)。
誰かが過去に似たようなことをしたことがある、または私がこれについて他にどのようにすればよいかについて明るい考えを持っているなら、私はそれについて聞いてうれしいです。
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()
メソッドからの接続をこの方法でキャプチャして使用する方がはるかに簡単であることは言うまでもありません。
Junit-ext
プロジェクトをチェックアウトする必要があります。以下のような条件付きテストを実行するRunIf
注釈があります。
@Test
@RunIf(DatabaseIsConnected.class)
public void calculateTotalSalary() {
//your code there
}
class DatabaseIsConnected implements Checker {
public boolean satisify() {
return Database.connect() != null;
}
}
[チュートリアルから取得したコードサンプル]
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 */
}
}