Reporter
WARNING
Dies ist eine erweiterte API. Wenn Sie lediglich die integrierten Reporter konfigurieren möchten, lesen Sie bitte den Leitfaden "Reporter".
Vitest verfügt über einen eigenen Testlauf-Lebenszyklus, der durch die folgenden Reporter-Methoden abgebildet wird:
onInitonTestRunStartonTestRunEnd
Tests und Suiten innerhalb eines einzelnen Moduls werden der Reihe nach gemeldet, es sei denn, sie wurden übersprungen. Alle übersprungenen Tests werden am Ende der Suite/des Moduls aufgeführt.
Beachten Sie, dass Vitest Testmodule parallel meldet, da sie parallel ausgeführt werden können.
Dieser Leitfaden listet alle unterstützten Reporter-Methoden auf. Vergessen Sie jedoch nicht, dass Sie, anstatt einen eigenen Reporter zu erstellen, einen vorhandenen erweitern können:
import { BaseReporter } from 'vitest/reporters';
export default class CustomReporter extends BaseReporter {
onTestRunEnd(testModules, errors) {
console.log(testModules.length, 'tests finished running');
super.onTestRunEnd(testModules, errors);
}
}onInit
function onInit(vitest: Vitest): Awaitable<void>;Diese Methode wird aufgerufen, wenn Vitest initialisiert oder gestartet wurde, jedoch bevor die Tests gefiltert wurden.
INFO
Intern wird diese Methode innerhalb von vitest.start, vitest.init oder vitest.mergeReports aufgerufen. Wenn Sie die programmatische API verwenden, stellen Sie sicher, dass Sie je nach Ihren Anforderungen eine dieser Methoden aufrufen, bevor Sie beispielsweise vitest.runTestSpecifications aufrufen. Die integrierte CLI führt die Methoden immer in der korrekten Reihenfolge aus.
Beachten Sie, dass Sie auch über die Eigenschaft project von Testfällen, Suiten und Testmodulen auf die vitest-Instanz zugreifen können. Es kann jedoch auch nützlich sein, in dieser Methode eine Referenz auf vitest zu speichern.
Beispiel
import type { Reporter, TestSpecification, Vitest } from 'vitest/node';
class MyReporter implements Reporter {
private vitest!: Vitest;
onInit(vitest: Vitest) {
this.vitest = vitest;
}
onTestRunStart(specifications: TestSpecification[]) {
console.log(
specifications.length,
'Testdateien werden in',
this.vitest.config.root,
'ausgeführt'
);
}
}
export default new MyReporter();onBrowserInit experimentell
function onBrowserInit(project: TestProject): Awaitable<void>;Diese Methode wird aufgerufen, wenn die Browser-Instanz initialisiert wird. Sie erhält eine Instanz des Projekts, für das der Browser initialisiert wird. project.browser ist immer definiert, wenn diese Methode aufgerufen wird.
onTestRunStart
function onTestRunStart(specifications: TestSpecification[]): Awaitable<void>;Diese Methode wird aufgerufen, wenn ein neuer Testlauf gestartet wurde. Sie erhält ein Array von Testspezifikationen, die zur Ausführung geplant sind. Dieses Array ist schreibgeschützt und dient nur zu Informationszwecken.
Wenn Vitest keine Testdateien zum Ausführen gefunden hat, wird dieses Ereignis mit einem leeren Array aufgerufen, und anschließend wird onTestRunEnd sofort danach aufgerufen.
Beispiel
import type { Reporter, TestSpecification } from 'vitest/node';
class MyReporter implements Reporter {
onTestRunStart(specifications: TestSpecification[]) {
console.log(specifications.length, 'Testdateien werden ausgeführt');
}
}
export default new MyReporter();HINWEIS ZUR VERALTUNG
Diese Methode wurde in Vitest 3 hinzugefügt und ersetzt onPathsCollected und onSpecsCollected, die beide nun veraltet sind.
onTestRunEnd
function onTestRunEnd(
testModules: ReadonlyArray<TestModule>,
unhandledErrors: ReadonlyArray<SerializedError>,
reason: TestRunEndReason
): Awaitable<void>;Diese Methode wird aufgerufen, nachdem alle Tests abgeschlossen sind und die Code-Abdeckung alle Berichte zusammengeführt hat, sofern aktiviert. Beachten Sie, dass Sie die Code-Abdeckungsinformationen im Hook onCoverage erhalten können.
Sie erhält eine schreibgeschützte Liste von Testmodulen. Sie können diese über die Eigenschaft testModule.children durchlaufen, um den Status und eventuelle Fehler zu berichten.
Das zweite Argument ist eine schreibgeschützte Liste von unbehandelten Fehlern, die Vitest keinem Test zuordnen konnte. Diese können außerhalb des Testlaufs aufgrund eines Fehlers in einem Plugin oder innerhalb des Testlaufs als Nebeneffekt einer nicht-awaiteten Funktion auftreten (z. B. ein Timeout, der einen Fehler ausgelöst hat, nachdem der Test abgeschlossen war).
Das dritte Argument gibt an, warum der Testlauf beendet wurde:
passed: Der Testlauf wurde normal beendet und es gibt keine Fehler.failed: Der Testlauf hat mindestens einen Fehler (aufgrund eines Syntaxfehlers während der Sammlung oder eines tatsächlichen Fehlers während der Testausführung).interrupted: Der Testlauf wurde durch den Aufruf vonvitest.cancelCurrentRununterbrochen oderStrg+Cwurde im Terminal gedrückt (zu beachten ist, dass es in diesem Fall dennoch möglich ist, fehlgeschlagene Tests zu haben).
Wenn Vitest keine Testdateien zum Ausführen gefunden hat, wird dieses Ereignis mit leeren Arrays von Modulen und Fehlern aufgerufen, und der Status hängt vom Wert von config.passWithNoTests ab.
Beispiel
import type {
Reporter,
SerializedError,
TestModule,
TestRunEndReason,
TestSpecification,
} from 'vitest/node';
class MyReporter implements Reporter {
onTestRunEnd(
testModules: ReadonlyArray<TestModule>,
unhandledErrors: ReadonlyArray<SerializedError>,
reason: TestRunEndReason
) {
if (reason === 'passed') {
testModules.forEach(module => console.log(module.moduleId, 'war erfolgreich'));
} else if (reason === 'failed') {
// Hinweis: Dabei werden mögliche Fehler in Suiten nicht berücksichtigt
// Sie können diese von testSuite.errors() erhalten
for (const testCase of testModules.children.allTests()) {
if (testCase.result().state === 'failed') {
console.log(
testCase.fullName,
'in der',
testCase.module.moduleId,
'ist fehlgeschlagen'
);
console.log(testCase.result().errors);
}
}
} else {
console.log('Testlauf wurde unterbrochen, Berichterstattung entfällt');
}
}
}
export default new MyReporter();HINWEIS ZUR VERALTUNG
Diese Methode wurde in Vitest 3 hinzugefügt und ersetzt onFinished, die nun veraltet ist.
onCoverage
function onCoverage(coverage: unknown): Awaitable<void>;Dieser Hook wird aufgerufen, nachdem die Coverage-Ergebnisse verarbeitet wurden. Die Reporter des Coverage-Providers werden nach diesem Hook aufgerufen. Der Typ von coverage hängt vom coverage.provider ab. Für die standardmäßigen integrierten Provider von Vitest können Sie die Typen aus dem Paket istanbul-lib-coverage importieren:
import type { CoverageMap } from 'istanbul-lib-coverage';
declare function onCoverage(coverage: CoverageMap): Awaitable<void>;Wenn Vitest keine Abdeckung durchgeführt hat, wird dieser Hook nicht aufgerufen.
onTestModuleQueued
function onTestModuleQueued(testModule: TestModule): Awaitable<void>;Diese Methode wird aufgerufen, unmittelbar bevor Vitest die Setup-Datei und das Testmodul selbst importiert. Das bedeutet, dass testModule noch keine children haben wird, aber Sie können es als nächstes auszuführendes Testmodul berichten.
onTestModuleCollected
function onTestModuleCollected(testModule: TestModule): Awaitable<void>;Diese Methode wird aufgerufen, wenn alle Tests innerhalb der Datei gesammelt wurden, was bedeutet, dass die testModule.children-Sammlung gefüllt ist, die Tests jedoch noch keine Ergebnisse haben.
onTestModuleStart
function onTestModuleStart(testModule: TestModule): Awaitable<void>;Diese Methode wird direkt nach onTestModuleCollected aufgerufen, es sei denn, Vitest läuft im Sammlungsmodus (vitest.collect() oder vitest collect in der CLI). In diesem Fall wird sie überhaupt nicht aufgerufen, da keine Tests zur Ausführung anstehen.
onTestModuleEnd
function onTestModuleEnd(testModule: TestModule): Awaitable<void>;Diese Methode wird aufgerufen, wenn jeder Test im Modul abgeschlossen ist. Das bedeutet, dass jeder Test innerhalb von testModule.children ein test.result() haben wird, das nicht den Status pending hat.
onHookStart
function onHookStart(context: ReportedHookContext): Awaitable<void>;Diese Methode wird aufgerufen, wenn einer dieser Hooks gestartet wurde:
beforeAllafterAllbeforeEachafterEach
Wenn beforeAll oder afterAll gestartet werden, ist die entity entweder eine TestSuite oder ein TestModule.
Wenn beforeEach oder afterEach gestartet werden, ist die entity immer ein TestCase.
WARNING
Die Methode onHookStart wird nicht aufgerufen, wenn der Hook während des Testlaufs nicht durchlaufen wurde.
onHookEnd
function onHookEnd(context: ReportedHookContext): Awaitable<void>;Diese Methode wird aufgerufen, wenn einer dieser Hooks beendet wurde:
beforeAllafterAllbeforeEachafterEach
Wenn beforeAll oder afterAll beendet wurden, ist die entity entweder eine TestSuite oder ein TestModule.
Wenn beforeEach oder afterEach beendet wurden, ist die entity immer ein TestCase.
WARNING
Die Methode onHookEnd wird nicht aufgerufen, wenn der Hook während des Testlaufs nicht durchlaufen wurde.
onTestSuiteReady
function onTestSuiteReady(testSuite: TestSuite): Awaitable<void>;Diese Methode wird aufgerufen, bevor die Suite ihre Tests ausführt. Diese Methode wird auch aufgerufen, wenn die Suite übersprungen wurde.
Enthält die Datei keine Suiten, wird diese Methode nicht aufgerufen. Ziehen Sie die Verwendung von onTestModuleStart in Betracht, um diesen Anwendungsfall zu berücksichtigen.
onTestSuiteResult
function onTestSuiteResult(testSuite: TestSuite): Awaitable<void>;Diese Methode wird aufgerufen, nachdem die Suite ihre Tests beendet hat. Diese Methode wird auch aufgerufen, wenn die Suite übersprungen wurde.
Enthält die Datei keine Suiten, wird diese Methode nicht aufgerufen. Ziehen Sie die Verwendung von onTestModuleEnd in Betracht, um diesen Anwendungsfall zu berücksichtigen.
onTestCaseReady
function onTestCaseReady(testCase: TestCase): Awaitable<void>;Diese Methode wird aufgerufen, bevor der Test gestartet oder übersprungen wurde. Beachten Sie, dass beforeEach- und afterEach-Hooks als Teil des Tests gelten, da sie das Ergebnis beeinflussen können.
WARNING
Beachten Sie, dass testCase.result() bereits den Status passed oder failed haben kann, wenn onTestCaseReady aufgerufen wird. Dies kann passieren, wenn der Test zu schnell lief und sowohl onTestCaseReady als auch onTestCaseResult im selben Microtask ausgeführt werden sollten.
onTestCaseResult
function onTestCaseResult(testCase: TestCase): Awaitable<void>;Diese Methode wird aufgerufen, wenn der Test abgeschlossen oder übersprungen wurde. Beachten Sie, dass dies nach Abschluss des afterEach-Hooks aufgerufen wird, sofern vorhanden.
Zu diesem Zeitpunkt hat testCase.result() einen Status, der nicht pending ist.
onTestAnnotate 3.2.0+
function onTestAnnotate(
testCase: TestCase,
annotation: TestAnnotation
): Awaitable<void>;Der onTestAnnotate-Hook ist mit der Methode context.annotate verbunden. Wenn annotate aufgerufen wird, serialisiert Vitest es und sendet dieselbe Annotation an den Haupt-Thread, mit der der Reporter interagieren kann.
Wenn der Pfad angegeben ist, speichert Vitest ihn in einem separaten Verzeichnis (konfiguriert durch attachmentsDir) und passt die path-Eigenschaft an, um darauf zu verweisen.