JUnit の混乱: 'extends TestCase' と '@Test' のどちらを使うか? 質問する

JUnit の混乱: 'extends TestCase' と '@Test' のどちらを使うか? 質問する

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つを混ぜるのはあまり良い考えではないようです。例えばこのスタックオーバーフローの質問:

さて、私の質問は次のとおりです。

  1. 好ましいアプローチは何ですか、あるいは、どちらを代わりに使用するのでしょうか?
  2. アプローチ B では、 のように @Test アノテーションを拡張することで例外をテストできます@Test(expected = ArithmeticException.class)しかし、アプローチ A を使用する場合、例外をどのようにテストするのでしょうか?
  3. アプローチ A を使用する場合、次のようにテスト スイート内の複数のテスト クラスをグループ化できます。

    TestSuite suite = new TestSuite("All tests");
    suite.addTestSuite(DummyTestA.class);
    suite.addTestSuite(DummyTestAbis.class);

    ただし、これはアプローチ B では使用できません (各テストクラスは TestCase のサブクラスである必要があるため)。アプローチ B のテストをグループ化する適切な方法は何ですか?

編集: 両方のアプローチにJUnitバージョンを追加しました

ベストアンサー1

区別はかなり簡単です:

  • 拡張は、TestCaseJUnit 3 でユニットテストが書かれていた方法です (もちろん、JUnit 4 でもサポートされています)
  • アノテーションを使用するのは@TestJUnit 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 のものとほぼ同じように動作します。

おすすめ記事