やあ、
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フォーマッター出力のコピーを添付しました
よろしく、
ネビルハンフリー
このバグを見た人は他にいませんか?
これはバグだと私は主張します。 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);
}
このスレッドは、閉じられた後、最近のアクティビティがないため、自動的にロックされています。 関連するバグについては、新しい問題を開いてください。
最も参考になるコメント
こんにちはfinaruioana、
ローカルバージョンのcucumber / lib / formatter / json_formatter.jsで、213行目を次のように変更しても機能するかどうかをテストできますか。
もしそうなら、この問題には何の牽引力もないように思われるので、上記の修正でプルリクエストを入れるかもしれません。