5

きゅうりのシナリオがあり、ステップではassertEquals. 結果レポートにスタック トレースが表示されますが、これはエンド ユーザー フレンドリーではありません。どうすれば抑えることができますか

  Scenario: Add two numbers
    Given I have two inputs "3" and "2"
    When I add them
    Then the output should be "15"

ジュニット

4

2 に答える 2

1

Cucumber-Selenium-Java プロジェクトでも同じ問題に直面していました。キュウリのレポートでは、約 40 行のスタック トレースが生成されていました。このため、レポートのルック アンド フィールに影響を与えていました。そして、エンドユーザー/クライアントはそれについてほとんど心配していませんでした. 彼/彼女は、このスタックトレースの実際の使用法を実際に理解できなかったからです。そこで、以下のアイデア/アプローチを思いつきました。少しトリッキーですが、価値があります。

開始前の注意事項:

  1. すべてのケースでスタックトレースを完全に無効にすることはできません。ただし、スタックトレースを変更してから、便利で短縮されたスタックトレースを使用して新しい例外を再スローできます。
  2. 頻繁に直面する例外、エラーに注意する必要があります。そのため、例外に応じてカスタム例外を作成できます。
  3. スタックトレースでは、ラッパー API から数行のコード、Junit/TestNg から数行、Java と Selenium から数行が生成され、実際に問題が発生したスタックトレースには 1 行または 2 行しかありません。
  4. 私たちのテストクラスは、独自のパッケージに入っている必要があります。そのため、パッケージ名でスタックトレース トレースをフィルタリングし、実際の問題のクラス名、行番号、およびメソッド名を取得できます。この情報を使用して、カスタム例外をスローできます。したがって、実際に発生した問題の行を簡単に把握できます。私の場合、すべてのクラスは「ページ」という名前のパッケージに含まれていました。クラスに複数のパッケージがある場合は、それに応じて以下のコードに文字列条件を追加できます。
  5. テスト コードを try-catch ブロックでラップする必要があります。また、キャッチ中は、例外クラスではなく、Throwable クラスを使用する必要があります。アサーションが失敗した場合、すべてのアサーションが Error クラスの下にあり、Throwable が Error と Exception の親であることを知っているため、Exception クラスは問題を処理できません。
  6. catch ブロックで新しい例外をスローすると、実際の問題が発生したスタックトレースの行番号が変更されます。したがって、問題の実際の行を把握することは困難です。これを回避するには、実際に発行されたクラス名、行番号、メソッド名を取得して StackTraceElement クラスに格納し、新しい例外をスローする際に使用する必要があります。
  7. 「NoSuchElementException」のようないくつかの例外は、その原因について多くの情報を提供しますが、そのほとんどは実際には必要ありません。そのため、String クラスの substring()、indexOf()、および replaceAll() メソッドを使用してメッセージの内容を変更する必要があります。ジャバ。そして、新しい例外で変更された情報を提供します。
  8. Throwable Java クラスのいくつかの重要な Java メソッドとその説明: (i) getStackTrace(): このメソッドは、StackTraceElement クラスの配列を返します。StackTraceElement クラスは、問題が発生したクラス名、メソッド名、行番号を提供します。(ii) setStackTrace(): このメソッドは、カスタム スタックトレースを新しい例外に提供するために使用されます。(iii) getCause(): このメソッドは、例外の原因から発行メッセージを提供します。ただし、null を返す場合もあります。一部の例外については、「原因」が特定されない場合があるためです。したがって、これは try catch ブロックで囲む必要があり、ここで getMessage() メソッドを使用して実際のエラー メッセージを取得する必要があります。(iv) getClass(): このメソッドは、実際の例外クラス名を返します。このメソッドを使用して例外クラス名を特定し、次に、さまざまな例外クラスに特定の実装を提供するために使用します。注: 「getClass()」メソッドは「Throwable」クラスのものではありません。Object クラスからのものです。

すべての例外を処理するための共通メソッドを作成し、このメソッドを必要なすべてのクラスで再利用する必要があります。例: メソッドに「processException」という名前を付け、「ReusableMethod」クラスに配置しました。

すべてのテストクラスがこのパッケージに配置されているため、以下のメソッド (8 行目) でパッケージ名「ページ」を使用していることに注意してください。あなたの場合、必要に応じてパッケージ名を更新する必要があります。また、NoSuchElementException と AssertionError の 2 つの例外のみのカスタム ケースを作成しました。必要に応じて、さらにケースを作成する必要がある場合があります。

public void processException(Throwable e) throws Exception {
        StackTraceElement[] arr = e.getStackTrace();
        String className = "";
        String methodName = "";
        int lineNumber = 0;
        for (int i = 0; i < arr.length; i++) {
            String localClassName = arr[i].getClassName();
            if (localClassName.startsWith("page")) {
                className = localClassName;
                methodName = arr[i].getMethodName();
                lineNumber = arr[i].getLineNumber();
                break;
            }
        }
        String cause = "";
        try {
            cause = e.getCause().toString();
        } catch (NullPointerException e1) {
            cause = e.getMessage();
        }
        StackTraceElement st = new StackTraceElement(className, methodName, "Line", lineNumber);
        StackTraceElement[] sArr = { st };
        if (e.getClass().getName().contains("NoSuchElementException")) {
            String processedCause = cause.substring(cause.indexOf("Unable to locate"), cause.indexOf("(Session info: "))
                    .replaceAll("\\n", "");
            Exception ex = new Exception("org.openqa.selenium.NoSuchElementException: " + processedCause);
            ex.setStackTrace(sArr);
            throw ex;
        } else if (e.getClass().getName().contains("AssertionError")) {
            AssertionError ae = new AssertionError(cause);
            ae.setStackTrace(sArr);
            throw ae;
        } else {
            Exception ex = new Exception(e.getClass() + ": " + cause);
            ex.setStackTrace(sArr);
            throw ex;
        }
    }

以下は、テストクラスメソッドで上記のメソッドの使用法を紹介するサンプルメソッドです。私の場合は「reuseMethod」であるクラス参照を使用して、上記で作成したメソッドを呼び出しています。そして、キャッチされた Throwable 参照 "e" を上記のメソッドの catch ブロックに渡します。

public void user_Navigates_To_Home_Page() throws Exception {
    try {
            //Certain lines of code as per your tests
            //element.click();
        } catch (Throwable e) {
            reuseMethod.processException(e); 
        }
  }

NoSuchElementException の実装のスクリーンショットを次に示します。

このアプローチを実装する前に:

前

このアプローチを実装した後:

後

于 2021-01-26T06:57:20.153 に答える