작업 메타데이터
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는 결과와 meta
를 포함한 작업을 RPC를 통해 Node.js 프로세스로 보냅니다. 이 작업을 가로채서 처리하려면 리포터 구현에서 onTaskUpdate
메서드를 활용할 수 있습니다.
// custom-reporter.js
export default {
// 필요에 따라 패킷을 가로챌 수 있습니다.
onTaskUpdate(packs) {
const [id, result, meta] = packs[0]
},
// meta는 "onFinished" 내 모든 작업에 포함되어 있습니다.
onFinished(files) {
files[0].meta.done === true
files[0].tasks[0].meta.custom === 'some-custom-handler'
}
}
WARNING
Vitest는 짧은 시간 내에 여러 테스트가 완료되면 동시에 여러 작업을 보낼 수 있습니다.
BEWARE
Vitest는 Node.js 프로세스와 통신하기 위해 다음과 같은 다양한 방법을 사용합니다.
- Vitest가 워커 스레드 내에서 테스트를 실행하는 경우, 메시지 포트를 통해 데이터를 전송합니다.
- Vitest가 자식 프로세스를 사용하는 경우, 데이터는 process.send API를 통해 직렬화된 버퍼 형태로 전송됩니다.
- Vitest가 브라우저에서 테스트를 실행하는 경우, 데이터는 flatted 패키지를 사용하여 문자열로 변환됩니다.
일반적으로 함수, Promise, regexp (v8.stringify로는 직렬화할 수 없지만, 문자열 형태로 보내 Node.js 프로세스에서 직접 파싱할 수 있습니다.) 등 직렬화할 수 없는 데이터를 제외하고는 대부분의 데이터를 전송할 수 있습니다. 순환 참조가 있는 데이터도 가능합니다.
또한, 오류 속성을 설정하기 전에 반드시 직렬화를 수행해야 합니다.
테스트 완료 후 Vitest 상태를 통해 이 정보를 얻을 수도 있습니다.
const vitest = await createVitest('test')
await vitest.start()
vitest.state.getFiles()[0].meta.done === true
vitest.state.getFiles()[0].tasks[0].meta.custom === 'some-custom-handler'
TypeScript를 사용하는 경우 타입 정의를 확장할 수도 있습니다.
declare module 'vitest' {
interface TaskMeta {
done?: boolean
custom?: string
}
}