Tests ausführen
WARNING
Diese Anleitung erläutert die erweiterte API zur Ausführung von Tests über ein Node.js-Skript. Wenn Sie lediglich Tests ausführen möchten, ist dies wahrscheinlich nicht erforderlich. Sie wird primär von Bibliotheksautoren eingesetzt.
Breaking Changes halten sich möglicherweise nicht an SemVer. Bitte fixieren Sie die Vitest-Version, wenn Sie die experimentelle API verwenden.
Vitest bietet zwei Methoden zur Initialisierung:
startVitest
initialisiert Vitest, überprüft die Paketinstallation und führt Tests sofort aus.createVitest
initialisiert Vitest lediglich und führt keine Tests aus.
startVitest
import { startVitest } from 'vitest/node';
const vitest = await startVitest(
'test',
[], // CLI-Filter
{}, // Testkonfiguration überschreiben
{}, // Vite-Konfiguration überschreiben
{} // Benutzerdefinierte Vitest-Optionen
);
const testModules = vitest.state.getTestModules();
for (const testModule of testModules) {
console.log(testModule.moduleId, testModule.ok() ? 'bestanden' : 'fehlgeschlagen');
}
TIP
Die APIs TestModule
, TestSuite
und TestCase
sind nicht experimentell und entsprechen seit Vitest 2.1 SemVer.
createVitest
Erstellt eine Vitest-Instanz, ohne Tests auszuführen.
Die Methode createVitest
überprüft nicht, ob die erforderlichen Pakete installiert sind. Sie ignoriert auch config.standalone
oder config.mergeReports
. Vitest wird nicht automatisch beendet, selbst wenn der watch
-Modus deaktiviert ist.
import { createVitest } from 'vitest/node';
const vitest = await createVitest(
'test',
{}, // Testkonfiguration überschreiben
{}, // Vite-Konfiguration überschreiben
{} // Benutzerdefinierte Vitest-Optionen
);
// Wird aufgerufen, wenn `vitest.cancelCurrentRun()` ausgeführt wird
vitest.onCancel(() => {});
// Wird beim Aufruf von `vitest.close()` ausgelöst
vitest.onClose(() => {});
// Wird aufgerufen, wenn Vitest Testdateien erneut ausführt
vitest.onTestsRerun(files => {});
try {
// Dies setzt process.exitCode auf 1, falls Tests fehlschlagen,
// und schließt den Prozess nicht automatisch.
await vitest.start(['my-filter']);
} catch (err) {
// Dies kann eine Ausnahme werfen:
// "FilesNotFoundError", wenn keine Dateien gefunden wurden.
// "GitNotFoundError" mit `--changed` und das Repository nicht initialisiert ist.
} finally {
await vitest.close();
}
Wenn Sie die Vitest
-Instanz aktiv halten möchten, stellen Sie sicher, dass Sie zumindest init
aufrufen. Dies initialisiert die Reporter und den Coverage-Provider, führt jedoch keine Tests aus. Es wird auch empfohlen, den watch
-Modus zu aktivieren, selbst wenn Sie den Vitest-Watcher nicht nutzen möchten, die Instanz aber weiterhin betreiben wollen. Vitest ist auf dieses Flag angewiesen, damit einige seiner Funktionen in einem kontinuierlichen Prozess korrekt arbeiten.
Nachdem die Reporter initialisiert wurden, verwenden Sie runTestSpecifications
oder rerunTestSpecifications
, um Tests auszuführen, falls ein manueller Durchlauf notwendig ist:
watcher.on('change', async file => {
const specifications = vitest.getModuleSpecifications(file);
if (specifications.length) {
vitest.invalidateFile(file);
// Sie können `runTestSpecifications` verwenden, wenn die "reporter.onWatcher*"-Hooks
// nicht aufgerufen werden sollen.
await vitest.rerunTestSpecifications(specifications);
}
});
WARNING
Das obige Beispiel zeigt einen möglichen Anwendungsfall, falls Sie das Standard-Watcher-Verhalten deaktivieren. Standardmäßig führt Vitest Tests bereits erneut aus, sobald sich Dateien ändern.
Beachten Sie auch, dass getModuleSpecifications
Testdateien nur auflöst, wenn sie bereits von globTestSpecifications
verarbeitet wurden. Wurde die Datei gerade erst erstellt, verwenden Sie stattdessen 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);
}
});
Um den Watcher zu deaktivieren, können Sie seit Vite 5.3 server.watch: null
oder server.watch: { ignored: ['*/*'] }
in einer Vite-Konfiguration angeben:
await createVitest(
'test',
{},
{
plugins: [
{
name: 'stop-watcher',
async configureServer(server) {
await server.watcher.close();
},
},
],
server: {
watch: null,
},
}
);