創造する JUnit テストスイートと例: @RunWith @SuiteClasses
⚡ スマートサマリー
JUnit テストスイートは、複数のクラスのテストケースを集約し、@RunWith(Suite.class) および @SuiteClasses アノテーションによって駆動され、通常のテストランナークラスを介して起動され、単一のパスでまとめて実行されます。
In JUnitテストスイートを使用すると、すべてを集約できます テストケース 複数のクラスからデータを1か所に集め、それらをまとめて実行する。
スイートテストを実行するには、以下の注釈を使用してクラスに注釈を付ける必要があります。
- @RunWith(Suite.class)
- @SuiteClasses(test1.class, test2.class…) または @Suite.SuiteClasses({test1.class, test2.class…})
上記の注釈を付けることで、テストスイート内のすべてのテストクラスが順番に実行されます。スイートクラス自体は空のままで、注釈を格納するだけの役割を果たし、ランナーはそれらの注釈を読み取って実行するテストを決定します。
テスト スイートとテスト ランナーを作成する手順
以下の4つの手順で、実際に実行される最小限のテストスイートを構築します。それは、2つの通常のテストクラス、それらに名前を付けるスイートクラス、そしてメインメソッドからスイートを開始するランナーです。
ステップ1) シンプルなテストクラス (例: MyFirstClassTest) を作成し、アノテーション付きのメソッドを追加します。 @テスト.
最初のクラスには空のテストメソッドが1つだけ含まれており、それだけでテストスイートがそれを検出できることを証明するのに十分です。
ステップ2) 追加する別のテストクラス (例: MySecondClassTest) を作成し、@Test アノテーションが付いたメソッドを作成します。
2番目のクラスもまったく同じ形状なので、このスイートには集約する2つの別々のクラスがあります。
ステップ3) テストスイートを作成するには、まずクラスに @RunWith(Suite.class) と @SuiteClasses(class1.class, class2.class…) のアノテーションを付ける必要があります。
スイートクラス TestSuiteExample は独自のテストメソッドを宣言していないことに注意してください。2 つの注釈にすべての情報が含まれています。
ステップ4) 以下に示すように、テストスイートを実行するためのテストランナークラスを作成します。
ランナーは平らな Java スイートクラスを渡すメインメソッドを持つクラス JUnitコア:
Code 説明:
- Code ライン8: テストクラスで実行されるメインメソッドを宣言します JUnit テスト。
- Code ライン9: テストケースの実行 JUnitCore.runClasses は、テストクラス名をパラメータとして受け取ります (上記の例では、ステップ 3 で示されている TestSuiteExample.class を使用しています)。
- Code ライン11: forループを使用して結果を処理し、失敗した結果を出力する。
- Code ライン13: 成功した結果を出力します。
出力: 以下は、テストが失敗なく成功したことを示す出力です。 traceは以下に示すとおりです。
緑色のバーは、スイートの目的を示しています。つまり、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すると、以下の出力が得られます。コンソールには、両方のクラスによって生成されたメッセージが表示されます。
その JUnit ビューレコードは、スイートクラスの下にグループ化された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 つです。 ソフトウェアテスト.







