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:
onInit
onTestRunStart
onTestRunEnd
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.cancelCurrentRun
unterbrochen oderStrg+C
wurde 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:
beforeAll
afterAll
beforeEach
afterEach
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:
beforeAll
afterAll
beforeEach
afterEach
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.