커스텀 풀
WARNING
이것은 고급 API입니다. 단순히 테스트를 실행하는 경우에는 필요하지 않을 가능성이 높습니다. 주로 라이브러리 개발자를 위한 기능입니다.
Vitest는 풀을 사용하여 테스트를 실행합니다. 기본적으로 다음과 같은 여러 풀이 제공됩니다.
threads
:node:worker_threads
를 사용하여 테스트를 실행합니다 (새 워커 컨텍스트를 통해 격리 제공).forks
:node:child_process
를 사용하여 테스트를 실행합니다 (새child_process.fork
프로세스로 격리 제공).vmThreads
:node:worker_threads
를 사용하여 테스트를 실행합니다 (단, 격리는 새 워커 컨텍스트 대신vm
모듈로 제공).browser
: 브라우저 제공자를 사용하여 테스트를 실행합니다.typescript
: 테스트에서 타입 검사를 실행합니다.
파일 경로를 지정하여 사용자 정의 풀을 정의할 수 있습니다.
import { defineConfig } from 'vitest/config';
// ---cut---
export default defineConfig({
test: {
// 기본적으로 모든 파일은 커스텀 풀을 사용하여 실행됩니다.
pool: './my-custom-pool.ts',
// `poolOptions` 객체를 사용하여 옵션을 설정할 수 있습니다.
poolOptions: {
myCustomPool: {
customProperty: true,
},
},
// 특정 파일 집합에만 풀을 지정할 수도 있습니다.
poolMatchGlobs: [['**/*.custom.test.ts', './my-custom-pool.ts']],
},
});
API
pool
옵션에 지정된 파일은 첫 번째 인수로 Vitest
인터페이스를 받는 함수(비동기 함수 가능)를 export해야 합니다. 이 함수는 ProcessPool
인터페이스를 준수하는 객체를 반환해야 합니다.
import { ProcessPool, WorkspaceProject } from 'vitest/node';
export interface ProcessPool {
name: string;
runTests: (
files: [project: WorkspaceProject, testFile: string][],
invalidates?: string[]
) => Promise<void>;
close?: () => Promise<void>;
}
이 함수는 서버 구성이 변경되지 않는 한 한 번만 호출됩니다. 일반적으로 이 함수 내에서 테스트에 필요한 모든 것을 초기화하고 runTests
호출 시 재사용하는 것이 효율적입니다.
Vitest는 새 테스트 실행이 예약될 때마다 runTests
를 호출합니다. files
배열이 비어 있으면 호출하지 않습니다. 첫 번째 인수는 튜플의 배열입니다. 각 튜플의 첫 번째 요소는 작업 공간 프로젝트에 대한 참조이고, 두 번째 요소는 테스트 파일의 절대 경로입니다. 파일은 runTests
가 호출되기 전에 sequencer
를 사용하여 정렬됩니다. 동일한 파일이 두 번 이상 나타날 수 있지만 (드물게), 항상 다른 프로젝트를 가리킵니다. 이는 vitest.workspace.ts
구성을 통해 가능합니다.
Vitest는 runTests
의 실행이 완료될 때까지 기다린 후 테스트 실행을 완료합니다 (즉, runTests
가 완료된 후에만 onFinished
이벤트를 발생시킵니다).
커스텀 풀을 사용하는 경우, 테스트 파일과 결과를 직접 제공해야 합니다. 이를 위해 vitest.state
를 참조하여 collectFiles
와 updateTasks
를 활용할 수 있습니다. Vitest는 @vitest/runner
패키지의 startTests
함수를 사용하여 이 작업을 수행합니다.
다른 프로세스 간에 통신하려면 vitest/node
에서 제공하는 createMethodsRPC
를 사용하여 메서드 객체를 생성하고, 원하는 통신 방식을 사용할 수 있습니다. 예를 들어, birpc
와 함께 WebSockets를 사용하려면 다음과 같이 작성할 수 있습니다.
import { createBirpc } from 'birpc';
import { parse, stringify } from 'flatted';
import { WorkspaceProject, createMethodsRPC } from 'vitest/node';
function createRpc(project: WorkspaceProject, wss: WebSocketServer) {
return createBirpc(createMethodsRPC(project), {
post: msg => wss.send(msg),
on: fn => wss.on('message', fn),
serialize: stringify,
deserialize: parse,
});
}
모든 테스트가 수집되었는지 확인하려면 ctx.state.collectFiles
를 호출하고, Vitest 보고자에게 결과를 보고해야 합니다.
async function runTests(project: WorkspaceProject, tests: string[]) {
// ... 테스트를 실행하고 결과를 "files" 및 "tasks"에 저장
const methods = createMethodsRPC(project);
await methods.onCollected(files);
// 대부분의 보고자는 "onTaskUpdate"를 통해 업데이트되는 결과에 의존합니다.
await methods.onTaskUpdate(tasks);
}
pool/custom-pool.ts에서 간단한 예제를 확인할 수 있습니다.