2

2つのテストクラスと、いくつかの共通リソースを初期化するスイートがあります。@BeforeClassすべてのクラス(スイートと両方のテストクラス、およびスイートのみ)に注釈が付けられたメソッドがあり@AfterClassます。

Eclipseとは別のテストクラスとしてスーツを実行すると正常に機能しますが、プロジェクト内のすべてのテストを実行しようとすると、順序が無効になります。Eclipseは、何らかの理由で最初にテストを実行しようとし(リソースがまだ初期化されていないため失敗します)、次にスーツ自体を実行しようとします。Mavenも訴訟を無視しているようです。テストを正しい順序で実行し(Suitを最初に)、スイートの外部からこれらのテストを実行しないようにMavenとEclipseを構成するにはどうすればよいですか?

コードの重複の問題ではありません。問題は、急速に連続して初期化および破棄できないリソースにあります。そのため、リソースを1回だけ初期化するスイートが必要です。

ありがとう。

4

2 に答える 2

0

@BeforeClassと@AfterClassを含むコードを各テストクラスに配置します。

テストするクラスが多数ある場合は、テストスイートを抽象化し、treロジックを必要とするすべてのクラスがテストスイートから継承されていることを確認してください。

于 2012-07-25T15:00:07.590 に答える
0

分解を行うためにSuiteを使用すると、さまざまな理由で問題が発生しますが、具体的には、Eclipse(またはMaven)がテストを実行する順序を予測できないという事実があります。より完全な説明については、JUnit4がテストの注文のサポートを開始しましたか?に対する私の回答を参照してください。意図的ですか?、ただし、EclipseとMavenはリフレクション(アノテーション)によってクラスを検索しているため、クラスが検索される順序を保証することはできません。[*mavenとrunOrderを使用できます。以下のポイント3を参照してください]

Eclipse(およびMaven)は、スイートをテストと同じように扱い、同じメカニズムを介して検出および実行され、実行される順序はJVMに大きく依存します。

したがって、スイートA(テストBとCを含む)とテストDがある場合は、次のように実行します(予測できない順序で)。

A (which will execute B & C)
B
C
D

一般に、同じ場所でセットアップ/ティアダウンを実行して、対称性を維持するようにしてください。

したがって、次のオプションがあります。

  1. @ BeforeClass / @ AfterClass(またはより適切な@ ClassRule、ExternalResource)のみを使用し、テストスイートを削除します。各テストクラスのセットアップを行っているため、これが最もクリーンなオプションです。
  2. Eclipseからのみテストスイートを実行し、Maven Surefire Includes/Excludesを使用してMavenで同じことを行います。テストスイートのみを実行する場合は、各クラスではなくスイートでセットアップを行う方がよいことに注意してください。ただし、これにより、Eclipseからテストを1つだけ実行すると問題が発生します。
  3. 特定の順序でテストを実行します。これはEclipseでは実行できませんが、Mavenでは実行できます 。surefire:testrunOrderを参照してください。いくつかの命名規則が必要になります。
  4. TestNGを使用します。これは、クラスの順序付けを明示的にサポートし、実行するクラスのリストを使用してセットアップする方がおそらく簡単ですが、セットアップ/ティアダウンでも同じ種類の問題が発生します。
于 2012-07-25T16:16:55.163 に答える