Cucumber-js: JSONフォーマッター:スタックトレース例外をログに記録し、キュウリのアサーションエラーをログに記録する必要があります

作成日 2017年10月19日  ·  12コメント  ·  ソース: cucumber/cucumber-js

やあ、

213行目の「json_formatter.js」にバグがあると思います。以下のスニペットを参照してください。

    if (status === _status2.default.FAILED && exception) {
      data.result.error_message = exception.stack || exception;
    }

テストが失敗すると、IMOでスタックトレースがログに記録されます。これは、少なくともexception.messageであり、スタックトレースも同様である可能性があります(スタックトレースエラーをオン/オフにできると便利です)。

誰かがこれがバグであるかどうか、そしてそれがどのように解決されるかを確認できますか?

私はCucumberJSでNightwatchJSを実行していますが、環境の詳細は次のとおりです。

ノード-v8.7.0
きゅうり-v3.03
ナイトウォッチ-v0.9.16
ナイトウォッチキュウリ-v8.2.2
ブラウザ-Chromev61.0.3163.100
Chromeドライバー-v2.32
セレン-v3.5.3
Os-Windows 7

86行目にエラーメッセージを表示するjsonフォーマッター出力のコピーを添付しました

よろしく、
ネビルハンフリー

chrome.cucumber.json.zip

最も参考になるコメント

こんにちはfinaruioana、

ローカルバージョンのcucumber / lib / formatter / json_formatter.jsで、213行目を次のように変更しても機能するかどうかをテストできますか。

      let error_message = _lodash.includes(exception.stack, exception.message) ? '' : exception.message + '\n';
      error_message += exception.stack;
      data.result.error_message = error_message || exception;

もしそうなら、この問題には何の牽引力もないように思われるので、上記の修正でプルリクエストを入れるかもしれません。

全てのコメント12件

このバグを見た人は他にいませんか?

これはバグだと私は主張します。 json_formatter @ 213のコード行は次のようになります。

      data.result.error_message = exception.message + exception.stack;

ではなく

  data.result.error_message = exception.stack || exception;

そうすれば、アサーションエラーとスタックトレースを取得できます。

同じ問題が発生しましたが、これがバグであることを誰かが確認できますか?

Error: <message>がスタックの最初の行であるのは、クロムとノードでの私の経験です。 Error: <message>error.toString()結果です。 次のようなものを使用できます。

let msg = exception
if (exception.stack) {
  msg = exception.stack
  if (!_.includes(msg, error.toString()) {
    msg = error.toString() + '\n' + msg
  }
}
data.result.error_message = msg

スタックにサファリのメッセージが含まれていないことを確認できます。 Chrome61とノード8のスタックにメッセージが表示されます。

ナイトウォッチキュウリを使用しても同じ問題が発生します(失敗すると、スタックなしでエラーメッセージが表示されることがよくあります)。 それは私にとってバグです

let error_message = _.includes(exception.stack, exception.message) ? '' : exception.message + '\n';
error_message += exception.stack;
data.result.error_message = error_message || exception;

例外メッセージがスタックに含まれている場合、このソリューションは繰り返しなしでerror_messageを提供する可能性があります。 それ以外の場合は、例外メッセージが前に表示されます。

こんにちは、

同じ行に同様の問題がありますが、この要素のタイプが原因です。
生成されたjsonレポートファイルでは、error_messageは文字列またはオブジェクトです。 ここで一貫性を保つことができますか? それについての人々の考えを聞くのを待っています。

私たちにとっての問題は、jsonからhtmlレポートを生成しようとするときです。 現時点では、cucumber-html-reporterライブラリは、このerror_messageが文字列であると想定しています。 オブジェクトとして取得すると、htmlレポーターは失敗します。

さらに進んで、異なるブラウザライブラリを使用したテストにより、このタイプの違いが得られます。 webdriverioを使用してテストを実行するたびに、レポートの生成に合格します。 ただし、webdriverjs-angularを使用すると、report.jsonにはオブジェクトとしてerror_messageが含まれるため、htmlレポートの生成に失敗します。

あなたの回答に基づいて、別の場所で問題を提起する必要があるかもしれませんが、これから始めるのに最適な場所は、error_messageタイプに一貫性があるかどうかを確認することだと思いました。

ありがとう!

こんにちはfinaruioana、

ローカルバージョンのcucumber / lib / formatter / json_formatter.jsで、213行目を次のように変更しても機能するかどうかをテストできますか。

      let error_message = _lodash.includes(exception.stack, exception.message) ? '' : exception.message + '\n';
      error_message += exception.stack;
      data.result.error_message = error_message || exception;

もしそうなら、この問題には何の牽引力もないように思われるので、上記の修正でプルリクエストを入れるかもしれません。

こんにちは@humphreyn

確かに、上記の変更を行うことで私の問題は解決しました。 また、スタックにifを追加してから追加します。私の場合は、undefinedを追加していました。
javascript let error_message = _lodash.includes(exception.stack, exception.message) ? '' : exception.message + '\n'; if (exception.stack) { error_message += exception.stack; } data.result.error_message = error_message || exception;

ありがとう!

当然のことながら、例外はメッセージとスタックが定義されたオブジェクトですが、常にそうであるとは限らない場合は、微調整が必​​要です。

let msg = exception.message || '';
let stack = exception.stack || '';
msg = _.includes(stack, msg) ? '' : (msg + '\n');
data.result.error_message = (msg + stack) || exception;

このコードは、メッセージまたはスタックが定義されていない場合に、「未定義」がerror_messageに追加されるのを防ぎます。 両方が未定義または空の文字列である場合、例外オブジェクトはerror_messageに割り当てられます。 文字列error_messageを適用する場合は、 JSON.stringify使用できます。

let msg = exception.message || '';
let stack = exception.stack || '';
msg = _.includes(stack, msg) ? '' : (msg + '\n');
data.result.error_message = (msg + stack) || JSON.stringify(exception);

@finaruioanaこのソリューションは_代わりに_lodashを使用する必要があります)

let msg = exception.message || '';
let stack = exception.stack || '';
msg = _lodash.includes(stack, msg) ? '' : (msg + '\n');
data.result.error_message = (msg + stack) || exception;

ええ、@ innocentivはよさそうです。 それをテストし、正常に動作するようです。

@innocentiv 、これらの変更が
nodejs:v8.9.0
cucumberjs:v 3.1.0
ナイトウォッチ-キュウリ:v0.9.16
セレン-スタンドアロン:v3.4.0
すなわちwebdriver:v3.4.0
クロームウェブドライバー:v2.33
gecko(firefox)webdriver:v0.19.1

この修正を適用するためにプルリクエストを送信しますか?

@humphreynプルリクエスト:#973

文字列の例外をチェックするようにプルリクエストを変更しました。 次を使用してローカルでテストできます。

          if (_lodash2.default.isString(exception)) {
            data.result.error_message = exception;
          } else {
            var _exception$message = exception.message,
                message = _exception$message === undefined ? '' : _exception$message,
                _exception$stack = exception.stack,
                stack = _exception$stack === undefined ? '' : _exception$stack;

            message = _lodash2.default.includes(stack, message) ? '' : message + '\n';
            data.result.error_message = message + stack || JSON.stringify(exception);
          }

このスレッドは、閉じられた後、最近のアクティビティがないため、自動的にロックされています。 関連するバグについては、新しい問題を開いてください。

このページは役に立ちましたか?
0 / 5 - 0 評価