Spouštění testů
WARNING
Tato příručka vysvětluje, jak používat pokročilé API ke spouštění testů pomocí skriptu Node.js. Pokud chcete pouze spouštět testy, pravděpodobně ji nepotřebujete. Je určena především pro autory knihoven.
Zásadní změny nemusí dodržovat SemVer, proto při používání experimentálního API prosím zafixujte verzi Vitestu.
Vitest nabízí dvě metody pro svou inicializaci:
startVitest
inicializuje Vitest, ověří instalaci balíčků a okamžitě spustí testy.createVitest
pouze inicializuje Vitest, aniž by spouštěl testy.
startVitest
import { startVitest } from 'vitest/node';
const vitest = await startVitest(
'test',
[], // CLI filtry
{}, // přepsat testovací konfiguraci
{}, // přepsat konfiguraci Vite
{} // vlastní nastavení Vitestu
);
const testModules = vitest.state.getTestModules();
for (const testModule of testModules) {
console.log(testModule.moduleId, testModule.ok() ? 'passed' : 'failed');
}
TIP
Rozhraní TestModule
, TestSuite
a TestCase
nejsou experimentální a od verze Vitest 2.1 dodržují SemVer.
createVitest
Vytváří instanci Vitest, aniž by spouštěl testy.
Metoda createVitest
neověřuje instalaci požadovaných balíčků. Rovněž nerespektuje config.standalone
ani config.mergeReports
. Vitest se automaticky neukončí, ani když je watch
zakázán.
import { createVitest } from 'vitest/node';
const vitest = await createVitest(
'test',
{}, // přepsat testovací konfiguraci
{}, // přepsat konfiguraci Vite
{} // vlastní nastavení Vitestu
);
// voláno při zavolání `vitest.cancelCurrentRun()`
vitest.onCancel(() => {});
// voláno během `vitest.close()`
vitest.onClose(() => {});
// voláno, když Vitest znovu spouští testovací soubory
vitest.onTestsRerun(files => {});
try {
// toto nastaví process.exitCode na 1 v případě selhání testů,
// a proces se automaticky neuzavře
await vitest.start(['my-filter']);
} catch (err) {
// toto může vyhodit výjimku
// "FilesNotFoundError", pokud nebyly nalezeny žádné soubory
// "GitNotFoundError" s `--changed` a repozitář není inicializován
} finally {
await vitest.close();
}
Pokud plánujete zachovat instanci Vitest
, ujistěte se, že alespoň zavoláte init
. Tím se inicializují reportéry a nástroj pro pokrytí kódu, ale testy se nespustí. Doporučuje se také povolit režim watch
, i když nemáte v úmyslu používat sledování změn v Vitestu, ale chcete, aby instance zůstala spuštěná. Vitest se na tento příznak spoléhá pro správnou funkci některých svých vlastností v nepřetržitém procesu.
Po inicializaci reportérů použijte runTestSpecifications
nebo rerunTestSpecifications
pro ruční spuštění testů, pokud je to nutné:
watcher.on('change', async file => {
const specifications = vitest.getModuleSpecifications(file);
if (specifications.length) {
vitest.invalidateFile(file);
// můžete použít runTestSpecifications, pokud by se neměly spouštět
// háčky "reporter.onWatcher*"
await vitest.rerunTestSpecifications(specifications);
}
});
WARNING
Výše uvedený příklad ukazuje potenciální scénář použití, pokud zakážete výchozí chování watcheru. Ve výchozím nastavení Vitest již testy znovu spouští, pokud se soubory změní.
Pozor také na to, že getModuleSpecifications
nenajde testovací soubory, pokud již nebyly zpracovány globTestSpecifications
. Pokud byl soubor nově vytvořen, použijte místo toho 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);
}
});
Pokud potřebujete zakázat watcher, můžete od Vite 5.3 předat server.watch: null
nebo server.watch: { ignored: ['*/*'] }
do konfigurace Vite:
await createVitest(
'test',
{},
{
plugins: [
{
name: 'stop-watcher',
async configureServer(server) {
await server.watcher.close();
},
},
],
server: {
watch: null,
},
}
);