JUnit ErrorCollector @Rule と例

⚡ スマートサマリー

JUnit ErrorCollector は、テストが失敗した後も実行を継続し、すべてのエラー オブジェクトを収集して、テスト メソッドが終了した後にまとめて報告するルールです。ping 最初の問題で。

  • 🔘 目的: アサーション、ネットワーク、またはGUIチェックが失敗した後もテストを続行し、収集したすべてのエラーを一度に報告します。
  • ☑️ 宣言: パブリックな非静的ErrorCollectorフィールドに対する@Ruleは、 JUnit 各テストにルールを関連付ける。
  • 収集: addError(Throwable) は、エラーまたは例外を格納します。なぜなら、Throwable は両方の親だからです。
  • 🧪 チェック: checkThat() はマッチング条件を評価し、残りのステートメントを中断することなく不一致を記録します。
  • 🛠️ レポート: 失敗 trace は、収集されたすべての投擲物を独自の行番号とともにリストします。 JUnit ビュー。
  • 📌 JUnit 5: Jupiterではルールがなくなったため、assertAll()やAssertJのSoftAssertionsが同じ役割を果たします。

JUnit ErrorCollectorルールは、1回のテスト実行で複数のエラーを収集します。

通常のシナリオでは、テストの実行中にエラーを特定するたびに、テストを停止し、エラーを修正してテストを再実行します。

だけど JUnit 少し異なるアプローチを採用しています。 JUnit エラーコレクターを使用すれば、問題が見つかった場合やテストが失敗した場合でも、テストの実行を続行できます。エラーコレクターはすべてのエラーオブジェクトを収集し、テスト実行終了後に一度だけ報告します。

エラー コレクターを使用する理由

テストスクリプトを作成する際、ネットワーク障害、アサーション失敗、その他の理由でコード行が失敗した場合でも、すべてのテストを実行したい場合があります。そのような状況でも、特別な機能を使用してテストスクリプトの実行を継続できます。 JUnit 「エラーコレクター」として知られています。

このため、 JUnit 使用 @Rule アノテーションこれは、エラーコレクターのオブジェクトを作成するために使用されます。エラーコレクターのオブジェクトが作成されたら、メソッドを使用してすべてのエラーを簡単にオブジェクトに追加できます。 addError (スロー可能なエラー)。 あなたが知っているように、 スロー可能 はスーパークラスです 例外 (NAIST) と エラー のクラス Javaこのようにエラーを追加すると、これらのエラーはログに記録されます。 JUnit テスト結果。

エラーコレクターにすべてのエラーを追加する利点は、すべてのエラーを一度に検証できることです。また、スクリプトが途中で失敗した場合でも、テストメソッドの最後まで実行が継続されます。

お願い: 単純な assert または try/catch ブロックを使用する場合、エラーコレクターメソッドを使用することはできません。

サンプルコード

エラーコレクターについてさらに理解するには、以下のコード例を参照してください。この例では、エラーコレクターオブジェクトを作成し、すべてのエラーをそのオブジェクトに追加する方法を示しています。 track 問題:

package guru99.junit;		

import org.junit.Rule;		
import org.junit.Test;		
import org.junit.rules.ErrorCollector;		

public class ErrorCollectorExample {				
    @Rule		
    public ErrorCollector collector = new ErrorCollector();							

    @Test		
    public void example() {					
    collector.addError(new Throwable("There is an error in first line"));							
    collector.addError(new Throwable("There is an error in second line"));							
    collector.checkThat(getResults(),			
                not(containsString("here is an error")));			
    // all lines of code will execute and at the end a combined failure will		
    be logged in.		
    }		
}	

注意: これは例示ですtract はコンパイル可能なファイルではありません。末尾のコメントが先頭の // なしで 2 行目に折り返され、getResults() と Hamcrest マッチャーは表示されません。完全な実行可能なバージョンは以下にあります。 ErrorCollector を使用した例.

@Rule とは何ですか JUnit?

JUnit テストの特別な処理方法を提供し、 テストケース またはテストスイートを使用して @Rule アノテーション@Rule を使用すると、テストの動作を簡単に追加または再定義できます。

にはいくつかの組み込みルールがあります JUnit テスターが使用できるAPIであり、独自のルールを作成することもできます。ルールフィールドは、公開され、静的ではなく、TestRuleを実装する型である必要があります。

以下のコード行は、@Rule アノテーションをエラーコレクターと組み合わせて使用​​する方法を示しています。

@Rule				
public ErrorCollector collector= new ErrorCollector();

JUnit 5年の注記: Jupiter はルールを拡張 API に置き換えたため、org.junit.jupiter には @Rule と ErrorCollector は存在しません。最も近い同等のものは Assertions.assertAll() と AssertJ SoftAssertions です。 JUnit ここに示されている 4 つのコードは、ビンテージ エンジンでもまだ動作します。 JUnit アノテーション フルマップのチュートリアルping.

ErrorCollector を使用した例

エラーコレクターを理解するために、すべてのエラーを収集するクラスとルールを作成しましょう。ここでは、addError(throwable) を使用してすべてのエラーを追加します。

以下のコードをご覧ください。これは単に「エラーコレクターオブジェクト」を作成するだけのルールです。さらに、このオブジェクトはすべてのエラーを追加し、最後に問題を報告するために使用されます。

ErrorCollectorExample.java

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Rule;		
import org.junit.Test;		
import org.junit.rules.ErrorCollector;		

public class ErrorCollectorExample {				
    @Rule		
    public ErrorCollector collector = new ErrorCollector();							

    @Test		
    public void example() {					
    collector.addError(new Throwable("There is an error in first line"));							
    collector.addError(new Throwable("There is an error in second line"));							

        System.out.println("Hello");					
        try {			
            Assert.assertTrue("A " == "B");					
        } catch (Throwable t) {					
            collector.addError(t);					
        }		
        System.out.println("World!!!!");					
    }		
}		

テストランナー.java

上記のテストクラスをテストランナーに追加し、実行してすべてのエラーを収集してみましょう。以下のコードを参照してください。

package guru99.junit;		

import org.junit.runner.JUnitCore;		
import org.junit.runner.Result;		
import org.junit.runner.notification.Failure;		

public class TestRunner {				
			public static void main(String[] args) {									
      Result result = JUnitCore.runClasses(ErrorCollectorExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      

出力:

失敗を見る trace、 tracすべてのエラーを1か所にまとめます。 JUnit ビューは実行回数を1回とカウントしますが、2つのエラーと1つの失敗を報告し、それぞれに独自の行番号が付いています。

Eclipse JUnit 失敗 trac1回の実行で収集された2つのThrowableエラーと1つのAssertionErrorを一覧表示します。

のメリット JUnit エラーコレクター

あなたが使用することができます JUnit アサーション 機能検証やGUI検証の場合、例えば以下のようになります。

  1. assertEquals(String message, Object expected, Object actual) は、2 つのオブジェクトが等しいかどうかを比較します。
  2. 同様に、assertTrue(Booleancondition) は、条件が true であることをアサートします。

アサーションを使うと、検証テストは容易になります。しかし、大きな問題点の一つは、たった一つのアサーションが失敗しただけでもテストの実行が停止してしまうことです。

テストの継続性と復旧処理はテスト自動化の成功に不可欠であり、長期にわたって最も重要となる。 Selenium チェックが失敗するたびにブラウザを再起動するのはコストがかかるようなフローでは、エラーコレクターが最適な対処法です。

よくあるご質問

addError(Throwable) は、既に捕捉または作成したエラーを記録します。checkThat(value, matcher) は、Hamcrest のマッチャーを評価し、不一致を自動的に記録するため、アサーションのように読み取ることができ、残りのステートメントの実行も許可します。

はい。メソッドは完了するまで実行され、その後、 JUnit 失敗としてマークし、失敗時に収集されたすべてのスロー可能オブジェクトを出力します。 trace. 例のスクリーンショットでは、1つのテストメソッドから2つのエラーと1つの失敗が報告されています。

JUnit テストクラスをスキャンして、@Rule アノテーションが付いたパブリックインスタンスフィールドを探し、それぞれのフィールドをすべてのテストメソッドの周りに適用します。プライベートフィールドまたは静的フィールドは無視され、 JUnit テストを実行する代わりに、初期化エラーを発生させます。

いいえ。Jupiter はルールメカニズムを削除したため、org.junit.rules.ErrorCollector は JUnit 4. グループ化されたアサーションには Assertions.assertAll() を使用するか、より高度なマッチングが必要な場合は AssertJ SoftAssertions を追加します。

はい、これはよくあるパターンです。複数のフィールドを持つページは、最初の不一致で処理を中断するのではなく、すべての不一致を収集して一度に検証できます。これにより、検出された欠陥ごとにブラウザセッションを再起動する必要がなくなります。

どちらもレポートを遅延させますが、SoftAssert はテストの最後に明示的な assertAll() 呼び出しを必要としますが、ErrorCollector はメソッドが戻るときに自動的にレポートします。 TestNG 失敗をひっそりと隠蔽する。

AIアシスタントグループは長年の失敗 trac根本原因に基づいて分析することで、収集した20個の問題点を少数の明確な欠陥に絞り込むことができます。また、どのチェック項目を個別のテストではなく、1つの実行でまとめて行うべきかについても示唆してくれます。

GitHubコパイロット @Rule フィールドは簡単に書き込まれますが、ルールが存在しない Jupiter テスト クラスに混入してしまうことがよくあります。テスト スイートを実行する前に、インポートが org.junit であることを確認してください。