Jest: Sembunyikan log konsol untuk lulus tes dan tunjukkan jika gagal

Dibuat pada 28 Jul 2017  ·  47Komentar  ·  Sumber: facebook/jest


Apakah Anda ingin meminta fitur atau melaporkan bug ?

fitur

Apa perilaku saat ini?

Ketika Anda menjalankan jest --watch itu akan menampilkan logging konsol (kecuali jika Anda menggunakan --silent ).

Jika perilaku saat ini adalah bug, berikan langkah-langkah untuk mereproduksi dan demo repl.it melalui https://repl.it/languages/jest atau repositori minimal di GitHub yang kami dapat yarn install dan yarn test .

Apa perilaku yang diharapkan?

Akan sangat membantu untuk hanya melihat log konsol untuk tes yang gagal karena saat itulah Anda paling membutuhkannya. Untuk lulus tes, log konsol dapat disembunyikan.

Harap berikan konfigurasi Jest Anda yang tepat dan sebutkan Jest, node, versi yarn/npm dan sistem operasi Anda.

$ jest --version && node --version && yarn --version
v20.0.4
v6.10.3
0.27.5

Mac OS X 10.12.5

jest.config.js :

module.exports = {
  collectCoverageFrom: ['src/**/*.{js,jsx}'],
  coveragePathIgnorePatterns: [
    '<rootDir>/node_modules/',
    '<rootDir>/src/core/server/webpack-isomorphic-tools-config.js',
    '<rootDir>/src/locale/',
  ],
  moduleDirectories: [
    'src',
    'node_modules',
  ],
  moduleFileExtensions: [
    'js',
    'json',
    'jsx',
  ],
  moduleNameMapper: {
    // Prevent un-transpiled react-photoswipe code being required.
    '^photoswipe$': '<rootDir>/node_modules/photoswipe',
    // Use the client-side logger by default for tests.
    '^core/logger$': '<rootDir>/src/core/client/logger',
    // Alias tests for tests to be able to import helpers.
    '^tests/(.*)$': '<rootDir>/tests/$1',
    // Replaces the following formats with an empty module.
    '^.+\\.(scss|css|svg|woff|woff2|mp4|webm)$': '<rootDir>/tests/emptyModule',
  },
  setupTestFrameworkScriptFile: '<rootDir>/tests/setup.js',
  testPathIgnorePatterns: [
    '<rootDir>/node_modules/',
    '<rootDir>/(assets|bin|config|coverage|dist|docs|flow|locale|src)/',
  ],
  testMatch: [
    '**/[Tt]est(*).js?(x)',
    '**/__tests__/**/*.js?(x)',
  ],
  transform: {
    '^.+\\.js$': 'babel-jest',
    // This transforms images to be a module that exports the filename.
    // Tests can assert on the filenname.
    '^.+\\.(jpg|jpeg|gif|png)$': '<rootDir>/tests/fileTransformer',
  },
  transformIgnorePatterns: [
    '<rootDir>/node_modules/',
  ],
  verbose: false,
};

Komentar yang paling membantu

Setuju, Memiliki flag aa untuk menyembunyikan output konsol untuk tes LULUS dan membiarkannya untuk tes GAGAL akan menjadi tambahan yang bagus untuk membuat hasil tes lebih mudah dibaca

Semua 47 komentar

Anda dapat menulis reporter khusus. Cc @aaronabramov

Hai, terima kasih atas info yang bermanfaat.

Namun, saya mencoba menulis reporter khusus dan mengalami beberapa hambatan:

  • Tidak ada cara mudah untuk mewarisi semua fungsi dari reporter default (output pengujian informatif, dll) dan saya lebih suka tidak mengimplementasikan kembali semuanya dari awal
  • Ketika saya memasukkan reporter default di konfigurasi saya, berikan --silent di CLI (untuk membuat reporter default menyembunyikan logging konsol), dan menambahkan reporter kustom saya ke konfigurasi saya, saya tidak melihat cara mudah di reporter kustom untuk mencetak logging. Tampaknya karena opsi --silent , kelas reporter tidak lagi memiliki akses ke konsol buffer.

Karena itu, saya ingin mengusulkan tambalan ke Jest yang akan memperkenalkan nilai konfigurasi untuk menampilkan konsol hanya pada tes yang gagal. Apakah Anda akan mempertimbangkan tambalan seperti itu?

Ini jelas membutuhkan tes dan perlu memeriksa nilai konfigurasi tetapi inilah ide umumnya (yang berfungsi):

diff --git a/packages/jest-cli/src/reporters/default_reporter.js b/packages/jest-cli/src/reporters/default_reporter.js
index 08d4a9f2..adedbdd3 100644
--- a/packages/jest-cli/src/reporters/default_reporter.js
+++ b/packages/jest-cli/src/reporters/default_reporter.js
@@ -176,7 +176,8 @@ class DefaultReporter extends BaseReporter {
       this.log(getResultHeader(result, config));

       const consoleBuffer = result.console;
-      if (consoleBuffer && consoleBuffer.length) {
+      const testFailed = result.numFailingTests > 0;
+      if (testFailed && consoleBuffer && consoleBuffer.length) {
         this.log(
           '  ' +
             TITLE_BULLET +

Saya sebenarnya menyukai ide ini, tetapi ada banyak hal yang perlu kita pertimbangkan

kita perlu menambahkan beberapa informasi tentang output tersembunyi

PASS __tests__/my_test.js (hidden output)

kita juga harus menonaktifkannya saat menjalankan beberapa tes atau satu tes (saya kira cukup banyak hanya mengaktifkannya untuk uji coba penuh)

@cpojer apakah Anda punya pemikiran tentang ini?

Saya pikir perilaku ini membingungkan dan saya lebih suka Jest untuk konsisten dalam apa yang dihasilkannya per pengujian, terlepas dari keadaannya.

@cpojer bagi saya, membingungkan untuk mencoba dan menemukan pesan konsol yang berkaitan dengan pengujian saya yang gagal:/ Jika Anda dapat menyarankan cara yang lebih baik untuk mencapainya, silakan lakukan.

Sebagai kompromi, apakah Anda akan menerima tambalan yang memperlihatkan DefaultReporter di jest.js sehingga saya dapat memperpanjangnya? Jika tidak, saya harus menyalin dan menempelkan dunia untuk menerapkan fitur ini di reporter khusus.

Seperti inilah hasil pengujian saya:

screen shot 2017-11-05 at 16 11 29

Saya tidak dapat menghilangkan peringatan karena https://github.com/facebook/flow/issues/4673 , dan untungnya hanya ada beberapa pesan log, tetapi jika saya ingin menambahkan lebih banyak logging, itu akan menjadi jauh lebih buruk .

Saya setuju bahwa

Setuju, Memiliki flag aa untuk menyembunyikan output konsol untuk tes LULUS dan membiarkannya untuk tes GAGAL akan menjadi tambahan yang bagus untuk membuat hasil tes lebih mudah dibaca

Saya akan setuju. Saat ini saya sedang mengerjakan proyek dengan sekelompok besar tes dan output dari tes yang lulus membuat alur kerja lebih sulit saat debugging.

Setuju pada tanda yang menyembunyikan keluaran konsol untuk tes LULUS.

PASS __tests__/my_test.js (hidden output)

Bisakah kita mendapatkan tambahan ini dipertimbangkan kembali secara kebetulan?

Kami sekarang memiliki cara menjalankan tes yang gagal, yang harus mencakup kasus penggunaan ini. Lihat #4886 (tersedia di lelucon 22)

Kami sekarang memiliki cara menjalankan tes yang gagal, yang harus mencakup kasus penggunaan ini.

Itu hanya sebagian menutupi kasus ini. Misalnya, jika 5 dari 100 pengujian gagal dalam suite dengan banyak logging, Anda hanya dapat menjalankan ulang pengujian yang gagal untuk memahami keluaran konsol. Namun, jika Anda menyembunyikan logging untuk lulus tes selama ini, Anda tidak perlu menjalankan ulang tes.

Juga, menjalankan kembali hanya tes yang gagal memiliki kelemahan karena tidak akan menangkap kegagalan tes baru yang diperkenalkan oleh pengeditan kode.

Jika tim inti tidak ingin menerapkan fitur ini, dapatkah seseorang mempertimbangkan proposal saya untuk kompromi? Proposal ini akan memungkinkan saya untuk lebih mudah menulis reporter khusus untuk menerapkan penyembunyian konsol. Saya bisa membuat tambalan tetapi saya tidak ingin mengajukan permintaan tarik jika tidak diterima.

@kumar303 tolong kirim PR, sepertinya cukup tidak rumit untuk mempertahankan :)

@kumar303 apakah Anda akhirnya mengirimkan PR? Saya ingin memiliki ini juga.

Saya masih berniat untuk mengirimkan satu tetapi saya belum dapat menemukan waktu di antara prioritas pekerjaan saya yang lain. Jika ada orang lain yang mengalahkan saya, beri tahu saya sehingga saya dapat membantu mengujinya!

Ide saya adalah mengekspor DefaultReporter dari jest.js sehingga reporter khusus dapat memperluasnya. Saya berpikir untuk memulai dengan mengubah baris ini menjadi sesuatu yang lebih seperti:

const testFailed = result.numFailingTests > 0;
if (testFailed && consoleBuffer && consoleBuffer.length) {
  // Log console output
}

Saya yakin itu akan membutuhkan lebih banyak tweak setelah itu.

@kumar303 Bagaimana saya bisa menambahkan kode Anda ke konfigurasi lelucon saya?

Saya juga tertarik dengan ini. Mengikuti ide @ kumar303 , saya dapat menulis reporter khusus yang memperluas default_reporter dengan cukup mudah (meskipun rapuh, karena saya mengimpornya langsung dari jest-cli/build/reporters/default_reporter ), dan kemudian mengubah result.console sesuai keinginan saya (dalam hal ini saya membiarkan pengguna mengatur level log minimum).

Ini berfungsi dengan baik kecuali untuk satu hal - saat menjalankan satu tes, pesan konsol tidak disangga. Ini disebutkan di sini: https://github.com/facebook/jest/issues/2080

Jadi dalam skenario ini tidak ada kemampuan untuk memengaruhi keluaran konsol dari dalam pelapor khusus. Jadi saya tidak berpikir saran asli @thymikee untuk menggunakan reporter khusus untuk mengelola output konsol berfungsi secara universal, kecuali kita juga dapat memiliki beberapa cara untuk memaksa lelucon untuk selalu menyangga output konsol.

Senang mengekspos reporter default kami dengan cara yang lebih bersih.

Keberatan membuka masalah terpisah tentang force buffering console.logs? Harus konsisten

Apakah ada kerugian yang signifikan untuk memiliki variabel konfigurasi global seperti showLogsForFailedTests: true ? Nilai default tidak mengubah apa pun dari cara kerja Jest saat ini dan nilai false akan membuat membaca melalui tes jauh lebih menyenangkan.

Apakah masalah ini ditutup karena sesuatu telah dilakukan untuk memperbaikinya atau ditutup karena lebih dari 30 orang membayangkan bahwa mereka memiliki masalah dengan Jest yang sebenarnya tidak mereka alami?

nak, saya pikir ini adalah pendekatan standar untuk menunjukkan hanya log yang gagal untuk bercanda ... apakah ini masih menjadi masalah?

Butuh ini. Itu benar-benar mengganggu.

@willdurand saya mencoba reporter Anda. Saya tidak yakin apa kesalahan saya karena yang saya lakukan hanyalah memilih file itu sebagai reporter. Yang dilakukannya hanyalah mencegah hal ini muncul di akhir tes:

Test Suites: 48 passed, 48 total
Tests:       78 passed, 78 total
Snapshots:   73 passed, 73 total

Semua log selama tes masih muncul.

Apakah Anda mungkin menjalankannya hanya untuk satu tes? Lihat komentar saya sebelumnya dan
laporan bug terkait. Tidak mungkin menangkap log dengan reporter
ketika hanya satu tes yang dijalankan, ini adalah titik pelekatan yang sebenarnya.

Pada Rabu, 8 Agustus 2018, 19:08 jazoom [email protected] menulis:

@willdurand https://github.com/willdurand Saya mencoba reporter Anda. saya
tidak yakin apa yang bisa saya lakukan salah karena yang saya lakukan hanyalah memilih file itu
sebagai reporter. Yang dilakukannya hanyalah mencegah ini muncul di akhir
tes:

Test Suites: 48 lulus, total 48
Tes: 78 lulus, total 78
Snapshots: 73 lulus, total 73

Semua log selama tes masih muncul.


Anda menerima ini karena Anda berlangganan utas ini.
Balas email ini secara langsung, lihat di GitHub
https://github.com/facebook/jest/issues/4156#issuecomment-41582223 , atau bisukan
benang
https://github.com/notifications/unsubscribe-auth/AAi-gO9_uEJPO4xnhkpfGore_hEX81fUks5uO29bgaJpZM4OnBQQ
.

@jamietre Saya menjalankannya untuk perintah yang sama persis dengan yang saya gunakan untuk pengujian yang menjalankan 48 suite.

Sunting: untuk memperjelas, saya menjalankan perintah yang sama dua kali. Satu-satunya perbedaan dengan pelapor khusus adalah tidak mencetak ringkasan ini di akhir:

Test Suites: 48 passed, 48 total
Tests:       78 passed, 78 total
Snapshots:   73 passed, 73 total

@jazoom reporter tidak akan berpengaruh jika Anda memiliki verbose: true di konfigurasi Anda. Coba atur itu ke false .

@jamietre saya setuju. Ini adalah perilaku aneh bahwa satu uji coba tidak menangkap atau menampilkan output konsol apa pun (https://github.com/facebook/jest/issues/6441).

Juga tidak membantu bagaimana lelucon tidak mengelompokkan keluaran konsol dengan pengujian ( https://github.com/facebook/jest/issues/2080 ). Reporter kustom hanya dapat menampilkan output untuk suite (yaitu file tes), bukan tes gagal tertentu.

@jazoom juga pastikan Anda benar-benar me-restart lelucon setelah menginstal atau mengubah reporter. Ini mungkin tidak jelas karena lelucon akan mengenali perubahan pada file sumber lain saat berjalan (tetapi bukan reporter).

@kumar303 itu tidak diatur ke verbose

Apa yang Anda maksud dengan "sepenuhnya restart"? Itu hanya skrip yang berjalan.

Apa yang Anda maksud dengan "sepenuhnya restart"?

Maksud saya, jika Anda berada dalam mode jam tangan lelucon, Anda harus keluar.

Oke. Saya tidak menggunakan mode menonton.

ah ya, memang. Saya tidak menyadarinya, tetapi karena beberapa alasan, Jest tidak menampilkan ringkasan akhir di bagian bawah, setelah semua rangkaian pengujian dijalankan.

Saya kira itu karena kami memperpanjang DefaultReporter dan bukan SummaryReporter , mungkin..

@willdurand Saya mencoba konfigurasi Anda yang berhasil menyembunyikan log. Namun, terminal tidak dibersihkan lagi (log sebelumnya) dan semua log menumpuk yang di bawah yang lain.

Catatan: Dengan hanya mengekspor kelas DefaultReporter , saya kembali ke logging default tetapi juga tumpukan log

Saya bermain-main dengan FingersCrossedReporter dari @kumar303 / @willdurand
Namun seperti yang dicatat beberapa orang lain, itu tidak mencetak ringkasan tes di akhir tes. Ini karena (saya pikir) pengaturan Jest default menggunakan dua reporter - DefaultReporter dan SummaryReporter.
Sekarang saya tidak dapat langsung mengimpor SummaryReporter dalam konfigurasi lelucon saya karena diekspor secara default dan sepertinya tidak dapat diimpor. Saya telah menyiasatinya dengan mengekspor ulang dari file lain.

//summary-reporter.js
const SummaryReporter = require('@jest/reporters/build/summary_reporter')
  .default;
module.exports = SummaryReporter;
//log-on-fail-reporter.js
Content: https://gist.github.com/GeeWee/71db0d9911b4a087e4b2486386168b05
Same as reporter above, but with updated import paths for the new jest structure

Konfigurasi lelucon

    "reporters": [
      "<rootDir>/src/test-reporters/log-on-fail-reporter.js",
      "<rootDir>/src/test-reporters/summary-reporter.js"
    ],

Sunting: Setelah bermain-main sebentar, saya melihat bahwa ini mencatat seluruh blok deskripsi, jika satu tes gagal.

kami akan memperbaiki dukungan untuk ekspor default untuk lelucon 25.

kamu juga bisa

//summary-reporter.js
const {SummaryReporter} = require('@jest/reporters')
module.exports = SummaryReporter;

Kami mungkin ingin menambahkan file @jest/reporters/SummaryReporter dll, jadi Anda tidak memerlukan file js perantara... Ingin membuka permintaan fitur terpisah untuk itu?

Mengapa permintaan fitur ini ditutup?
Tampaknya banyak orang merasa masuk akal untuk memasukkan fitur ini dalam lelucon yang tidak biasa. Setidaknya sebagai opsi konfigurasi.
Bisakah kamu @kumar303 membukanya lagi?

Bisakah kamu @kumar303 membukanya lagi?

Heh. Tidak, saya tidak punya akses. Ini adalah alasan untuk menutup: https://github.com/facebook/jest/issues/4156#issuecomment -324638718 Saya setuju bahwa ini adalah fitur penting. Saya terkejut bagaimana pengembang inti lelucon dapat hidup tanpanya, tetapi mungkin mereka tidak menulis kode dengan bug sehingga mereka tidak memerlukan log.

Silakan buka kembali. Kami membutuhkan ini juga.

Kenapa ini belum bisa?

Sepertinya fungsi tanpa otak bagi saya. Sebagian besar pengujian kami menghasilkan setidaknya satu halaman teks konsol masing-masing, sangat menjengkelkan harus mengarunginya untuk menemukan tes yang gagal

Saya tidak tahu cara lain untuk mendaftarkan dukungan saya untuk perilaku ini selain meninggalkan komentar. Saya tahu 👍 dan sejenisnya kurang bermanfaat jadi ini yang terbaik yang saya rasa bisa saya lakukan. Terima kasih untuk semuanya dari semua orang yang terlibat! Saya mengikuti semua utas dan saya menantikan ini setiap kali orang memiliki siklus untuk mendapatkan apa yang mereka inginkan lol.

Hal yang fitur ini belum diterapkan selama hampir tiga tahun, ketika ini diperlukan, agak aneh.

Berdasarkan cuplikan yang saya temukan di internet, saya menemukan konfigurasi global untuk ini; lihat https://stackoverflow.com/questions/58936650/javascript-jest-how-to-show-logs-from-test-case-only-when-test-fails/61909588#61909588

Semoga ini bisa membantu seseorang.

Mungkin ingin melihat https://github.com/AtakamaLLC/capio untuk pengambilan async.

Silakan buka kembali dan terapkan sebagai konfigurasi opsional.
Saya akan melakukannya sendiri jika ada peluang realistis untuk menerima PR.
Dalam pandangan saya, menulis reporter khusus untuk permintaan fitur "kecil" ini akan menjadi biaya pemeliharaan yang tidak berkelanjutan.

Meskipun permintaan fitur ini tidak "bersih" atau "konsisten", itu masih sangat dibutuhkan oleh banyak orang.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat