Jest: Konsolenprotokollierung für bestandene Tests ausblenden und bei Fehlern anzeigen

Erstellt am 28. Juli 2017  ·  47Kommentare  ·  Quelle: facebook/jest


Möchten Sie eine Funktion anfordern oder einen Fehler melden?

Besonderheit

Wie ist das aktuelle Verhalten?

Wenn Sie jest --watch ausführen, wird die Konsolenprotokollierung angezeigt (es sei denn, Sie verwenden --silent ).

Wenn das aktuelle Verhalten ein Fehler ist, geben Sie bitte die Schritte zum Reproduzieren an und stellen Sie entweder eine repl.it-Demo über https://repl.it/languages/jest oder ein minimales Repository auf GitHub bereit, das wir yarn install und yarn test .

Was ist das erwartete Verhalten?

Es wäre sehr hilfreich, die Konsolenprotokollierung nur für fehlgeschlagene Tests anzuzeigen, da Sie sie dann am meisten benötigen. Zum Bestehen von Tests können die Konsolenprotokolle ausgeblendet werden.

Bitte geben Sie Ihre genaue Jest-Konfiguration an und erwähnen Sie Ihre Jest-, Knoten-, Garn-/npm-Version und Ihr Betriebssystem.

$ 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,
};

Hilfreichster Kommentar

Zugegeben, ein Flag zum Ausblenden der Konsolenausgabe für den PASS-Test und das Belassen für den FAILED-Test wäre eine großartige Ergänzung, um die Testausgabe lesbarer zu machen

Alle 47 Kommentare

Sie können einen benutzerdefinierten Reporter schreiben. Cc @aaronabramov

Hallo, danke für die hilfreichen Infos.

Ich habe jedoch versucht, einen benutzerdefinierten Reporter zu schreiben, und bin auf ein paar Probleme gestoßen:

  • Es gibt keine einfache Möglichkeit, die gesamte Funktionalität des Standardreporters (informative Testausgabe usw.) zu übernehmen, und ich würde lieber nicht alles von Grund auf neu implementieren
  • Wenn ich den Standardreporter in meine Konfiguration einbeziehe, --silent in der CLI übergebe (damit der Standardreporter die Konsolenprotokollierung ausblendet) und meinen benutzerdefinierten Reporter zu meiner Konfiguration hinzufüge, sehe ich keinen einfachen Weg in meiner benutzerdefinierter Reporter, um die Protokollierung auszudrucken. Es scheint, dass die Reporterklassen aufgrund der Option --silent keinen Zugriff mehr auf die gepufferte Konsole haben.

Aus diesem Grund möchte ich Jest einen Patch vorschlagen, der einen Konfigurationswert einführt, um die Konsole nur bei fehlgeschlagenen Tests anzuzeigen. Würden Sie einen solchen Patch in Betracht ziehen?

Dies erfordert offensichtlich Tests und es muss nach einem Konfigurationswert gesucht werden, aber hier ist die allgemeine Idee (die funktioniert):

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 +

Ich mag diese Idee eigentlich, aber es gibt viele Dinge, die wir berücksichtigen müssen

wir müssen einige Informationen über die versteckte Ausgabe hinzufügen

PASS __tests__/my_test.js (hidden output)

Wir sollten es auch deaktivieren, wenn Sie einige Tests oder einen einzelnen Test ausführen (ich denke, es wird nur für einen vollständigen Testlauf aktiviert).

@cpojer hast du irgendwelche

Ich denke, dieses Verhalten ist verwirrend und ich würde es vorziehen, dass Jest unabhängig vom Zustand konsistent ist, was es pro Test ausgibt.

@cpojer für mich ist es verwirrend, Konsolennachrichten zu meinem fehlgeschlagenen Test zu finden :/ Wenn Sie bessere Möglichkeiten vorschlagen können, dies zu erreichen, tun Sie dies bitte.

Würden Sie als Kompromiss einen Patch akzeptieren, der DefaultReporter in jest.js verfügbar macht, damit ich ihn erweitern kann? Andernfalls müsste ich die Welt kopieren und einfügen, um diese Funktion in einem benutzerdefinierten Reporter zu implementieren.

So sieht meine Testausgabe aus:

screen shot 2017-11-05 at 16 11 29

Ich kann die Warnungen wegen https://github.com/facebook/flow/issues/4673 nicht loswerden, und zum Glück gibt es nur ein paar Log-Meldungen, aber wenn ich mehr Logging hinzufügen möchte, wird es viel schlimmer .

Ich unterstreiche , dass

Zugegeben, ein Flag zum Ausblenden der Konsolenausgabe für den PASS-Test und das Belassen für den FAILED-Test wäre eine großartige Ergänzung, um die Testausgabe lesbarer zu machen

Ich würde zustimmen. Ich arbeite derzeit an einem Projekt mit einer großen Gruppe von Tests und die Ausgabe von bestandenen Tests erschwert den Workflow beim Debuggen.

Einverstanden über das Flag, das die Konsolenausgabe für PASS-Tests ausblendet.

PASS __tests__/my_test.js (hidden output)

Können wir diese Ergänzung zufällig überdenken?

Wir haben jetzt eine Möglichkeit, nur fehlgeschlagene Tests durchzuführen, die diesen Anwendungsfall abdecken sollte. Siehe #4886 (erhältlich in Jest 22)

Wir haben jetzt eine Möglichkeit, nur fehlgeschlagene Tests durchzuführen, die diesen Anwendungsfall abdecken sollte.

Es deckt den Fall nur teilweise ab. Wenn beispielsweise 5 von 100 Tests in einer Suite mit vielen Protokollen fehlschlagen, könnten Sie nur die fehlgeschlagenen Tests erneut ausführen, um die Konsolenausgabe zu verstehen. Wenn Sie jedoch die Protokollierung für das Bestehen von Tests die ganze Zeit ausgeblendet hätten, hätten Sie die Tests nicht erneut ausführen müssen.

Das erneute Ausführen von nur fehlgeschlagenen Tests hat auch den Nachteil, dass neue Testfehler, die durch Codeänderungen eingeführt werden, nicht erfasst werden.

Wenn das Kernteam diese Funktion nicht implementieren möchte, könnte jemand meinen Vorschlag für einen Kompromiss prüfen? Dieser Vorschlag würde es mir erleichtern, einen benutzerdefinierten Reporter zu schreiben, um das Verbergen der Konsole zu implementieren. Ich kann den Patch erstellen, aber ich möchte keinen Pull-Request senden, wenn er nicht akzeptiert wird.

@kumar303 bitte senden Sie eine PR, scheint ziemlich unkompliziert zu pflegen :)

@kumar303 hast du am Ende eine PR eingereicht? Das hätte ich auch gerne.

Ich beabsichtige immer noch, eine einzureichen, aber ich habe keine Zeit zwischen meinen anderen Arbeitsschwerpunkten finden können. Wenn mich jemand übertrifft, lassen Sie es mich bitte wissen, damit ich Ihnen helfen kann, es auszuprobieren!

Meine Idee war, DefaultReporter aus jest.js zu exportieren, damit ein benutzerdefinierter Reporter es erweitern kann. Ich dachte daran, diese Zeile zunächst in etwas wie

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

Ich bin mir sicher, dass es danach noch mehr Optimierungen brauchen würde.

@kumar303 Wie kann ich Ihren Code zu meiner jest-Konfiguration hinzufügen?

Das interessiert mich auch. Der Idee von @kumar303 folgend konnte ich einen benutzerdefinierten Reporter schreiben, der default_reporter leicht genug erweitert (obwohl spröde, da ich ihn direkt aus jest-cli/build/reporters/default_reporter importiere) und dann result.console umwandeln

Es funktioniert bis auf eine Sache gut - wenn ein einzelner Test ausgeführt wird, werden Konsolennachrichten nicht gepuffert. Dies wird hier erwähnt: https://github.com/facebook/jest/issues/2080

In diesen Szenarien besteht also keine Möglichkeit, die Konsolenausgabe von einem benutzerdefinierten Reporter aus zu beeinflussen. Ich glaube also nicht, dass der ursprüngliche Vorschlag von

Gerne stellen wir unseren Standardreporter auf sauberere Weise zur Verfügung.

Haben Sie etwas dagegen, ein separates Thema zum Erzwingen der Pufferung von console.logs zu eröffnen? Sollte konsistent sein

Gibt es einen erheblichen Nachteil, eine globale Konfigurationsvariable wie showLogsForFailedTests: true ? Der Standardwert ändert nichts an der aktuellen Arbeitsweise von Jest und der Wert von false würde das Durchlesen von Tests viel angenehmer machen.

Ist dieses Problem geschlossen, weil etwas unternommen wurde, um es zu beheben, oder wird es geschlossen, weil über 30 Leute sich einbilden, ein Problem mit Jest zu haben, das sie eigentlich nicht haben?

Junge, ich dachte, dies ist so ziemlich ein Standardansatz, um nur fehlgeschlagene Protokolle zum Spaß anzuzeigen ... ist das immer noch ein Problem?

Brauche das. Es stört wirklich.

@willdurand Ich habe es mit deinem Reporter versucht. Ich bin mir nicht sicher, was ich falsch gemacht haben könnte, da ich nur diese Datei als Reporter ausgewählt habe. Es hat lediglich verhindert, dass dies am Ende der Tests angezeigt wird:

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

Alle Protokolle während der Tests wurden weiterhin angezeigt.

Hast du es vielleicht nur für einen einzigen Test ausgeführt? Siehe meinen vorherigen Kommentar und
zugehöriger Fehlerbericht. Es ist nicht möglich, Protokolle mit einem Reporter zu erfassen
Wenn nur ein Test durchgeführt wird, ist dies der eigentliche Knackpunkt.

Am Mittwoch, 8. August 2018, 19:08 Uhr schrieb jazoom [email protected] :

@willdurand https://github.com/willdurand Ich habe es mit deinem Reporter versucht. Ich bin
Ich bin mir nicht sicher, was ich falsch gemacht haben könnte, da ich nur diese Datei ausgewählt habe
als Reporter. Alles, was es tat, war zu verhindern, dass dies am Ende des
Prüfungen:

Testsuiten: 48 bestanden, 48 insgesamt
Tests: 78 bestanden, 78 insgesamt
Schnappschüsse: 73 bestanden, 73 insgesamt

Alle Protokolle während der Tests wurden weiterhin angezeigt.


Sie erhalten dies, weil Sie diesen Thread abonniert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/facebook/jest/issues/4156#issuecomment-411582223 oder stumm
der Faden
https://github.com/notifications/unsubscribe-auth/AAi-gO9_uEJPO4xnhkpfGore_hEX81fUks5uO29bgaJpZM4OnBQQ
.

@jamietre Ich habe es für genau den gleichen Befehl ausgeführt, den ich für den Test verwendet habe, der 48 Suiten

Bearbeiten: Zur Verdeutlichung habe ich den gleichen Befehl zweimal ausgeführt. Der einzige Unterschied zum benutzerdefinierten Reporter bestand darin, dass diese Zusammenfassung am Ende nicht gedruckt wurde:

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

@jazoom der Reporter hat keine Wirkung, wenn Sie verbose: true in Ihrer Konfiguration haben. Versuchen Sie, das auf false .

@jamietre Ich stimme zu. Es ist merkwürdig, dass ein einzelner Testlauf keinerlei Konsolenausgabe erfasst oder anzeigt (https://github.com/facebook/jest/issues/6441).

Es ist auch nicht hilfreich, wie Jest die Konsolenausgabe nicht nach Test gruppiert (https://github.com/facebook/jest/issues/2080). Ein benutzerdefinierter Reporter kann nur die Ausgabe für die Suite (dh eine Testdatei) anzeigen, keinen bestimmten fehlgeschlagenen Test.

@jazoom stelle auch sicher, dass du Jest nach der Installation oder Änderung des Reporters komplett neu

@kumar303 es ist nicht auf ausführlich eingestellt

Was meinst du mit "komplett neu starten"? Es ist nur ein Skript, das ausgeführt wird.

Was meinst du mit "komplett neu starten"?

Ich meinte, dass Sie den Modus verlassen müssen, wenn Sie sich im Watch-Modus von Scherz befinden.

Okay. Ich benutze den Watch-Modus nicht.

ach ja, in der Tat. Mir ist das nicht aufgefallen, aber aus irgendwelchen Gründen gibt Jest die abschließende Zusammenfassung nicht ganz unten aus, wenn alle Testsuiten ausgeführt wurden.

Ich nehme an, das liegt daran, dass wir die DefaultReporter und nicht die SummaryReporter , vielleicht..

@willdurand Ich habe Ihre Konfiguration ausprobiert, die die Protokolle erfolgreich

Hinweis: Wenn ich nur die Klasse DefaultReporter exportiere, greife ich auf die Standardprotokollierung zurück, aber auch auf den Protokollstapel

Ich habe ein bisschen mit dem FingersCrossedReporter von @kumar303 / @willdurand gespielt
Wie jedoch einige andere anmerkten, wird die Testzusammenfassung am Ende der Tests nicht gedruckt. Dies liegt daran, dass (glaube ich) die Standardeinstellungen von Jest zwei Reporter verwenden - den DefaultReporter und den SummaryReporter.
Jetzt kann ich den SummaryReporter nicht direkt in meine Scherzkonfiguration importieren, da er standardmäßig exportiert wird und das scheint nicht importiert zu werden. Ich habe es umgangen, indem ich es aus einer anderen Datei erneut exportiert habe.

//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

Jest-Konfiguration

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

Bearbeiten: Nachdem ich ein wenig damit herumgespielt habe, sehe ich, dass dies für den gesamten Beschreibungsblock protokolliert wird, wenn ein einzelner Test jedoch fehlschlägt.

Wir werden die Unterstützung für den Standardexport für jest 25 reparieren.

kannst du auch machen

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

Vielleicht möchten wir jedoch @jest/reporters/SummaryReporter etc-Dateien hinzufügen, damit Sie die zwischengeschaltete js-Datei nicht benötigen... Möchten Sie dafür eine separate Funktionsanfrage öffnen?

Warum ist diese Funktionsanfrage geschlossen?
Es scheint, dass viele Leute es vernünftig finden, diese Funktion in den Out-of-the-Box-Jest aufzunehmen. Zumindest als Konfigurationsoption.
Kannst du @kumar303 es wieder öffnen?

Kannst du @kumar303 es wieder öffnen?

He. Nein, ich habe keinen Zugriff. Dies war der Grund für die Schließung: https://github.com/facebook/jest/issues/4156#issuecomment -324638718 Ich stimme zu, dass dies eine wesentliche Funktion ist. Ich bin überrascht, wie Core-Jest-Entwickler ohne es leben können, aber vielleicht schreiben sie keinen Code mit Fehlern, also brauchen sie keine Protokolle.

Bitte wieder öffnen. Auch das brauchen wir.

Warum ist das noch nicht möglich?

Scheint mir eine einfache Funktionalität zu sein. Die meisten unserer Tests produzieren jeweils mindestens eine Seite Konsolentext

Ich kenne keine andere Möglichkeit, meine Unterstützung für dieses Verhalten zu registrieren, als einen Kommentar zu hinterlassen. Ich weiß, dass 👍 und dergleichen weniger nützlich sind, also ist dies das Beste, was ich tun kann. Danke für alles von allen Beteiligten! Ich habe alle Threads verfolgt und freue mich immer darauf, wenn Leute Zyklen haben, um den Leuten das zu besorgen, was sie wollen, lol.

Die Sache, dass diese Funktion seit fast drei Jahren nicht implementiert wurde, wenn dies erforderlich ist, ist irgendwie seltsam.

Basierend auf Schnipseln, die ich im Internet gefunden habe, habe ich eine globale Konfiguration dafür entwickelt; siehe https://stackoverflow.com/questions/58936650/javascript-jest-how-to-show-logs-from-test-case-only-when-test-fails/61909588#61909588

Hoffentlich hilft das jemandem.

Vielleicht möchten Sie einen Blick auf https://github.com/AtakamaLLC/capio für die asynchrone Erfassung werfen.

Bitte öffnen Sie sie erneut und implementieren Sie sie als optionale Konfiguration.
Ich würde es selbst machen, wenn es eine realistische Chance gibt, eine PR akzeptiert zu bekommen.
Meiner Ansicht nach wäre das Schreiben eines benutzerdefinierten Reporters für diese "winzige" Feature-Anfrage ein nicht nachhaltiger Wartungsaufwand.

Obwohl dieser Feature-Request weder "sauber" noch "konsistent" ist, wird er dennoch von vielen Leuten dringend benötigt.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen