JUnit の適切な使用方法 (または少なくともドキュメント) が非常にわかりにくいと感じています。この質問は、将来の参考資料としてだけでなく、実際の質問としても役立ちます。
私が正しく理解していれば、JUnit テストを作成して実行するには主に 2 つの方法があります。
アプローチ A (JUnit 3 スタイル):TestCase を拡張するクラスを作成し、テスト メソッドを という単語で開始しますtest
。クラスを JUnit テストとして実行すると (Eclipse で)、 という単語で始まるすべてのメソッドtest
が自動的に実行されます。
import junit.framework.TestCase;
public class DummyTestA extends TestCase {
public void testSum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
アプローチ B (JUnit 4 スタイル):「通常の」クラスを作成し、@Test
メソッドの先頭にアノテーションを追加します。メソッドを という単語で始める必要はないことに注意してくださいtest
。
import org.junit.*;
import static org.junit.Assert.*;
public class DummyTestB {
@Test
public void Sum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
これら2つを混ぜるのはあまり良い考えではないようです。例えばこのスタックオーバーフローの質問:
さて、私の質問は次のとおりです。
- 好ましいアプローチは何ですか、あるいは、どちらを代わりに使用するのでしょうか?
- アプローチ B では、 のように @Test アノテーションを拡張することで例外をテストできます
@Test(expected = ArithmeticException.class)
。しかし、アプローチ A を使用する場合、例外をどのようにテストするのでしょうか? アプローチ A を使用する場合、次のようにテスト スイート内の複数のテスト クラスをグループ化できます。
TestSuite suite = new TestSuite("All tests");
suite.addTestSuite(DummyTestA.class);
suite.addTestSuite(DummyTestAbis.class);
ただし、これはアプローチ B では使用できません (各テストクラスは TestCase のサブクラスである必要があるため)。アプローチ B のテストをグループ化する適切な方法は何ですか?
編集: 両方のアプローチにJUnitバージョンを追加しました
ベストアンサー1
区別はかなり簡単です:
- 拡張は、
TestCase
JUnit 3 でユニットテストが書かれていた方法です (もちろん、JUnit 4 でもサポートされています) - アノテーションを使用するのは
@Test
JUnit 4で導入された方法です
一般的には、JUnit 3 (および/または Java 5 より前のバージョンの Java) との互換性が必要な場合を除き、アノテーション パスを選択する必要があります。新しい方法には、いくつかの利点があります。
- の
@Test
注釈より明示的であり、ツールでサポートするのが簡単です(たとえば、この方法ですべてのテストを簡単に検索できます) - 複数のメソッドに注釈を付けることができます
@Before
/@BeforeClass
そして@After
/@AfterClass
柔軟性の向上 - へのサポート
@Rule
注釈次のようなことについてExpectedException
- サポート
@Ignored
注釈 - 代替テストランナーのサポート
@RunWith
JUnit 3 で予期される例外をテストするには、TestCase
テキストを明示的にする必要があります。
public void testMyException() {
try {
objectUnderTest.myMethod(EVIL_ARGUMENT);
fail("myMethod did not throw an Exception!");
} catch (MyException e) {
// ok!
// check for properties of exception here, if desired
}
}
JUnit5 についてさらに別のAPI変更が導入されましたが、依然としてアノテーションを使用しています。新しい@Test
アノテーションはorg.junit.jupiter.api.Test
(「古い」JUnit 4 のものはorg.junit.Test
) ですが、JUnit 4 のものとほぼ同じように動作します。