junit test execution order
このチュートリアルでは、JUnitテストケースの実行順序を設定する方法について説明します。 JUnit4とJUnit5でJUnitテストの実行順序を設定するためのアノテーションとクラスについて学習します。
前のチュートリアルでは、テストスイートを作成する方法、テストケースにカテゴリまたはタグを追加する方法、およびカテゴリまたはタグに基づいてテストを除外する(テストケースを除外または含める)方法を学習しました。
さらに、JUnit4では次のことがわかりました。 @ Category、@ IncludeCategory、 そして @ExcludeCategory JUnit5が持っている間にテストケースをフィルタリングするため @IncludeTags そして @ExcludeTags 同じことをします。
JUnit 5には、アノテーションを使用した追加のフィルタリングオプションがあります @ IncludePackages、@ ExcludePackages、 また、クラス名パターンを使用してクラスを含めたり除外したりするための注釈。
=> JUnitトレーニングチュートリアルのA〜Zを確認するには、ここをクリックしてください 。
学習内容:
JUnitテストの実行順序
このチュートリアルでは、各テストケースの順序を設定して、設定された順序で実行する方法を学習します。 JUnit4とJUnit5でテストを注文する方法を学習します。
デフォルトでは、テストメソッドは特定の順序に従いません。テストケースは、必ずしも記述された順序で実行する必要はありません。
テストケースの実行順序を設定するには、さまざまな方法またはモードがあります。また、JUnit5と比較した場合のテストケースの順序付けにおけるJUnit4の違いについても詳しく説明します。
JUnit 4:@ FixedMethodOrder、Class MethodSorters
JUnit 4.11以降、アノテーションがあります @FixMethodOrder そして MethodSorters.class テストの実行順序を設定する機能をサポートします。
その包み org.junit.runners。* クラスを含めるにはインポートする必要があります MethodSorters 。このクラスは、テストケースの注文方法を決定します。 MethodSorters 持ってる 三 列挙型 値。
以下に、クラスの列挙値と、各値が提供する目的を示します。
MethodSorters.DEFAULT | この列挙値は、テストの実行を特定の順序で並べ替えます。ただし、テストケースを実行する順序を予測することはできません。 |
これが、どのテストケースを最初に実行し、どのテストケースを次に実行するかを決定できる理由です。 | |
複数のメソッドを持つクラスを実行すると、DEFAULT列挙型でソートされ、テストの実行中は毎回順序が同じであることがわかりました。 | |
ただし、順序が設定された方法を予測または把握する方法はありません。 | |
MethodSorters.JVM | JVM列挙型を使用したテスト実行の順序は、名前が示すとおり、JVMによって決定されます。 |
この場合、クラスを実行するたびに、テストは同じ順序ではなくランダムな順序で実行されます。 | |
つまり、テストの順序は実行ごとに変わります。 | |
MethodSorters.NAME_ASCENDING | この列挙型は、テストメソッドをメソッド名の辞書式順序で並べ替えます。したがって、これがテスト実行を順序付ける最も予測可能な方法であるため、安心できます。 |
したがって、設定した名前の辞書式順序に基づいて、テストの順序を事前に決定することができます。 |
注釈 @FixedMethodOrder の入力パラメータを受け取ります MethodSorters その列挙値で。アノテーションに必要なパッケージは org.junit.FixedMethodOrder。
コードを介してどのように実装されるかを見てみましょう。
MethodSorters.DEFAULTのコード実装
JUnitクラスファイルを作成しましょう。 Junit4TestOrder.java ' 使用する場所 MethodSorters.DEFAULT
Junit4TestOrder.javaのコード
@FixMethodOrder(MethodSorters.DEFAULT) public class JUnit4TestOrder { @Test public void Testcase_3() { System.out.println('Testcase_3 executes'); } @Test public void Testcase_1() { System.out.println('Testcase_1 executes'); } @Test public void Testcase_2() { System.out.println('Testcase_2 executes '); } }
クラスを3回実行すると、以下と同じ順序でテストが実行されますが、テストケースはソートされた順序で実行される場合と実行されない場合があります。
コンソールウィンドウに次のような結果が表示されました。テストの実行順序はTestCase_3、TestCase_1、およびTestCase_2であり、実行回数によって順序は変わりません。
MethodSortersのコード実装。 JVM
「Junit4TestOrder.java」を次のように更新します MethodSorters.JVM
Junit4TestOrder.javaのコードスニペット
@FixMethodOrder(MethodSorters . JVM ) public class JUnit4TestOrder {
クラスを2回実行すると、実行ごとにテストの実行順序が変わります。
のコンソールウィンドウ 最初 実行は以下のとおりです。
のコンソールウィンドウ 2番目 実行は以下のとおりです。
両方の実行でテストが実行される順序の変化を注意深く観察します。 2回の実行でのテストの順序は異なります。
MethodSorters.NAME_ASCENDINGのコード実装
「Junit4TestOrder.java」を次のように更新します MethodSorters.NAME_ASCENDING
Junit4TestOrder.javaのコードスニペット
@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class JUnit4TestOrder {
クラスを2回実行します。実行されるテストの順序は同じままで、メソッド名の昇順に従って実行されます。
コンソールウィンドウには、TestCase_1、TestCase_2、およびTestCase_3の順序で実行されたテストの結果が表示されます。
JUnit 5:@ TestMethodOrder、@ Order、Interface MethodOrderer
テストの実行順序を制御するために、以下のエンティティは同じことを行うのに役立ちます。
- アノテーション@TestMethodOrder
- アノテーション@Order
- MethodOrdererインターフェイスに属するクラス
組み込みのMethodOrdererクラスとその詳細は次のとおりです。
MethodOrdererの組み込みクラス | パッケージから | 詳細 |
---|---|---|
英数字 | org.junit.jupiter.api.MethodOrderer.Alphanumeric | 名前に基づいてテストメソッドをアルファベット順に並べ替えます |
OrderAnnotation | org.junit.jupiter.api.MethodOrderer.OrderAnnotation | アノテーション@Orderに渡された値に基づいてテストメソッドを数値で並べ替えます |
ランダム | org.junit.jupiter.api.MethodOrderer.Random | JUnit 4のMethodSorters.JVMの場合と同様に、テストメソッドをランダムに並べ替えます |
次に、これらの各注文戦略のデモンストレーションを見てみましょう。
Alphanumeric.classのコード実装
JUnit4TestOrder.javaと同じJUnit5TestOrder.javaという名前のJUnit5クラスファイルを作成し、Alphanumeric.classのアノテーションを使用して、テストを英数字で並べ替えましょう。
Junit5TestOrder.javaのコード
@TestMethodOrder(Alphanumeric.class) public class JUnit5TestOrder { @Test public void Testcase_3() { System.out.println('Testcase_3 executes'); } @Test public void Testcase_1() { System.out.println('Testcase_1 executes'); } @Test public void Testcase_2() { System.out.println('Testcase_2 executes '); } }
クラスを3回実行しましたが、テストメソッド名のアルファベット順にソートされた順序で同じ順序のテストが実行されていることがわかります。
クラスファイルの実行後、テスト実行の順序:
- Testcase_1、
- Testcase_2と
- Testcase_3
注意: 英数字ソート戦略 大文字と小文字が区別されます したがって、testcase_1という名前の別のテストケースがある場合に備えて。
実行の順序は次のようになります。
- Testcase_1、
- Testcase_2、
- Testcase_3、
- testcase_1。
したがって、大文字は小文字のメソッド名よりも優先されます。
Random.classのコード実装
ここで、JUnit 5クラスJUnit5TestOrder.javaを更新して、Random.classでアノテーションを使用します。
Junit5TestOrder.javaのコードスニペット
@TestMethodOrder (Random.class) public class JUnit5TestOrder {
クラスを2回実行したところ、クラスを実行するたびに、テストの実行順序がランダムに並べられていることがわかりました。
のクラスファイルの実行後 初めて 、テストの実行順序は次のとおりです。
- Testcase_2、
- Testcase_1
- Testcase_3
実行されたときの実行順序 2番目 表示された時間:
- Testcase_2、
- Testcase_3
- Testcase_1 。
OrderAnnotation.classのコード実装
JUnit 5クラスJUnit5TestOrder.javaを更新して、アノテーションを使用します。 OrderAnnotation.class。 注釈 @注文 ここでのテスト方法の優先順位設定でも重要な役割を果たします。
Junit5TestOrder.javaのコードスニペット
@TestMethodOrder(OrderAnnotation.class) public class JUnit5TestOrder { @Test @Order(1) public void Testcase_3() { System.out.println('Testcase_3 executes'); } @Test @Order(2) public void Testcase_1() { System.out.println('Testcase_1 executes'); } @Test @Order(3) public void Testcase_2() { System.out.println('Testcase_2 executes '); } }
したがって、テスト実行の順序を設定するこの戦略では、@ Orderアノテーションは、テストメソッドを強制的に実行します。 オーダー値 そのために設定されています。
テストメソッドの@Orderの値が低いほど、実行中の優先度が高くなります。
実行後、テストの順序は次のように実行されました。
- Testcase_3、
- Testcase_1
- Testcase_2は、テストケースに設定された順序がそれぞれ1、2、および3であるためです。
これが、テストケースが順番に書かれているかどうかが問題にならない理由です。また、メソッド名が英数字順であるかどうかは関係ありません。
JUnit 5:カスタムオーダーの作成
さらに、組み込みのOrderクラスであるJUnit 5は、インターフェースを実装することでカスタム注文もサポートします。 MethodOrderer 。 JUnit 5バージョン5.4以降、カスタムソートがサポートされています。
メソッドの長さごとにカスタム注文を作成して実装する方法を簡単に見てみましょう。
ステップ1: MethodOrdererインターフェイスを実装するカスタム注文クラスを作成し、そのクラスにTestCaseLengthOrderという名前を付けました
TestCaseLengthOrder.javaのコード
public class TestCaseLengthOrder implements MethodOrderer { @Override public void orderMethods(MethodOrdererContext context) { MethodDescriptor md1; MethodDescriptor md2; context.getMethodDescriptors().sort((md1, md2)-> md1.getMethod().getName().length().compareTo(md2.getMethod().getName().length())); } }
TestCaseLengthOrderコードの説明:
- カスタムオーダークラスは、MethodOrdererインターフェイスを実装することによって作成されます。
- void orderMethods(MethodOrderContext context){}インターフェイスMethodOrdererから実装された組み込みメソッドであるメソッド。ここで、テスト順序付けロジックの実装を定義します。
- MethodDescriptorは、メソッドに関する詳細を囲むインターフェースです。
- メソッドMethodDescriptor.getMethod()は、この記述子のメソッド名を取得します。
- メソッド名は、メソッドgetName()、つまりMethodDescriptor.getMethod()。getName()および
- メソッドlength()は、メソッドの長さをフェッチします(string.length()が文字列値の長さをフェッチするのと同じです)。
- すべてのメソッド名は、compareTo()メソッドを使用して相互に比較されます。
- getMethodDescriptors()メソッドは、クラス内のすべてのメソッド記述子のリストを取得します。
- sort()メソッドは、MethodDescriptorオブジェクトをソートします。
MethodOrdererの各APIを明確に理解したので、上記のコードを簡単に解釈できることを願っています。
ステップ2 :テストクラスで組み込みの注文を使用するのと同じように、カスタム注文クラスを使用します。
アノテーション@TestMethodOrderへの入力として。
JUnit_CustomOrder.javaのコード
@TestMethodOrder(TestCaseLengthOrder.class) class JUnit_CustomOrder{ @Test public void subt(){ } @Test public void add(){ } @Test public void multiply(){ } @Test public void divide(){ }
ステップ3:
の実行後 JUnit_CustomOrder.class 、テストの実行順序は、テストケースの名前の長さの昇順に基づいて次のようになります。
- 追加()、
- subt()、
- 除算()
- かける()
結論
JUnitテストの実行順序に関するこのチュートリアルを終了します。
- 特定のアノテーションと特定のクラスを使用して、テストケースの順序を設定する方法を学びました。
- また、JUnit4とJUnit5のテストを注文するさまざまな方法を学び、それに基づいて注文戦略が変更されました。
- さらに、JUnit 5で、カスタマイズされた並べ替えクラスを作成し、それを使用して実行中にテストケースを並べ替える方法を学びました。