Reporteros
WARNING
Esta es una API avanzada. Si solo desea configurar los reporteros incorporados, consulte la guía "Reporteros".
Vitest tiene su propio ciclo de vida de ejecución de pruebas, representado por los siguientes métodos de reportero:
onInit
onTestRunStart
onTestRunEnd
Las pruebas y suites dentro de un mismo módulo se reportarán en orden, a menos que hayan sido omitidas. Todas las pruebas omitidas se reportan al final de la suite/módulo.
Tenga en cuenta que, dado que los módulos de prueba pueden ejecutarse en paralelo, Vitest los reportará de forma paralela.
Esta guía enumera todos los métodos de reportero compatibles. Sin embargo, no olvide que en lugar de crear su propio reportero, puede extender uno existente:
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>;
Este método se invoca cuando Vitest se inicializa o arranca, pero antes de que las pruebas sean filtradas.
INFO
Internamente, este método se llama dentro de vitest.start
, vitest.init
o vitest.mergeReports
. Si está utilizando la API programática, asegúrese de invocar cualquiera de ellos según sus necesidades antes de llamar a vitest.runTestSpecifications
, por ejemplo. La CLI incorporada siempre ejecutará los métodos en el orden correcto.
Tenga en cuenta que también puede acceder a la instancia vitest
desde los casos de prueba, suites y módulos de prueba a través de la propiedad project
, pero también puede ser útil almacenar una referencia a vitest
en este método.
Ejemplo
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,
'archivos de prueba se ejecutarán en el directorio',
this.vitest.config.root
);
}
}
export default new MyReporter();
onBrowserInit experimental
function onBrowserInit(project: TestProject): Awaitable<void>;
Este método se invoca cuando se inicia la instancia del navegador. Recibe una instancia del proyecto para el cual se inicia el navegador. project.browser
siempre estará definido cuando se llame a este método.
onTestRunStart
function onTestRunStart(specifications: TestSpecification[]): Awaitable<void>;
Este método se invoca cuando ha comenzado una nueva ejecución de prueba. Recibe un array de especificaciones de prueba programadas para ejecutarse. Este array es de solo lectura y está disponible únicamente con fines informativos.
Si Vitest no encuentra ningún archivo de prueba para ejecutar, este evento se invocará con un array vacío, y luego se llamará a onTestRunEnd
inmediatamente después.
Ejemplo
import type { Reporter, TestSpecification } from 'vitest/node';
class MyReporter implements Reporter {
onTestRunStart(specifications: TestSpecification[]) {
console.log(specifications.length, 'archivos de prueba a ejecutar');
}
}
export default new MyReporter();
AVISO DE DEPRECIACIÓN
Este método se añadió en Vitest 3, reemplazando a onPathsCollected
y onSpecsCollected
, ambos ahora deprecados.
onTestRunEnd
function onTestRunEnd(
testModules: ReadonlyArray<TestModule>,
unhandledErrors: ReadonlyArray<SerializedError>,
reason: TestRunEndReason
): Awaitable<void>;
Este método se invoca después de que todas las pruebas hayan terminado de ejecutarse y la cobertura haya fusionado todos los informes, si esta está habilitada. Tenga en cuenta que puede obtener la información de cobertura en el hook onCoverage
.
Recibe una lista de módulos de prueba de solo lectura. Puede iterar sobre ella a través de la propiedad testModule.children
para informar el estado y los errores, si los hubiera.
El segundo argumento es una lista de solo lectura de errores no manejados que Vitest no pudo atribuir a ninguna prueba. Estos pueden ocurrir fuera de la ejecución de la prueba debido a un error en un plugin, o dentro de la ejecución de la prueba como un efecto secundario de una función no esperada (por ejemplo, un tiempo de espera que lanzó un error después de que la prueba haya terminado de ejecutarse).
El tercer argumento indica por qué finalizó la ejecución de la prueba:
passed
: la ejecución de la prueba finalizó normalmente y no hay erroresfailed
: la ejecución de la prueba tiene al menos un error (debido a un error de sintaxis durante la recopilación o un error real durante la ejecución de la prueba)interrupted
: la prueba fue interrumpida por la llamada avitest.cancelCurrentRun
o se presionóCtrl+C
en la terminal (tenga en cuenta que aún es posible tener pruebas fallidas en este caso)
Si Vitest no encuentra ningún archivo de prueba para ejecutar, este evento se invocará con arrays vacíos de módulos y errores, y el estado dependerá del valor de config.passWithNoTests
.
Ejemplo
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, 'se ejecutó correctamente'));
} else if (reason === 'failed') {
// note that this will skip possible errors in suites
// you can get them from testSuite.errors()
for (const testCase of testModules.children.allTests()) {
if (testCase.result().state === 'failed') {
console.log(
testCase.fullName,
'en el módulo',
testCase.module.moduleId,
'falló'
);
console.log(testCase.result().errors);
}
}
} else {
console.log('ejecución interrumpida, omitiendo informe');
}
}
}
export default new MyReporter();
AVISO DE DEPRECIACIÓN
Este método se añadió en Vitest 3, reemplazando a onFinished
, que ahora está deprecado.
onCoverage
function onCoverage(coverage: unknown): Awaitable<void>;
Este hook se invoca después de que los resultados de cobertura han sido procesados. Los reporteros del proveedor de cobertura se llaman después de este hook. Los tipos de coverage
dependen del coverage.provider
. Para los proveedores incorporados predeterminados de Vitest, puede importar los tipos del paquete istanbul-lib-coverage
:
import type { CoverageMap } from 'istanbul-lib-coverage';
declare function onCoverage(coverage: CoverageMap): Awaitable<void>;
Si Vitest no realiza ninguna cobertura, este hook no se invoca.
onTestModuleQueued
function onTestModuleQueued(testModule: TestModule): Awaitable<void>;
Este método se invoca justo antes de que Vitest importe el archivo de configuración y el propio módulo de prueba. Esto significa que testModule
aún no tendrá children
, pero puede comenzar a reportarlo como la próxima prueba a ejecutar.
onTestModuleCollected
function onTestModuleCollected(testModule: TestModule): Awaitable<void>;
Este método se invoca cuando todas las pruebas dentro del archivo han sido recolectadas, lo que significa que la colección testModule.children
está poblada, pero las pruebas aún no tienen ningún resultado.
onTestModuleStart
function onTestModuleStart(testModule: TestModule): Awaitable<void>;
Este método se invoca justo después de onTestModuleCollected
, a menos que Vitest se ejecute en modo de recolección (vitest.collect()
o vitest collect
en la CLI); en este caso, no se llamará en absoluto porque no hay pruebas que ejecutar.
onTestModuleEnd
function onTestModuleEnd(testModule: TestModule): Awaitable<void>;
Este método se invoca cuando cada prueba en el módulo ha terminado de ejecutarse. Esto significa que cada prueba dentro de testModule.children
tendrá un test.result()
que no será igual a pending
.
onHookStart
function onHookStart(context: ReportedHookContext): Awaitable<void>;
Este método se invoca cuando cualquiera de los siguientes hooks ha comenzado a ejecutarse:
beforeAll
afterAll
beforeEach
afterEach
Si beforeAll
o afterAll
se inician, la entity
será TestSuite
o TestModule
.
Si beforeEach
o afterEach
se inician, la entity
siempre será TestCase
.
WARNING
El método onHookStart
no se invocará si el hook no se ejecutó durante la ejecución de la prueba.
onHookEnd
function onHookEnd(context: ReportedHookContext): Awaitable<void>;
Este método se invoca cuando cualquiera de los siguientes hooks ha terminado de ejecutarse:
beforeAll
afterAll
beforeEach
afterEach
Si beforeAll
o afterAll
han terminado, la entity
será TestSuite
o TestModule
.
Si beforeEach
o afterEach
han terminado, la entity
siempre será TestCase
.
WARNING
El método onHookEnd
no se invocará si el hook no se ejecutó durante la ejecución de la prueba.
onTestSuiteReady
function onTestSuiteReady(testSuite: TestSuite): Awaitable<void>;
Este método se invoca antes de que la suite comience a ejecutar sus pruebas. Este método también se invoca si la suite es omitida.
Si el archivo no tiene ninguna suite, este método no se invocará. Considere usar onTestModuleStart
para cubrir este caso.
onTestSuiteResult
function onTestSuiteResult(testSuite: TestSuite): Awaitable<void>;
Este método se invoca después de que la suite ha terminado de ejecutar las pruebas. Este método también se invoca si la suite es omitida.
Si el archivo no tiene ninguna suite, este método no se invocará. Considere usar onTestModuleEnd
para cubrir este caso.
onTestCaseReady
function onTestCaseReady(testCase: TestCase): Awaitable<void>;
Este método se invoca antes de que la prueba comience a ejecutarse o si es omitida. Tenga en cuenta que los hooks beforeEach
y afterEach
se consideran parte de la prueba porque pueden influir en el resultado.
WARNING
Tenga en cuenta que es posible que testCase.result()
ya tenga el estado passed
o failed
cuando se invoca onTestCaseReady
. Esto puede ocurrir si la prueba se ejecuta demasiado rápido y tanto onTestCaseReady
como onTestCaseResult
son programados para ejecutarse en la misma microtarea.
onTestCaseResult
function onTestCaseResult(testCase: TestCase): Awaitable<void>;
Este método se invoca cuando la prueba ha terminado de ejecutarse o simplemente es omitida. Tenga en cuenta que esto se llamará después de que el hook afterEach
haya terminado, si los hubiera.
En este punto, testCase.result()
tendrá un estado definido.
onTestAnnotate 3.2.0+
function onTestAnnotate(
testCase: TestCase,
annotation: TestAnnotation
): Awaitable<void>;
El hook onTestAnnotate
está asociado con el método context.annotate
. Cuando se invoca annotate
, Vitest lo serializa y envía el mismo adjunto al hilo principal donde el reportero puede interactuar con él.
Si se especifica la ruta, Vitest la almacena en un directorio separado (configurado por attachmentsDir
) y modifica la propiedad path
para referenciarla.