작업 메타데이터
WARNING
Vitest는 실험적인 비공개 API를 노출합니다. 하위 호환성을 깨는 변경 사항이 SemVer를 따르지 않을 수 있으므로, 사용할 때 Vitest 버전을 고정하는 것이 좋습니다.
사용자 정의 리포터를 개발하거나 Vitest Node.js API를 사용하는 경우, 다양한 컨텍스트에서 실행되는 테스트의 데이터를 리포터나 사용자 정의 Vitest 핸들러로 전달하는 것이 유용할 수 있습니다.
이를 위해 테스트 컨텍스트에 의존하는 것은 직렬화할 수 없으므로 사용할 수 없습니다. 그러나 Vitest를 사용하면 모든 작업(스위트 또는 테스트)에서 사용할 수 있는 meta
속성을 활용하여 테스트와 Node.js 프로세스 간에 데이터를 공유할 수 있습니다. 이 통신은 단방향이며, meta
속성은 오직 테스트 컨텍스트 내에서만 수정할 수 있다는 점에 유의해야 합니다. Node.js 컨텍스트 내에서 변경된 내용은 테스트에서 볼 수 없습니다.
테스트 스위트 작업의 경우 테스트 컨텍스트 또는 beforeAll
/afterAll
훅 내에서 meta
속성을 채울 수 있습니다.
afterAll(suite => {
suite.meta.done = true;
});
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler';
});
테스트가 완료되면 Vitest는 RPC를 사용하여 결과와 meta
를 포함한 작업을 Node.js 프로세스로 보내고, onTestCaseResult
및 작업에 접근 가능한 다른 훅을 통해 이를 보고합니다. 이 테스트 케이스를 처리하려면 리포터 구현에서 사용할 수 있는 onTestCaseResult
메서드를 사용할 수 있습니다.
import type { Reporter, TestCase, TestModule } from 'vitest/node';
export default {
onTestCaseResult(testCase: TestCase) {
// custom === 'some-custom-handler' ✅
const { custom } = testCase.meta();
},
onTestRunEnd(testModule: TestModule) {
testModule.meta().done === true;
testModule.children.at(0).meta().custom === 'some-custom-handler';
},
} satisfies Reporter;
주의
Vitest는 Node.js 프로세스와 통신하기 위해 다양한 메서드를 사용합니다.
- Vitest가 워커 스레드 안에서 테스트를 실행하는 경우, 메시지 포트를 통해 데이터를 보냅니다.
- Vitest가 자식 프로세스를 사용하는 경우, 데이터는
process.send
API를 통해 직렬화된 Buffer로 전송됩니다. - Vitest가 브라우저에서 테스트를 실행하는 경우, 데이터는 flatted 패키지를 사용하여 문자열로 변환됩니다.
이 속성은 json
리포터의 모든 테스트에도 포함되어 있으므로, 데이터가 JSON으로 직렬화될 수 있는지 확인해야 합니다.
또한, Error 속성을 설정하기 전에 직렬화했는지 확인해야 합니다.
테스트 실행이 완료되면 Vitest 상태에서도 이 정보를 얻을 수 있습니다.
const vitest = await createVitest('test');
const { testModules } = await vitest.start();
const testModule = testModules[0];
testModule.meta().done === true;
testModule.children.at(0).meta().custom === 'some-custom-handler';
TypeScript를 사용할 때 타입 정의를 확장하는 것도 가능합니다.
declare module 'vitest' {
interface TaskMeta {
done?: boolean;
custom?: string;
}
}