Reportery
WARNING
To jest zaawansowane API. Jeśli chcesz tylko skonfigurować wbudowane reportery, przeczytaj przewodnik "Reportery".
Vitest posiada własny cykl życia przebiegu testów, który jest reprezentowany przez następujące metody reporterów:
onInit
onTestRunStart
onTestRunEnd
Testy i zestawy w pojedynczym module będą raportowane w kolejności, chyba że zostały pominięte. Wszystkie pominięte testy są raportowane na końcu zestawu/modułu.
Należy pamiętać, że moduły testowe mogą działać równolegle, więc Vitest będzie je raportować równolegle.
Ten przewodnik wymienia wszystkie obsługiwane metody reportera. Jednak zamiast tworzyć własny reporter, możesz rozszerzyć istniejący:
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>;
Ta metoda jest wywoływana, gdy Vitest został zainicjowany lub uruchomiony, ale zanim testy zostały przefiltrowane.
INFO
Wewnętrznie ta metoda jest wywoływana wewnątrz vitest.start
, vitest.init
lub vitest.mergeReports
. Jeśli używasz programistycznego API, upewnij się, że wywołasz jedną z nich w zależności od swoich potrzeb, zanim wywołasz na przykład vitest.runTestSpecifications
. Wbudowany CLI zawsze uruchamia metody w prawidłowej kolejności.
Możesz również uzyskać dostęp do instancji vitest
z przypadków testowych, zestawów i modułów testowych za pośrednictwem właściwości project
, ale przechowywanie odniesienia do vitest
w tej metodzie może być również przydatne.
Przykład
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,
'test files will run in',
this.vitest.config.root
);
}
}
export default new MyReporter();
onBrowserInit eksperymentalny
function onBrowserInit(project: TestProject): Awaitable<void>;
Ta metoda jest wywoływana podczas inicjowania instancji przeglądarki. Otrzymuje instancję projektu, dla którego przeglądarka jest inicjowana. Właściwość project.browser
zawsze będzie zdefiniowana, gdy ta metoda zostanie wywołana.
onTestRunStart
function onTestRunStart(specifications: TestSpecification[]): Awaitable<void>;
Ta metoda jest wywoływana, gdy rozpoczyna się nowe uruchomienie testów. Otrzymuje tablicę specyfikacji testowych zaplanowanych do uruchomienia. Ta tablica jest tylko do odczytu i dostępna wyłącznie w celach informacyjnych.
Jeśli Vitest nie znalazł żadnych plików testowych do uruchomienia, to zdarzenie zostanie wywołane z pustą tablicą, a następnie onTestRunEnd
zostanie wywołane natychmiast po tym.
Przykład
import type { Reporter, TestSpecification } from 'vitest/node';
class MyReporter implements Reporter {
onTestRunStart(specifications: TestSpecification[]) {
console.log(specifications.length, 'test files will run');
}
}
export default new MyReporter();
UWAGA O DEPREKACJI
Ta metoda została dodana w Vitest 3, zastępując onPathsCollected
i onSpecsCollected
, z których obie są teraz przestarzałe.
onTestRunEnd
function onTestRunEnd(
testModules: ReadonlyArray<TestModule>,
unhandledErrors: ReadonlyArray<SerializedError>,
reason: TestRunEndReason
): Awaitable<void>;
Ta metoda jest wywoływana po zakończeniu wszystkich testów i scaleniu wszystkich raportów pokrycia, jeśli jest włączone. Należy pamiętać, że informacje o pokryciu można uzyskać w zaczepie onCoverage
.
Otrzymuje listę modułów testowych tylko do odczytu. Możesz iterować po niej za pomocą właściwości testModule.children
, aby zgłosić stan i ewentualne błędy.
Drugi argument to lista nieobsłużonych błędów tylko do odczytu, których Vitest nie był w stanie przypisać do żadnego testu. Mogą one wystąpić poza uruchomieniem testu z powodu błędu w wtyczce lub wewnątrz uruchomienia testu jako efekt uboczny funkcji, której wynik nie był oczekiwany (na przykład przekroczenie czasu, które zgłosiło błąd po zakończeniu testu).
Trzeci argument wskazuje, dlaczego uruchomienie testu zostało zakończone:
passed
: uruchomienie testu zakończyło się normalnie i nie ma błędówfailed
: uruchomienie testu ma co najmniej jeden błąd (z powodu błędu składni podczas zbierania lub rzeczywistego błędu podczas wykonywania testu)interrupted
: test został przerwany przez wywołanievitest.cancelCurrentRun
lub naciśniętoCtrl+C
w terminalu (należy pamiętać, że w tym przypadku nadal możliwe jest wystąpienie testów zakończonych niepowodzeniem)
Jeśli Vitest nie znalazł żadnych plików testowych do uruchomienia, to zdarzenie zostanie wywołane z pustymi tablicami modułów i błędów, a stan będzie zależał od wartości config.passWithNoTests
.
Przykład
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, 'succeeded'));
} else if (reason === 'failed') {
// Należy pamiętać, że to pominie możliwe błędy w zestawach.
// Możesz je uzyskać z testSuite.errors().
for (const testCase of testModules.children.allTests()) {
if (testCase.result().state === 'failed') {
console.log(
testCase.fullName,
'in',
testCase.module.moduleId,
'failed'
);
console.log(testCase.result().errors);
}
}
} else {
console.log('test run was interrupted, skipping report');
}
}
}
export default new MyReporter();
UWAGA O DEPREKACJI
Ta metoda została dodana w Vitest 3, zastępując onFinished
, która jest teraz przestarzała.
onCoverage
function onCoverage(coverage: unknown): Awaitable<void>;
Ten zaczep jest wywoływany po przetworzeniu wyników pokrycia. Reportery dostawcy pokrycia są wywoływane po tym zaczepie. Typowanie coverage
zależy od coverage.provider
. Dla domyślnych wbudowanych dostawców Vitest możesz zaimportować typy z pakietu istanbul-lib-coverage
:
import type { CoverageMap } from 'istanbul-lib-coverage';
declare function onCoverage(coverage: CoverageMap): Awaitable<void>;
Jeśli Vitest nie wykonał żadnego pokrycia, ten zaczep nie jest wywoływany.
onTestModuleQueued
function onTestModuleQueued(testModule: TestModule): Awaitable<void>;
Ta metoda jest wywoływana tuż przed zaimportowaniem przez Vitest pliku konfiguracyjnego i samego modułu testowego. Oznacza to, że testModule
nie będzie jeszcze miał żadnych children
, ale możesz zacząć raportować go jako następny test do uruchomienia.
onTestModuleCollected
function onTestModuleCollected(testModule: TestModule): Awaitable<void>;
Ta metoda jest wywoływana, gdy wszystkie testy w pliku zostały zebrane, co oznacza, że kolekcja testModule.children
jest wypełniona, ale testy nie mają jeszcze żadnych wyników.
onTestModuleStart
function onTestModuleStart(testModule: TestModule): Awaitable<void>;
Ta metoda jest wywoływana zaraz po onTestModuleCollected
, chyba że Vitest działa w trybie zbierania (vitest.collect()
lub vitest collect
w CLI), w tym przypadku nie zostanie w ogóle wywołana, ponieważ nie ma testów do uruchomienia.
onTestModuleEnd
function onTestModuleEnd(testModule: TestModule): Awaitable<void>;
Ta metoda jest wywoływana, gdy każdy test w module zakończył działanie. Oznacza to, że każdy test w testModule.children
będzie miał test.result()
, który nie jest równy pending
.
onHookStart
function onHookStart(context: ReportedHookContext): Awaitable<void>;
Ta metoda jest wywoływana, gdy którykolwiek z tych zaczepów rozpoczął działanie:
beforeAll
afterAll
beforeEach
afterEach
Jeśli beforeAll
lub afterAll
są uruchomione, entity
będzie albo TestSuite
albo TestModule
.
Jeśli beforeEach
lub afterEach
są uruchomione, entity
zawsze będzie TestCase
.
WARNING
Metoda onHookStart
nie zostanie wywołana, jeśli zaczep nie został uruchomiony podczas przebiegu testu.
onHookEnd
function onHookEnd(context: ReportedHookContext): Awaitable<void>;
Ta metoda jest wywoływana, gdy którykolwiek z tych zaczepów zakończył działanie:
beforeAll
afterAll
beforeEach
afterEach
Jeśli beforeAll
lub afterAll
zakończyły działanie, entity
będzie albo TestSuite
albo TestModule
.
Jeśli beforeEach
lub afterEach
zakończyły działanie, entity
zawsze będzie TestCase
.
WARNING
Metoda onHookEnd
nie zostanie wywołana, jeśli zaczep nie został uruchomiony podczas przebiegu testu.
onTestSuiteReady
function onTestSuiteReady(testSuite: TestSuite): Awaitable<void>;
Ta metoda jest wywoływana, zanim zestaw zacznie uruchamiać swoje testy. Ta metoda jest również wywoływana, jeśli zestaw został pominięty.
Jeśli plik nie ma żadnych zestawów, ta metoda nie zostanie wywołana. Rozważ użycie onTestModuleStart
, aby pokryć ten przypadek użycia.
onTestSuiteResult
function onTestSuiteResult(testSuite: TestSuite): Awaitable<void>;
Ta metoda jest wywoływana po zakończeniu uruchamiania testów przez zestaw. Ta metoda jest również wywoływana, jeśli zestaw został pominięty.
Jeśli plik nie ma żadnych zestawów, ta metoda nie zostanie wywołana. Rozważ użycie onTestModuleEnd
, aby pokryć ten przypadek użycia.
onTestCaseReady
function onTestCaseReady(testCase: TestCase): Awaitable<void>;
Ta metoda jest wywoływana, zanim test zacznie działać lub zostanie pominięty. Należy pamiętać, że zaczepy beforeEach
i afterEach
są uważane za część testu, ponieważ mogą wpływać na jego wynik.
WARNING
Należy pamiętać, że możliwe jest, aby testCase.result()
miał już stan passed
lub failed
, gdy wywoływana jest onTestCaseReady
. Może się to zdarzyć, jeśli test działał zbyt szybko i zarówno onTestCaseReady
, jak i onTestCaseResult
zostały zaplanowane do uruchomienia w tej samej mikrozadaniu.
onTestCaseResult
function onTestCaseResult(testCase: TestCase): Awaitable<void>;
Ta metoda jest wywoływana, gdy test zakończył działanie lub został po prostu pominięty. Należy pamiętać, że zostanie to wywołane po zakończeniu zaczepu afterEach
, jeśli takie istnieją.
W tym momencie testCase.result()
będzie miał stan inny niż pending
.
onTestAnnotate 3.2.0+
function onTestAnnotate(
testCase: TestCase,
annotation: TestAnnotation
): Awaitable<void>;
Zaczep onTestAnnotate
jest powiązany z metodą context.annotate
. Gdy annotate
jest wywoływane, Vitest serializuje je i wysyła ten sam załącznik do głównego wątku, gdzie reporter może z nim współdziałać.
Jeśli ścieżka jest określona, Vitest przechowuje ją w osobnym katalogu (skonfigurowanym przez attachmentsDir
) i modyfikuje właściwość path
, aby się do niej odwoływać.