Репортеры
WARNING
Это расширенный API. Если вы просто хотите настроить встроенные репортеры, прочтите руководство "Репортеры".
Vitest имеет собственный жизненный цикл выполнения тестов, который представлен следующими методами репортера:
onInit
onTestRunStart
onTestRunEnd
Тесты и наборы в рамках одного модуля будут сообщаться последовательно, если они не были пропущены. Все пропущенные тесты сообщаются в конце набора/модуля.
Обратите внимание, что поскольку тестовые модули могут запускаться параллельно, Vitest будет сообщать о них параллельно.
В этом руководстве перечислены все поддерживаемые методы репортера. Однако не забывайте, что вместо создания собственного репортера вы можете расширить существующий:
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>;
Этот метод вызывается, когда Vitest был инициализирован или запущен, но до того, как тесты были отфильтрованы.
INFO
Внутри этот метод вызывается в vitest.start
, vitest.init
или vitest.mergeReports
. Если вы используете программный API, убедитесь, что вы вызываете один из них в зависимости от ваших потребностей, прежде чем вызывать, например, vitest.runTestSpecifications
. Встроенный CLI всегда будет запускать методы в правильном порядке.
Обратите внимание, что вы также можете получить доступ к экземпляру vitest
из тестовых случаев, наборов и тестовых модулей через свойство project
, но также может быть полезно сохранить ссылку на vitest
в этом методе.
Пример
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,
'файлы тестов будут запущены в',
this.vitest.config.root
);
}
}
export default new MyReporter();
onBrowserInit экспериментально
function onBrowserInit(project: TestProject): Awaitable<void>;
Этот метод вызывается при инициализации экземпляра браузера. Он получает экземпляр проекта, для которого инициализируется браузер. project.browser
всегда будет определен при вызове этого метода.
onTestRunStart
function onTestRunStart(specifications: TestSpecification[]): Awaitable<void>;
Этот метод вызывается при запуске нового тестового прогона. Он получает массив спецификаций тестов, запланированных к выполнению. Этот массив является только для чтения и доступен только для информационных целей.
Если Vitest не нашел тестовых файлов для запуска, это событие будет вызвано с пустым массивом, а затем сразу же будет вызван onTestRunEnd
.
Пример
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();
УВЕДОМЛЕНИЕ ОБ УСТАРЕВАНИИ
Этот метод был добавлен в Vitest 3, заменив onPathsCollected
и onSpecsCollected
, которые теперь устарели.
onTestRunEnd
function onTestRunEnd(
testModules: ReadonlyArray<TestModule>,
unhandledErrors: ReadonlyArray<SerializedError>,
reason: TestRunEndReason
): Awaitable<void>;
Этот метод вызывается после завершения всех тестов и объединения всех отчетов о покрытии, если оно включено. Обратите внимание, что информацию о покрытии можно получить в хуке onCoverage
.
Он получает список тестовых модулей, доступный только для чтения. Вы можете перебирать его через свойство testModule.children
, чтобы сообщить о состоянии и ошибках, если таковые имеются.
Второй аргумент — это список необработанных ошибок, доступный только для чтения, которые Vitest не смог отнести к какому-либо тесту. Они могут произойти вне тестового прогона из-за ошибки в плагине или внутри тестового прогона как побочный эффект не ожидаемой функции (например, тайм-аут, который вызвал ошибку после завершения теста).
Третий аргумент указывает, почему тестовый прогон был завершен:
passed
: тестовый прогон завершился нормально, и ошибок нетfailed
: тестовый прогон имеет хотя бы одну ошибку (из-за синтаксической ошибки во время сбора или фактической ошибки во время выполнения теста)interrupted
: тест был прерван вызовомvitest.cancelCurrentRun
или нажатиемCtrl+C
в терминале (обратите внимание, что в этом случае все еще возможно наличие неудачных тестов)
Если Vitest не нашел тестовых файлов для запуска, это событие будет вызвано с пустыми массивами модулей и ошибок, а состояние будет зависеть от значения config.passWithNoTests
.
Пример
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') {
// обратите внимание, что это может пропустить возможные ошибки в наборах
// вы можете получить их из 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();
УВЕДОМЛЕНИЕ ОБ УСТАРЕВАНИИ
Этот метод был добавлен в Vitest 3, заменив onFinished
, который теперь устарел.
onCoverage
function onCoverage(coverage: unknown): Awaitable<void>;
Этот хук вызывается после обработки результатов покрытия. Репортеры поставщика покрытия вызываются после этого хука. Типы coverage
зависят от coverage.provider
. Для встроенных поставщиков Vitest по умолчанию вы можете импортировать типы из пакета istanbul-lib-coverage
:
import type { CoverageMap } from 'istanbul-lib-coverage';
declare function onCoverage(coverage: CoverageMap): Awaitable<void>;
Если Vitest не выполнял никакого покрытия, этот хук не вызывается.
onTestModuleQueued
function onTestModuleQueued(testModule: TestModule): Awaitable<void>;
Этот метод вызывается непосредственно перед тем, как Vitest импортирует файл настройки и сам тестовый модуль. Это означает, что testModule
еще не будет иметь children
, но вы можете начать сообщать о нем как о следующем тесте для запуска.
onTestModuleCollected
function onTestModuleCollected(testModule: TestModule): Awaitable<void>;
Этот метод вызывается, когда все тесты внутри файла были собраны. Это означает, что коллекция testModule.children
заполнена, но тесты еще не имеют результатов.
onTestModuleStart
function onTestModuleStart(testModule: TestModule): Awaitable<void>;
Этот метод вызывается сразу после onTestModuleCollected
, если только Vitest не работает в режиме сбора (vitest.collect()
или vitest collect
в CLI), в этом случае он вообще не будет вызван, потому что нет тестов для запуска.
onTestModuleEnd
function onTestModuleEnd(testModule: TestModule): Awaitable<void>;
Этот метод вызывается после завершения выполнения каждого теста в модуле. Это означает, что каждый тест внутри testModule.children
будет иметь test.result()
, который не равен pending
.
onHookStart
function onHookStart(context: ReportedHookContext): Awaitable<void>;
Этот метод вызывается, когда любой из этих хуков начал выполнение:
beforeAll
afterAll
beforeEach
afterEach
Если запущены beforeAll
или afterAll
, entity
будет либо TestSuite
, либо TestModule
.
Если запущены beforeEach
или afterEach
, entity
всегда будет TestCase
.
WARNING
Метод onHookStart
не будет вызван, если хук не выполнялся во время тестового прогона.
onHookEnd
function onHookEnd(context: ReportedHookContext): Awaitable<void>;
Этот метод вызывается, когда любой из этих хуков завершил выполнение:
beforeAll
afterAll
beforeEach
afterEach
Если beforeAll
или afterAll
завершились, entity
будет либо TestSuite
, либо TestModule
.
Если beforeEach
или afterEach
завершились, entity
всегда будет TestCase
.
WARNING
Метод onHookEnd
не будет вызван, если хук не выполнялся во время тестового прогона.
onTestSuiteReady
function onTestSuiteReady(testSuite: TestSuite): Awaitable<void>;
Этот метод вызывается до того, как набор начнет выполнять свои тесты. Этот метод также вызывается, если набор пропущен.
Если файл не содержит никаких наборов, этот метод не будет вызван. Рассмотрите возможность использования onTestModuleStart
для охвата этого случая использования.
onTestSuiteResult
function onTestSuiteResult(testSuite: TestSuite): Awaitable<void>;
Этот метод вызывается после того, как набор завершил выполнение тестов. Этот метод также вызывается, если набор пропущен.
Если файл не содержит никаких наборов, этот метод не будет вызван. Рассмотрите возможность использования onTestModuleEnd
для охвата этого случая использования.
onTestCaseReady
function onTestCaseReady(testCase: TestCase): Awaitable<void>;
Этот метод вызывается до того, как тест начнет выполняться или был пропущен. Обратите внимание, что хуки beforeEach
и afterEach
считаются частью теста, потому что они могут влиять на результат.
WARNING
Обратите внимание, что возможно иметь testCase.result()
со статусом passed
или failed
уже при вызове onTestCaseReady
. Это может произойти, если тест выполнялся слишком быстро, и onTestCaseReady
, и onTestCaseResult
были запланированы для выполнения в одной и той же микрозадаче.
onTestCaseResult
function onTestCaseResult(testCase: TestCase): Awaitable<void>;
Этот метод вызывается, когда тест завершил выполнение или был просто пропущен. Обратите внимание, что это будет вызвано после завершения хука afterEach
, если таковые имеются.
На этом этапе testCase.result()
будет иметь состояние, отличное от pending
.
onTestAnnotate 3.2.0+
function onTestAnnotate(
testCase: TestCase,
annotation: TestAnnotation
): Awaitable<void>;
Хук onTestAnnotate
связан с методом context.annotate
. Когда вызывается annotate
, Vitest сериализует его и отправляет это вложение в основной поток, где репортер может взаимодействовать с ним.
Если указан путь, Vitest сохраняет его в отдельном каталоге (настраивается с помощью attachmentsDir
) и изменяет свойство path
для ссылки на него.