創造する JUnit テストスイートと例: @RunWith @SuiteClasses

⚡ スマートサマリー

JUnit テストスイートは、複数のクラスのテストケースを集約し、@RunWith(Suite.class) および @SuiteClasses アノテーションによって駆動され、通常のテストランナークラスを介して起動され、単一のパスでまとめて実行されます。

  • 🔘 目的: 複数のクラスのテストを、各テストクラスを個別に起動するのではなく、1つの実行可能な単位にグループ化します。
  • ☑️ 注釈: @RunWith(Suite.class) は実行を委譲し、@SuiteClasses はスイートが実行する必要のあるすべてのクラスをリストします。
  • ステップ: テストクラスを記述し、両方の注釈を持つホルダークラスを追加し、 JUnitコアランナー。
  • 🧪 例: JunitTest.javaはSuiteTest1とSuiteTest2をグループ化し、コンソールには3つのテストが合格したと表示されます。
  • 🛠️ JUnit 5: Jupiterは、プラットフォームスイートエンジン上で、ランナーを@Suiteと@SelectClassesまたは@SelectPackagesに置き換えます。
  • 📌 落とし穴: ほとんどのエラーは、空のテストスイート、インポートの欠落、および独自の@Testメソッドを持つテストスイートクラスが原因です。

aを作成する JUnit @RunWithおよび@SuiteClassesアノテーションを使用したテストスイート

In JUnitテストスイートを使用すると、すべてを集約できます テストケース 複数のクラスからデータを1か所に集め、それらをまとめて実行する。

スイートテストを実行するには、以下の注釈を使用してクラスに注釈を付ける必要があります。

  1. @RunWith(Suite.class)
  2. @SuiteClasses(test1.class, test2.class…) または @Suite.SuiteClasses({test1.class, test2.class…})

上記の注釈を付けることで、テストスイート内のすべてのテストクラスが順番に実行されます。スイートクラス自体は空のままで、注釈を格納するだけの役割を果たし、ランナーはそれらの注釈を読み取って実行するテストを決定します。

テスト スイートとテスト ランナーを作成する手順

以下の4つの手順で、実際に実行される最小限のテストスイートを構築します。それは、2つの通常のテストクラス、それらに名前を付けるスイートクラス、そしてメインメソッドからスイートを開始するランナーです。

ステップ1) シンプルなテストクラス (例: MyFirstClassTest) を作成し、アノテーション付きのメソッドを追加します。 @テスト.

最初のクラスには空のテストメソッドが1つだけ含まれており、それだけでテストスイートがそれを検出できることを証明するのに十分です。

MyFirstClassTest クラス Eclipse @Test アノテーション付きの myFirstMethod を宣言します

ステップ2) 追加する別のテストクラス (例: MySecondClassTest) を作成し、@Test アノテーションが付いたメソッドを作成します。

2番目のクラスもまったく同じ形状なので、このスイートには集約する2つの別々のクラスがあります。

MySecondClassTest クラス Eclipse @Test アノテーション付きの mySecondMethod を宣言する

ステップ3) テストスイートを作成するには、まずクラスに @RunWith(Suite.class) と @SuiteClasses(class1.class, class2.class…) のアノテーションを付ける必要があります。

スイートクラス TestSuiteExample は独自のテストメソッドを宣言していないことに注意してください。2 つの注釈にすべての情報が含まれています。

@RunWith(Suite.class) と @SuiteClasses で注釈が付けられた TestSuiteExample に、MyFirstClassTest と MySecondClassTest という名前を付けます。

ステップ4) 以下に示すように、テストスイートを実行するためのテストランナークラスを作成します。

ランナーは平らな Java スイートクラスを渡すメインメソッドを持つクラス JUnitコア:

テストランナークラスの呼び出し JUnitCore.runClassesをTestSuiteExampleで実行し、失敗リストを出力する

Code 説明:

  • Code ライン8: テストクラスで実行されるメインメソッドを宣言します JUnit テスト。
  • Code ライン9: テストケースの実行 JUnitCore.runClasses は、テストクラス名をパラメータとして受け取ります (上記の例では、ステップ 3 で示されている TestSuiteExample.class を使用しています)。
  • Code ライン11: forループを使用して結果を処理し、失敗した結果を出力する。
  • Code ライン13: 成功した結果を出力します。

出力: 以下は、テストが失敗なく成功したことを示す出力です。 traceは以下に示すとおりです。

Eclipse JUnit レポートを表示 テストスイート例で2/2実行、エラーなし、失敗なし

緑色のバーは、スイートの目的を示しています。つまり、1回の起動、1回の結果表示、そして2つのクラスが別々の実行ではなく、スイートノードの下に報告されるということです。

JUnit テストスイートの例

スイート内のクラスが実際には アサート 空のメソッドを保持する代わりに、何か別のものを使用する。

java のテスト

JunitTest.java は、 @RunWith (NAIST) と @スイート アノテーション。以下に示すように、スイート内の任意の数のクラスをパラメータとして指定できます。

package guru99.junit;		
import org.junit.runner.RunWith;		
import org.junit.runners.Suite;		

@RunWith(Suite.class)				
@Suite.SuiteClasses({				
  SuiteTest1.class,
  SuiteTest2.class,  			
})		

public class JunitTest {				
			// This class remains empty, it is used only as a holder for the above annotations		
}

SuiteTest1.java

SuiteTest1.java これは、以下に示すメッセージを出力するテストメソッドを持つテストクラスです。このクラスは、上記のクラスのスイートメンバーとして使用されます。これは、という名前のヘルパークラスに依存しています。 JUnitこのメッセージは、同じパッケージ内の別の場所で定義されているため、ここでは再掲しません。

package guru99.junit;		

import static org.junit.Assert.assertEquals;				

import org.junit.Test;		

public class SuiteTest1 {				

    public String message = "Saurabh";							

    JUnitMessage junitMessage = new JUnitMessage(message);							

    @Test(expected = ArithmeticException.class)					
    public void testJUnitMessage() {					

        System.out.println("Junit Message is printing ");					
        junitMessage.printMessage();			

    }		

    @Test		
    public void testJUnitHiMessage() {					
        message = "Hi!" + message;							
        System.out.println("Junit Hi Message is printing ");					
        assertEquals(message, junitMessage.printHiMessage());					
        System.out.println("Suite Test 2 is successful " + message);							
    }		
}		

SuiteTest2.java

SuiteTest2.java は、別のテストクラスで、 SuiteTest1.java以下のメッセージを出力するテストメソッドがあります。このクラスはスイートメンバーとして使用します。 java のテスト.

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Test;		

public class SuiteTest2 {				
   	

    @Test		
    public void createAndSetName() {					
        		

        String expected = "Y";					
        String actual = "Y";					

        Assert.assertEquals(expected, actual);					
        System.out.println("Suite Test 1 is successful " + actual);							
    }		

}		

出力

実行後 ジュニットテスト.java には、 SuiteTest1.java (NAIST) と SuiteTest2.javaすると、以下の出力が得られます。コンソールには、両方のクラスによって生成されたメッセージが表示されます。

Eclipse JUnitTestの終了後に、両方のスイートクラスから出力されたメッセージを表示するコンソール

その JUnit ビューレコードは、スイートクラスの下にグループ化された3つの合格テストメソッドとして同じ実行を記録します。

Eclipse JUnit レポートを表示 JUnitTest で SuiteTest1 と SuiteTest2 を展開して 3/3 グリーンを実行

注意: この例ではコンソールラベルが重なっています。SuiteTest1 で出力された文字列は「Suite Test 2」、SuiteTest2 で出力された文字列は「Suite Test 1」となっています。元のリストは変更されずに再現されているため、ラベルは作成者が書いたとおりになっています。クラス名を読み取ります。 JUnit 出力とソースを照合する際には、印刷されたラベルではなくビューを使用してください。

テストスイートの作成方法 JUnit 5

JUnit 5 ではランナーが完全に削除されたため、org.junit.jupiter パッケージには @RunWith(Suite.class) は存在しません。Suite は JUnit プラットフォームは、それらを別のアーティファクトとして出荷します。 JUnitプラットフォームスイートエンジンその依存関係を追加し、クラスに@Suiteとセレクターアノテーションのいずれかを付加します。

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

@Suite
@SuiteDisplayName("Guru99 suite")
@SelectClasses({ SuiteTest1.class, SuiteTest2.class })
public class JunitTest {
    // Empty holder, exactly as in JUnit 4
}

セレクター注釈は、単一の@SuiteClassesリストを、いくつかのオプションからなる小さなファミリーに置き換えます。

アノテーション 選択するもの
@SelectClasss 個々のテストクラスを一つずつ指定することで、@SuiteClasses の直接的な代替として使用できます。
@SelectPackages 指定されたパッケージおよびそのすべてのサブパッケージ内のすべてのテストクラス。
@IncludeClassNamePatterns 選択範囲の上に正規表現フィルターを適用します。
@SuiteDisplayName レポートには、クラス名の代わりに読みやすい名前が表示されます。

実際には、さらに2つの違いが重要となる。 JUnit 5 スイートクラスは、スイート全体を一周して一度実行される @BeforeSuite および @AfterSuite メソッドを宣言できます。 JUnit 上記の4つの例はまだ実行されます JUnit このプラットフォームはビンテージエンジンを使用しているため、このページの元のコードを書き直す必要はありません。

の利点と制限 JUnit テストスイート

スイートとは、ping メカニズムではなく テストフレームワーク それは独自の特性を持っており、それが得意な点と、役に立たなくなる点の両方を決定づける。

優位性

  • 1 つの起動で関連するクラスが一緒に実行されるので、煙のセットまたは 回帰 setは単一のコマンドで起動します。
  • 結果ビューでは、すべてのクラスが1つのスイートノードの下にグループ化されるため、共通の障害を容易に特定できます。
  • 会員リストはコード内に存在するため、他のソースファイルと同様にレビューおよびバージョン管理が行われます。
  • 同じスイートクラスは、IDE、ランナーなどから起動できます。 JUnitCore、またはビルドツールから。

製品制限

  • @SuiteClasses はハードコードされたリストなので、誰かがスイートを編集するまで、新しいテストクラスは黙って除外されます。
  • このスイートでは、クラスが一覧表示されている順序以外に、順序に関する保証は一切ありません。
  • メンバークラス間で共有されるものは何もないため、スイートはフィクスチャや基底クラスの代わりとなるものではありません。
  • ビルドツールは既に命名規則に基づいてテストクラスを検出するため、多くのプロジェクトではテストスイートは不要となる。

作成時のよくあるエラー JUnit テストスイート

ほとんどのスイートの問題は、短くて役に立たないメッセージを表示します。この表は、遭遇する可能性のあるメッセージとその原因、そして解決策を示しています。

メッセージまたは症状 原因となる 修正する
初期化エラー: 実行可能なメソッドがありません このクラスは通常のテストクラスとして実行されますが、アノテーションのみを保持します。 @RunWith(Suite.class) を追加すると、デフォルトのランナーではなくスイートランナーが実行されます。
シンボルが見つかりません: クラス Suite Suiteのインポートが見つかりません。 org.junit.runner.RunWith と共に org.junit.runners.Suite をインポートします。
スイートは実行されるが、1つのクラスがスキップされる そのクラスは@SuiteClassesリストに追加されませんでした。 クラスを明示的に追加するか、@SelectPackages に移動してください。 JUnit 5.
コンパイラはクラス名を受け付けません @Runwith または @suiteClasses の文字の大文字小文字が間違っています。 Java アノテーションは大文字と小文字を区別します。@RunWith と @SuiteClasses は正確に記述してください。
スイートクラス自体のテストは実行されません スイートホルダーに@Testメソッドが追加されました。 ホルダーは空のままにして、テストメソッドをメンバクラスに移動してください。

組曲を一度書いて、ping 正確さが本当の仕事です。リストがディスク上のクラスからずれると、スイートは緑色で報告しますが、 単体テスト set は全く実行されず、最も静かな障害モードの 1 つです。 ソフトウェアテスト.

よくあるご質問

このスイートはリストされている順序でクラスを実行しますが、 JUnit 各クラス内のメソッドの実行順序については保証されません。前のテストの実行に依存するテストは脆弱であるため、単独で動作するように書き直す必要があります。

はい。ランナーから見ると、スイートクラスは通常のクラスとして扱われるため、別の@SuiteClassesリスト内でそのクラス名を指定すると、スイートがネストされます。ネストは、より小さなモジュールスイートから構築されたトップレベルの回帰テストスイートに役立ちます。

AIアシスタントはディスク上のテストクラスを読み込み、@SuiteClassesリストと比較して、追加されなかったクラスにフラグを立てます。また、繰り返し発生するエラーをクラスタリングします。 trac根本原因に基づいてトリアージを行うことで、スイートが一度に多数の赤信号を報告した後のトリアージ時間を短縮できます。

副操縦士 注釈ペアを素早く書き込むが、頻繁に混在する JUnit 4本、そして JUnit 同じファイル内に5つのインポートがあります。org.junit.runners.Suiteとorg.junit.platform.suite.api.Suiteが同時に出現しないようにしてください。ランナーに一致するのはどちらか一方のみです。

テストスコープに junit-platform-suite-engine を追加してください。@Suite および @SelectClasses アノテーションは junit-platform-suite-api に含まれており、このエンジンアーティファクトは推移的にそれを取り込むため、通常は単一の依存関係で十分です。

通常はそうではありません。Surefireと Gradle テストタスクは、命名パターンに基づいてテストクラスを検出し、それらをすべて実行します。テストスイートを作成するのは、完全な実行よりも小さい、名前付きのサブセット(例えば、スモークテストセットなど)が必要な場合に有効です。

ランナーは、そのメンバーに対して初期化エラーを報告し、実行可能なメソッドが見つからなかったと表示し、スイート全体が失敗とマークされます。エントリを削除するか、クラスに@Testメソッドを追加してください。

1 つのセレクター リスト内にはありません。 JUnit ビンテージエンジンの4つのクラスから選択し、 JUnit パッケージごとに5つのスイートが用意されているため、両方のエンジンは同じ条件下で動作します。 JUnit アノテーションファミリーを混在させずにプラットフォームをローンチします。