Запуск тестов
WARNING
Это руководство объясняет, как использовать расширенный API для запуска тестов с помощью скрипта Node.js. Если вам просто нужно запустить тесты, то, вероятно, этот подход вам не потребуется. Он в основном используется авторами библиотек.
Критические изменения могут не следовать SemVer. Пожалуйста, закрепите версию Vitest при использовании экспериментального API.
Vitest предлагает два метода для инициализации:
startVitest
инициализирует Vitest, проверяет установку пакетов и немедленно запускает тесты.createVitest
только инициализирует Vitest и не запускает никаких тестов.
startVitest
import { startVitest } from 'vitest/node';
const vitest = await startVitest(
'test',
[], // CLI-фильтры
{}, // переопределение конфигурации тестов
{}, // переопределение конфигурации Vite
{} // пользовательские опции Vitest
);
const testModules = vitest.state.getTestModules();
for (const testModule of testModules) {
console.log(testModule.moduleId, testModule.ok() ? 'passed' : 'failed');
}
TIP
API TestModule
, TestSuite
и TestCase
не являются экспериментальными и соответствуют SemVer, начиная с Vitest 2.1.
createVitest
Создает экземпляр Vitest без запуска тестов.
Метод createVitest
не проверяет установку необходимых пакетов. Он также не учитывает config.standalone
или config.mergeReports
. Vitest не будет автоматически завершен, даже если watch
отключен.
import { createVitest } from 'vitest/node';
const vitest = await createVitest(
'test',
{}, // переопределение конфигурации тестов
{}, // переопределение конфигурации Vite
{} // пользовательские опции Vitest
);
// вызывается при вызове `vitest.cancelCurrentRun()`
vitest.onCancel(() => {});
// вызывается во время вызова `vitest.close()`
vitest.onClose(() => {});
// вызывается, когда Vitest перезапускает тестовые файлы
vitest.onTestsRerun(files => {});
try {
// это установит process.exitCode в 1, если тесты завершились неудачно,
// и не завершит процесс автоматически
await vitest.start(['my-filter']);
} catch (err) {
// это может выбросить ошибку:
// "FilesNotFoundError", если файлы не найдены
// "GitNotFoundError" с `--changed` и репозиторий не инициализирован
} finally {
await vitest.close();
}
Если вы собираетесь сохранить экземпляр Vitest
, убедитесь, что вы хотя бы вызвали init
. Это инициализирует репортеры и поставщика покрытия тестов, но не будет запускать тесты. Также рекомендуется включить режим watch
, даже если вы не собираетесь использовать наблюдатель Vitest, но хотите, чтобы экземпляр оставался активным. Vitest полагается на этот флаг для правильной работы некоторых своих функций в постоянно работающем процессе.
После инициализации репортеров используйте runTestSpecifications
или rerunTestSpecifications
для запуска тестов, если требуется ручной запуск:
watcher.on('change', async file => {
const specifications = vitest.getModuleSpecifications(file);
if (specifications.length) {
vitest.invalidateFile(file);
// вы можете использовать runTestSpecifications, если хуки "reporter.onWatcher*"
// не требуется вызывать
await vitest.rerunTestSpecifications(specifications);
}
});
WARNING
Приведенный выше пример демонстрирует потенциальный сценарий использования, если вы отключите поведение наблюдения по умолчанию. По умолчанию Vitest уже перезапускает тесты при изменении файлов.
Также обратите внимание, что getModuleSpecifications
не будет распознавать тестовые файлы, если они еще не были обработаны globTestSpecifications
. Если файл только что создан, используйте вместо этого project.matchesGlobPattern
:
watcher.on('add', async file => {
const specifications = [];
for (const project of vitest.projects) {
if (project.matchesGlobPattern(file)) {
specifications.push(project.createSpecification(file));
}
}
if (specifications.length) {
await vitest.rerunTestSpecifications(specifications);
}
});
Если вам нужно отключить наблюдатель, вы можете указать server.watch: null
начиная с Vite 5.3 или server.watch: { ignored: ['*/*'] }
в конфигурации Vite:
await createVitest(
'test',
{},
{
plugins: [
{
name: 'stop-watcher',
async configureServer(server) {
await server.watcher.close();
},
},
],
server: {
watch: null,
},
}
);