Cucumber-js: Formatter JSON: Mencatat pengecualian jejak tumpukan dan harus mencatat kesalahan pernyataan mentimun

Dibuat pada 19 Okt 2017  ·  12Komentar  ·  Sumber: cucumber/cucumber-js

Hai,

Saya rasa ada bug di 'json_formatter.js' pada baris 213, lihat cuplikan di bawah ini:

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

Setiap pengujian yang gagal akan menghasilkan jejak tumpukan yang dicatat ketika IMO itu harus menjadi exception.message minimal dan berpotensi jejak tumpukan juga (akan lebih baik jika Anda dapat mengaktifkan/menonaktifkan kesalahan pelacakan tumpukan).

Dapatkah seseorang mengonfirmasi apakah ini bug dan bagaimana cara mengatasinya.

Saya menjalankan NightwatchJS dengan CucumberJS, detail lingkungan saya adalah sebagai berikut:

Simpul - v8.7.0
Mentimun - v3.03
Jam malam - v0.9.16
Mentimun nightwatch - v8.2.2
Peramban - Chrome v61.0.3163.100
Sopir Chrome - v2.32
Selenium - v3.5.3
Os - Windows 7

Saya telah melampirkan salinan keluaran formatter json yang menunjukkan pesan kesalahan pada baris 86

Salam,
Neville Humphrey

chrome.cucumber.json.zip

Komentar yang paling membantu

Hi finaruioana,

Dalam versi lokal mentimun/lib/formatter/json_formatter.js Anda, dapatkah Anda menguji apakah mengubah baris 213 ke baris berikut berfungsi untuk Anda:

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

Jika ya, saya dapat mengajukan permintaan tarik dengan perbaikan di atas, karena sepertinya tidak ada daya tarik pada masalah ini.

Semua 12 komentar

Apakah tidak ada orang lain yang melihat bug ini?

Saya mempertahankan ini adalah bug. Baris kode dalam json_formatter @ 213 harus:

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

dan tidak

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

Dengan begitu Anda mendapatkan kesalahan pernyataan dan jejak tumpukan.

Saya telah melihat masalah yang sama, bisakah seseorang mengonfirmasi bahwa ini adalah bug?

Ini adalah pengalaman saya di chrome dan node bahwa Error: <message> adalah baris pertama dari tumpukan. Error: <message> adalah hasil dari error.toString() . Kita bisa menggunakan sesuatu seperti:

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

Dapat mengkonfirmasi tumpukan tidak termasuk pesan di safari. Saya melihat pesan di tumpukan di chrome 61 dan node 8.

Saya mengalami masalah yang sama menggunakan mentimun nightwatch (kegagalan akan sering menghasilkan pesan kesalahan tanpa tumpukan). Ini bug bagi saya

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

Jika pesan pengecualian disertakan dalam tumpukan, solusi ini mungkin memberikan error_message tanpa pengulangan. Jika tidak, pesan pengecualian diletakkan sebelumnya.

Halo,

Kami memiliki masalah serupa di baris yang sama, tetapi karena jenis elemen ini.
Ke dalam file laporan json yang dihasilkan, error_message adalah string ATAU objek. Bisakah kita memiliki konsistensi di sini? Menunggu untuk mendengar pendapat orang tentangnya.

Masalah bagi kami adalah ketika kami mencoba membuat laporan html dari json. Saat ini, pustaka mentimun-html-reporter mengharapkan error_message ini menjadi string. Ketika kami mendapatkannya sebagai objek, reporter html gagal.

Lebih jauh, kami mendapatkan perbedaan tipe ini karena pengujian menggunakan perpustakaan browser yang berbeda. Setiap kali kami menjalankan pengujian menggunakan webdriverio, pembuatan laporan akan berlalu. Tetapi menggunakan webdriverjs-angular, report.json akan memiliki error_message sebagai objek dan dengan demikian kegagalan saat membuat laporan html.

Berdasarkan tanggapan Anda, saya mungkin perlu mengangkat masalah di tempat yang berbeda, tetapi saya pikir tempat terbaik untuk memulainya adalah untuk melihat apakah kita dapat memiliki konsistensi pada jenis error_message.

Terima kasih!

Hi finaruioana,

Dalam versi lokal mentimun/lib/formatter/json_formatter.js Anda, dapatkah Anda menguji apakah mengubah baris 213 ke baris berikut berfungsi untuk Anda:

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

Jika ya, saya dapat mengajukan permintaan tarik dengan perbaikan di atas, karena sepertinya tidak ada daya tarik pada masalah ini.

Hai @humphreyn

Memang, membuat perubahan di atas memecahkan masalah saya. Saya juga menambahkan if pada stack sebelum menambahkannya, dalam kasus saya menambahkan 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;

Terima kasih!

Saya menerima begitu saja bahwa pengecualian adalah objek dengan pesan dan tumpukan yang ditentukan, tetapi jika itu tidak selalu terjadi, diperlukan penyesuaian kecil:

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

Kode ini mencegah "tidak terdefinisi" untuk ditambahkan ke error_message jika pesan atau tumpukan tidak ditentukan. Jika keduanya tidak terdefinisi atau string kosong, objek pengecualian ditetapkan ke error_message. Jika kita ingin menerapkan string error_message kita dapat menggunakan 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 Anda berpikir bahwa solusi ini akan baik-baik saja (untuk menguji di lingkungan lokal Anda harus menggunakan _lodash bukannya _ )

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

ya, terlihat bagus @innocentiv. Sudah dicoba dan sepertinya berfungsi dengan baik.

@innocentiv , saya juga dapat mengonfirmasi bahwa perubahan itu berfungsi secara lokal untuk saya di chrome, yaitu dan firefox dengan pengaturan berikut:
nodejs: v8.9.0
mentimun: v 3.1.0
nightwatch-mentimun: v0.9.16
selenium mandiri: v3.4.0
yaitu webdriver: v3.4.0
chrome webdriver: v2.33
gecko (firefox) webdriver: v0.19.1

Apakah Anda akan mengirimkan permintaan tarik untuk menerapkan perbaikan ini?

@humphreyn Tarik permintaan: #973

Saya baru saja memodifikasi permintaan tarik untuk memeriksa pengecualian string. Anda dapat mengujinya secara lokal menggunakan:

          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);
          }

Utas ini telah dikunci secara otomatis karena tidak ada aktivitas terbaru setelah ditutup. Silakan buka edisi baru untuk bug terkait.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

manu7691 picture manu7691  ·  37Komentar

robsonrosa picture robsonrosa  ·  18Komentar

charlierudolph picture charlierudolph  ·  14Komentar

charlierudolph picture charlierudolph  ·  33Komentar

charlierudolph picture charlierudolph  ·  17Komentar