junit test suite filtering test cases
このチュートリアルでは、JUnitテストスイートとは何か、テストスイートを作成する方法、およびJUnit4とJUnit5でテストケースをフィルタリングする方法について説明します。
前のチュートリアルで、実行中に特定のテストケースをスキップする方法について学習しました。また、JUnit4とJUnit5で使用されるさまざまなアノテーションについても学びました。
このチュートリアルでは、次のことを学習します。
- テストスイートとは何ですか?
- 複数のテストケースをグループにまとめ、JUnitCoreクラスを使用してスイートを実行することにより、テストスイートを作成するにはどうすればよいですか?
=> 独占的なJUnitトレーニングチュートリアルシリーズについては、こちらをご覧ください。
学習内容:
JUnitテストスイート
JUnit 4:@ RunWith、@ SuiteClassesアノテーション
チュートリアル JUnitテストを実行する複数の方法 でテストスイートを作成する方法を示しました JUnit4。
注釈 @RunWith そして @SuiteClasses 複数のJUnitテストクラスをグループ化することで、テストスイートの作成に役立ちました。続いて、クラスJUnitCore.runclasses()を持つランナーファイルが、作成されたテストスイートの実行を呼び出しました。
ワークフローの詳細と実際のコードについては、前述のセクションを参照してください。 JUnit4。
JUnit 5:@ RunWith、@ SelectClasses、@ SelectPackagesアノテーション
でのテストスイートの作成 JUnit 5 JUnit 4にあるものと非常に似ています。では、違いはどこにあるのでしょうか。
#1) に JUnit 4 、テストスイートの作成をサポートするために@RunWithアノテーションにパラメーターとして渡されるSuite.classがあります。 JUnit 5 同じ@RunWithアノテーションを使用しますが、入力パラメーターは JUnitPlatform.class の代わりに Suite.class 。
したがって、JUnit5のコード行は次のようになります。 @ RunWith(JUnitPlatform.class)。 これは、サブプロジェクトJUnitプラットフォームにパッケージ化されているアノテーションです。
#二) に JUnit 4 、 を使用しております @SuiteClasses 中にコンマで区切られた複数のJUnitクラスをグループ化する JUnit 5 我々は持っています:
- 注釈 @SelectClasses それはと同等です @SuiteClasses JUnit 4で、複数のJUnitクラスをグループ化します。
- @SelectPackages アノテーションは、パッケージから複数のテストをグループ化するために使用されます。含めるパッケージを表す文字列配列値を入力する必要があります。
したがって、言い換えれば、
- 単一のパッケージからテストケースをグループ化したい場合は、JUnit5でそれを行うことができます。
- または、複数のパッケージからテストケースをグループ化したい場合は、JUnit5もそれをサポートします。ここで覚えておくべき注意は、言及されたパッケージのすべてのサブパッケージの下のテストもデフォルトでテストスイートに含まれるということです。
JUnit 5:さまざまなシナリオ/例
複数のテストクラスをグループ化するテストスイートの作成
コードのスニペットを以下に示します。
@RunWith(JUnitPlatform.class) @SelectClasses({JUnit5TestCase1.class, JUnit5TestCase2.class }) public class JUnitTestSuite { }
単一パッケージのテストスイートの作成
コードのスニペットを以下に示します。
@RunWith(JUnitPlatform.class) @SelectPackages({“ demo.tests “}) public class JUnit5TestSuite { }
注意 :
- いう demo.tests パッケージにはサブパッケージがあります demo.tests.subtests。
- コード @SelectPackages({“ demo.tests“}) サブパッケージの下のすべてのテストもテストスイートに含まれます。デフォルトでは。
- あなたが述べていた場合 @SelectPackages({“ demo.tests.subtests“}) 、サブパッケージの下のテストケース demo.tests.subtests 親パッケージからのテストに対して、テストスイートにのみ含まれます。 demo.tests 含まれません。
複数のパッケージ用のテストスイートの作成
のテストスイートを作成するためのコードスニペット 複数のパッケージ JUnit 5ではコンマで区切られています–以下のようになります。
@RunWith(JUnitPlatform.class) @SelectPackages({“demo.tests”, “demo1.tests”, “demo2.tests”}) public class JUnit5TestSuite { }
フィルタリングテストスイート– JUnit4とJUnit5
場合によっては、テストケースを除外し、必要に応じて特定のテストセットを実行する必要があります。たとえば、回帰テスト用に識別された一連のテスト、単体テスト用の別のセット、およびスモークテスト用の別のテストケースのセットが存在する可能性があります。
特定のパッケージ、クラス、またはカテゴリからテストケースを除外または含める必要があります。 JUnit4の唯一のオプションは、単一のパッケージからテストを除外またはタグ付けすることです。
JUnit 4と比較すると、JUnit 5には、要件の変化に応じて、単一のパッケージまたは複数のパッケージとサブパッケージからテストケースをフィルタリングするというこのニーズをサポートする優れた機能セットが付属しています。
JUnit 4 – @ Category、@ IncludeCategory、@ ExcludeCategory
JUnit 4のテストケースは、さまざまなカテゴリに分類できます。これらのカテゴリは、テストスイートの実行中に除外または含めることができます。注釈 @ Category、@ IncludeCategory、および@ ExcludeCategory JUnit4.12以降でサポートされています。
1つまたは複数のカテゴリに基づいてフィルタを作成するための高レベルの手順は次のとおりです。
#1) カテゴリで役割を果たすマーカーインターフェイスを作成します。
#二) SuiteClassesに含まれるクラスのテストメソッドに注釈を付けます @カテゴリー とカテゴリ名。
#3) テストスイートファイルで、アノテーションを使用します @IncludeCategory 特定のカテゴリに属するテストを含めるためのカテゴリ名。
#4) テストスイートファイルで、アノテーションを使用します @ExcludeCategory それらを除外するためのカテゴリ名を使用します。
#5) @Categoryアノテーションは、テストレベルまたはクラスレベルでも使用できます。注釈がテストレベルで適用される場合、その特定のテストは指定されたカテゴリでタグ付けされますが、注釈がクラスレベルである場合、クラス内のすべてのテストは指定されたカテゴリにタグ付けされます。
テストを分類し、実行のためにフィルターで除外する実際の実装を理解するために、さらに詳細を見てみましょう。
ステップ1:
の作成から始めます マーカーインターフェース それはの役割を果たします テストメソッドのカテゴリ。 ここでは、という名前のカテゴリを作成します 単体テスト 。コードは非常に単純です。以下のコードを参照してください。
UnitTest.javaのコード
package demo.tests; public interface UnitTest {}
ステップ2:
カテゴリをマークします 試験方法レベル クラスで JUnitTestCase1.java 。テストケースjunitMethod1()をカテゴリUnitTestに追加するには、テストメソッドに注釈を付ける必要があります。 @Category(UnitTest.class) 。
これにより、テストメソッドがUnitTestカテゴリに追加されます。他のテストメソッド(存在する場合)は、メソッドにカテゴリの注釈が付けられていない限り、カテゴリにタグ付けされません。
コードで@Categoryアノテーションを機能させるには、パッケージをインポートする必要があります org.junit.experimental.categories.Category
JUnitTestCase1.javaのコードスニペット:
@Category(UnitTest.class) @Test public void junitMethod1(){ int Value2=9000; Assert. assertEquals (Value1, Value2); }
あるいは、テストメソッドも複数のカテゴリに属することができます 例えば。 : @Category(UnitTest.class、SmokeTest.class)
ステップ3:
私は今、カテゴリをマークします クラスレベルで クラスで JUnitTestCase2.java 。前のステップでテストメソッドレベルで追加されたものと同じステートメントが、現在のクラスファイルにも追加されます。
ここでは、クラスレベルでステートメントを追加することに注意してください。これを行うと、ファイル内のすべてのテストメソッドがに属します 単体テスト カテゴリー。
JUnitTestCase2.javaのコードスニペット:
@Category(UnitTest.class) @Test public class JUnitTestCase2 { public String stringValue='JUnit';
ステップ4:
htmlとcssの面接の質問と回答
必要なテストケースがUnitTestカテゴリに分類されたので、カテゴリに基づいて除外することにより、テストスイートに追加する方法を説明します。で特定のコード変更を行います JUnitTestSuite.class これを実証するために。
- Categorys.class @RunWithアノテーションにパラメーターとして渡されます。
- @ Suite.SuiteClassesは、テストクラスの文字列配列を取得します。
- 注釈 @ Categories.IncludeCategory パラメータとしてUnitTest.classが必要になります。
- このステートメントは、スイート全体をフィルタリングし、カテゴリに属するスイートのテストケースのみを実行するのに役立ちます。
- Categorys.classにはパッケージが必要です org.junit.experimental.categories.Categories インポートされます。
JunitTestSuite.javaのコードスニペット
@RunWith(Categories.class) @Categories.IncludeCategory(UnitTest.class) @Suite.SuiteClasses({JUnitTestCase1.class, JUnitTestCase2.class}) public class JUnitTestSuite {
注釈 @ Categories.IncludeCategory 次のように書くこともできます @IncludeCategory。 複数のインターフェイス(カテゴリ)を作成し、コンマで区切られた複数のカテゴリでクラス/テストメソッドに注釈を付けることもできます。以下の例では、カテゴリ–カテゴリ1およびカテゴリ2に属するテストを除外します。
例: @IncludeCategory({Category1.class、Category2.class})
同様のルールが @ Categorys.ExcludeCategory / @ExcludeCategory テスト実行中に、1つまたは複数のカテゴリの下のテストメソッドを除外します。
JUnit 5 – @ IncludeTags、@ ExcludeTags、@ IncludePackages、@ ExcludePackages、@ IncludeClassNamePatterns、@ ExcludeClassNamePatterns
JUnit 5には、テストケースを整理および除外するための複数のアプローチがパッケージ化されています。
JUnit 5 – @ IncludeTags、@ ExcludeTags
#1) JUnit 4と同様に、実行用のテストケースのフィルタリングをサポートするために@IncludeCategoryアノテーションと@ExcludeCategoryアノテーションがあります。
#二) JUnit 5には、同じ目的を達成するために@IncludeTagsアノテーションと@ExcludeTagsアノテーションがあります。
#3) JUnit 4は、特定のカテゴリに編成されるテストケースを指し、JUnit 5は、テストケースを特定のタグでタグ付けして、実行のためにテストケースをフィルタリングできるようにすることを指します。
タグに基づいてフィルターを作成するための高レベルの手順は次のとおりです。
- @SelectPackagesに含まれるパッケージのテストメソッドに注釈を付けます @鬼ごっこ およびユーザー定義のタグ名。 1つのクラスに、テストメソッドごとに異なるタグを付けることができます。
- クラスレベルで@Tagに注釈を付けて、クラス内のすべてのテストにタグを付けることもできます。
- テストスイートファイルで、アノテーションを使用します @IncludeTags 特定のタグに属するテストを含めるためのタグ名。
- テストスイートファイルで、アノテーションを使用します @ExcludeTags テストスイートからそれらを除外するためのタグ名を使用します。
ここで、JUnit5でフィルタリングを実際に実装する方法について詳しく説明します。
ステップ1 :JUnit5TestCase1.javaのテストメソッドをタグ名「Regression」にタグ付けしています
JUnit5TestCase1.javaのコードスニペット:
@Tag(“Regression”) @Test public void junitMethod1(){
ステップ2 :JUnit5TestCase2.javaのテストメソッドをタグ名「SmokeTest」にタグ付けしています。
JUnit5TestCase2.javaのコードスニペット:
@Tag(“SmokeTest”) @Test public void junitMethod2(){
ステップ3: テストメソッドにタグが付けられたので、JUnit5TestSuite.javaを更新して、テスト用のタグによる適切なフィルターを追加します。以下のコードには、「Regression」としてタグ付けされたすべてのテストが含まれ、「SmokeTest」としてタグ付けされたすべてのテストが除外されています。
JUnit5TestSuite.javaのコードスニペット:
@RunWith(JUnitPlatform.class) @SelectPackages({“demo.tests“}) @IncludeTags(“Regression”) @ExcludeTags(“SmokeTest”) public class JUnit5TestSuite { }
JUnit 5 – @ IncludePackages、@ ExcludePackages
パッケージ名を渡すと、 @SelectPackages アノテーション、パッケージのサブパッケージ内のテストもテストスイートに追加されます。
テストスイートに含めたい特定のサブパッケージと、スイートに含めたくない、または関連性のないサブパッケージがいくつかある可能性があります。
これは注釈によって容易になります @IncludePackagesおよび@ExcludePackages JUnit5で。
3つのサブパッケージ(subpackage1、subpackage2、subpackage 3)があり、以下の各パッケージにテストクラスがあるパッケージ「demo.tests」があるとします。
JUnit5TestSuite.javaのコードスニペットを見て、パッケージを含めたり除外したりする方法を視覚化してみましょう。
シナリオ#1: フィルタを適用して、subpackage1のテストケースのみを含めます。
以下のコードには、パッケージdemo.tests.subpackage1内のすべてのJUnitクラスからのすべてのテストが含まれていますが、パッケージdemo.testの直下、およびパッケージsubpackage2とsubpackage3の下のすべてのテストは除外されています。
JUnit5TestSuite.javaのコードスニペット:
@RunWith(JUnitPlatform.class) @SelectPackages({“demo.tests“}) @IncludePackages(“demo.tests.subpackage1”) public class JUnit5TestSuite { }
シナリオ#2: フィルタを適用して、パッケージsubpackage3からのみテストケースを除外します。
以下のコードは、パッケージ内のJUnitクラスからすべてのテストを除外します– demo.tests.subpackage3ただし、スイートには、パッケージdemo.testの直下、およびパッケージsubpackage1とsubpackage2の下のすべてのテストが含まれます。
JUnit5TestSuite.javaのコードスニペット:
@RunWith(JUnitPlatform.class) @SelectPackages({“demo.tests“}) @ExcludePackages(“demo.tests.subpackage3”) public class JUnit5TestSuite { }
JUnit 5 – @ IncludeClassNamePatterns、@ ExcludeClassNamePatterns
特定の正規表現に一致する特定のクラスをパッケージに含めたり除外したりする場合は、アノテーション @ IncludeClassNamePatterns そして @ ExcludeClassnamePatterns テストスイートクラスファイルで使用できます。
ここで、コードの更新を通じて図を見てみましょう。 JUnit5TestSuite.java
シナリオ#1:
以下のコードには、パッケージdemo.testsの「Ctests」で終わるクラスが含まれています。
@RunWith(JUnitPlatform.class) @SelectPackages({“demo.tests“}) @IncludeClassNamePatterns({'^.*CTests?$'})
シナリオ#2:
ここで、次のようなクラスを除外します。 開始する パッケージdemo.testsの「STest」を使用
@RunWith(JUnitPlatform.class) @SelectPackages({“demo.tests“}) @ExcludeClassNamePatterns({'^STest.*$'})
シナリオ#3:
複数の正規表現をフィルター基準として渡すこともできます。以下のコードは、 ‘で区切られた2つの異なる正規表現を示しています。 または 」演算子。スリットバー|ここではOR演算子です。
デュアルWANワイヤレスルーターの負荷分散
コードはクラスを除外します 開始 と テスト (( テスト。*) または エンディング と テスト(*。テスト?) アノテーション@IncludeClassNamePatternsが使用されるため、これらのクラスがテストスイートに含まれます。
注意: 完全修飾クラス名が少なくとも1つのパターンと一致する場合、クラスは@IncludeClassNamePatternsまたは@ExcludeClassNamePatternsアノテーションに従ってフェッチされます。
@RunWith(JUnitPlatform.class)
@SelectPackages({“ demo.tests“})
@IncludeClassNamePatterns(。*テスト?)$”)
JUnitフィルタリングテストケースに関するFAQ
これは、かなり長い間あなたの心に残っていたかもしれない質問です。
Q#1)テストを無効化/無視することと、テストを除外することの違いは何ですか?どちらの機能も、実行中にテストケースをスキップするという同じ目的を果たすのに役立ちませんか?
回答:質問は確かに本物であり、答える価値があります。
- フィルターアウトテスト機能を使用すると、除外するだけでなく、 含める タグ付けされたカテゴリに応じてテストします。一方、無効にすると、実行するテストを除外するか含めないかを決定できます。
- テストケースを除外することは、条件付きでテストケースをスキップする一種ですが、無視されたテストの場合、条件なしでスキップされます。
- 2つの大きな違いは、@ Ignoreまたは@Disabledのアノテーションが付けられたテストでテストケースを実行すると、無視されたテストがテスト結果の スキップ カウント
- フィルターで除外されたテストを実行すると、テスト結果にはまったく表示されません。
結論
このチュートリアルでは、テストにカテゴリ/タグを追加してテストを除外する方法を学習しました。
JUnit 4では、テストケースをフィルタリングするための@ Category、@ IncludeCategory、および@ExcludeCategoryがあり、JUnit5には同じことを行うための@IncludeTagsと@ExcludeTagsがあることを学びました。
さらに、JUnit 5には、アノテーション@ IncludePackages、@ ExcludePackagesを使用する追加のフィルタリングオプションと、クラス名パターンを使用してクラスを含めるまたは除外するアノテーションがあります。探求すればするほど。まだまだ探求すべきことがたくさんあることを私たちは理解しています。
=> ここで簡単なJUnitトレーニングシリーズに注意してください。