3

皆さん、

定期的に実行する複雑なサブクラス化されたテストスイートがあるとします。その一環として、各テストクラスが厳密に次々に実行され、そのメソッドが実行される前に開始されないようにしTest2ています。これは有効な仮定ですか?@BeforeClassTest1@AfterClass

シナリオ例:

クラスTestBaseには@BeforeClass@AfterClassメソッドがあります。

クラスT1はから派生しTestBaseます。

クラスT2は`TestBaseから派生します。

Ant/Eclipseから一緒に実行T1します。とT2の間で再利用されるTestBaseの一般的な静的オブジェクトがいくつかあります。つまり、同じものを初期化する次の開始ラウンドの前に、これらが完全に破棄されることを完全に確認する必要があります。上記の基本的な使用法でこれを確認できますか?T1T2AfterClassBeforeClass

私はこれが起こっていないことを強く疑っていますが、単純なテストは同じことを証明していません。ドキュメントでもこれについては説明されていません。ですから、他の方法で解決できる体系的な問題を解決しようとしていないことを確認したいと思います。

4

1 に答える 1

2

並列実行を除いて、JUnit は常に 1 つのテスト クラスの後、つまり T1 の前に T2 (またはその逆) を実行する必要があるため、シナリオは機能するはずです。

もう 1 つ注意すべき点は、テストが実行される順序です。これにより、問題が混乱する可能性があります。JUnit4 はテストの注文のサポートを開始しましたか?に対する私の回答を参照してください。意図的なものですか?これは、テストが異なる順序で実行される理由を説明しています。

ClassRuleを使用するのが最善の解決策だと思います。これにより、あなたの振る舞いを実装するクラスを定義することができAfterClassます。BeforeClass例えば:

public class UsesExternalResource {
  public static Server myServer= new Server();

  @ClassRule
  public static ExternalResource resource= new ExternalResource() {
    @Override
    protected void before() throws Throwable {
      myServer.connect();
    };

    @Override
    protected void after() {
      myServer.disconnect();
    };
  };
}

これを使用すると、静的変数を持つ必要がなくなる場合があります。すべての設定を で行うことができるためClassRule、すべてがインスタンス変数になる可能性があります。TestBase親クラスを完全に削除できる場合があります。

于 2012-09-19T06:38:39.437 に答える