Uruchamianie testów
WARNING
Ten przewodnik wyjaśnia, jak używać zaawansowanego API do uruchamiania testów za pośrednictwem skryptu Node.js. Jeśli chcesz po prostu uruchomić testy, prawdopodobnie nie potrzebujesz tego. Jest to używane głównie przez autorów bibliotek.
Zmiany wprowadzające niezgodność mogą nie być zgodne z SemVer. Zaleca się zablokowanie wersji Vitest podczas korzystania z eksperymentalnego API.
Vitest udostępnia dwie metody inicjalizacji:
startVitest
inicjuje Vitest, weryfikuje instalację pakietów i natychmiast uruchamia testy.createVitest
jedynie inicjuje Vitest, nie uruchamiając żadnych testów.
startVitest
import { startVitest } from 'vitest/node';
const vitest = await startVitest(
'test',
[], // Filtry CLI (wiersza poleceń)
{}, // nadpisanie konfiguracji testu
{}, // nadpisanie konfiguracji Vite
{} // własne opcje Vitest
);
const testModules = vitest.state.getTestModules();
for (const testModule of testModules) {
console.log(testModule.moduleId, testModule.ok() ? 'passed' : 'failed');
}
TIP
API TestModule
, TestSuite
i TestCase
nie są eksperymentalne i są zgodne z SemVer od Vitest 2.1.
createVitest
Tworzy instancję Vitest bez uruchamiania testów.
Metoda createVitest
nie weryfikuje, czy wymagane pakiety są zainstalowane. Nie obsługuje również config.standalone
ani config.mergeReports
. Vitest nie zostanie samoczynnie zamknięty, nawet jeśli tryb obserwacji (watch) jest wyłączony.
import { createVitest } from 'vitest/node';
const vitest = await createVitest(
'test',
{}, // nadpisanie konfiguracji testu
{}, // nadpisanie konfiguracji Vite
{} // własne opcje Vitest
);
// wywoływane, gdy zostanie wywołane `vitest.cancelCurrentRun()`
vitest.onCancel(() => {});
// wywoływane podczas wywoływania `vitest.close()`
vitest.onClose(() => {});
// wywoływane, gdy Vitest ponownie uruchamia pliki testowe
vitest.onTestsRerun(files => {});
try {
// to ustawi process.exitCode na 1, jeśli testy zakończą się niepowodzeniem,
// i nie zamknie automatycznie procesu
await vitest.start(['my-filter']);
} catch (err) {
// to może zgłosić błąd
// „FilesNotFoundError”, jeśli nie znaleziono plików
// „GitNotFoundError” z `--changed`, jeśli repozytorium nie jest zainicjowane
} finally {
await vitest.close();
}
Jeśli planujesz zachować instancję Vitest
, upewnij się, że przynajmniej wywołasz init
. Spowoduje to zainicjowanie modułów raportujących i dostawcy pokrycia kodu, ale nie uruchomi żadnych testów. Zaleca się również włączenie trybu watch
, nawet jeśli nie planujesz korzystać z obserwatora Vitest, ale chcesz, aby instancja działała. Vitest wykorzystuje tę flagę, aby niektóre z jego funkcji działały poprawnie w ciągłym procesie.
Po zainicjowaniu modułów raportujących, użyj runTestSpecifications
lub rerunTestSpecifications
, aby uruchomić testy, jeśli wymagane jest uruchomienie ręczne:
watcher.on('change', async file => {
const specifications = vitest.getModuleSpecifications(file);
if (specifications.length) {
vitest.invalidateFile(file);
// możesz użyć runTestSpecifications, jeśli punkty zaczepienia "reporter.onWatcher*"
// nie powinny być wywoływane
await vitest.rerunTestSpecifications(specifications);
}
});
WARNING
Powyższy przykład przedstawia potencjalny przypadek użycia, jeśli wyłączysz domyślne zachowanie obserwatora. Domyślnie Vitest już ponownie uruchamia testy, jeśli pliki się zmieniają.
Należy również zauważyć, że getModuleSpecifications
nie znajdzie plików testowych, chyba że zostały już przetworzone przez globTestSpecifications
. Jeśli plik został właśnie utworzony, użyj w zamian 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);
}
});
W sytuacjach, gdy trzeba wyłączyć obserwatora, możesz przekazać do konfiguracji Vite opcję server.watch: null
(dostępną od Vite 5.3) lub server.watch: { ignored: ['*/*'] }
:
await createVitest(
'test',
{},
{
plugins: [
{
name: 'stop-watcher',
async configureServer(server) {
await server.watcher.close();
},
},
],
server: {
watch: null,
},
}
);