테스트 실행
WARNING
이 가이드는 Node.js 스크립트를 통해 테스트를 실행하기 위한 고급 API 사용법을 설명합니다. 단순히 테스트를 실행하려는 경우, 이 가이드는 필요하지 않을 수 있습니다. 주로 라이브러리 개발자가 사용합니다.
실험적인 API는 SemVer를 따르지 않을 수 있으므로, 해당 API를 사용할 때는 Vitest 버전을 명시적으로 지정(pin)해야 합니다.
Vitest는 두 가지 메서드를 통해 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
TestModule
, TestSuite
및 TestCase
API는 실험적이지 않으며 Vitest 2.1부터 SemVer를 따릅니다.
createVitest
테스트를 실행하지 않고 Vitest 인스턴스를 생성합니다.
createVitest
메서드는 필수 패키지 설치 여부를 확인하지 않습니다. 또한 config.standalone
또는 config.mergeReports
설정을 따르지 않습니다. watch
모드가 비활성화되어 있어도 Vitest는 자동으로 종료되지 않습니다.
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"
// `--changed` 옵션 사용 시 저장소가 초기화되지 않은 경우 "GitNotFoundError"
} finally {
await vitest.close();
}
Vitest 인스턴스를 유지하려면 최소한 init
을 호출해야 합니다. 이 메서드는 리포터와 커버리지 프로바이더를 초기화하지만, 어떤 테스트도 실행하지는 않습니다. Vitest 워처를 사용할 의도가 없더라도 인스턴스를 계속 실행하려면 watch
모드를 활성화하는 것이 좋습니다. Vitest는 일부 기능이 연속적인 프로세스에서 올바르게 작동하도록 이 플래그에 의존합니다.
리포터가 초기화된 후, 수동 실행이 필요한 경우 runTestSpecifications
또는 rerunTestSpecifications
를 사용하여 테스트를 실행할 수 있습니다:
watcher.on('change', async file => {
const specifications = vitest.getModuleSpecifications(file);
if (specifications.length) {
vitest.invalidateFile(file);
// "reporter.onWatcher*" 훅이 호출되지 않아야 하는 경우
// runTestSpecifications를 사용할 수 있습니다.
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);
}
});
워처를 비활성화해야 하는 경우, Vite 5.3부터 server.watch: null
또는 server.watch: { ignored: ['*/*'] }
를 Vite 설정에 전달할 수 있습니다:
await createVitest(
'test',
{},
{
plugins: [
{
name: 'stop-watcher',
async configureServer(server) {
await server.watcher.close();
},
},
],
server: {
watch: null,
},
}
);