사용자 지정 풀
WARNING
이 기능은 고급이며 매우 낮은 수준의 API입니다. 단순히 테스트를 실행하는 것이 목적이라면 이 기능이 필요하지 않을 수 있습니다. 주로 라이브러리 작성자가 사용합니다.
Vitest는 테스트를 풀(pool)에서 실행합니다. 기본적으로 여러 종류의 풀이 있습니다:
threads
:node:worker_threads
를 사용하여 테스트를 실행합니다 (새로운 워커 컨텍스트를 통해 격리를 제공합니다).forks
:node:child_process
를 사용하여 테스트를 실행합니다 (새로운child_process.fork
프로세스를 통해 격리를 제공합니다).vmThreads
:node:worker_threads
를 사용하여 테스트를 실행합니다 (하지만 새로운 워커 컨텍스트 대신vm
모듈을 통해 격리를 제공합니다).browser
: 브라우저 제공자를 사용하여 테스트를 실행합니다.typescript
: 테스트에 대한 타입 검사를 실행합니다.
파일 경로를 지정하여 자신만의 풀을 정의할 수 있습니다:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
// 기본적으로 모든 파일을 사용자 지정 풀에서 실행합니다.
pool: './my-custom-pool.ts',
// `poolOptions` 객체를 사용하여 옵션을 설정할 수 있습니다.
poolOptions: {
myCustomPool: {
customProperty: true,
},
},
},
});
다른 풀에서 테스트를 실행해야 하는 경우, projects
기능을 사용하세요:
export default defineConfig({
test: {
projects: [
{
extends: true,
test: {
pool: 'threads',
},
},
],
},
});
API
pool
옵션에 지정된 파일은 첫 번째 옵션으로 Vitest
인터페이스를 받는 함수(비동기일 수 있음)를 내보내야 합니다. 이 함수는 ProcessPool
인터페이스와 일치하는 객체를 반환해야 합니다:
import type { ProcessPool, TestSpecification } from 'vitest/node';
export interface ProcessPool {
name: string;
runTests: (
files: TestSpecification[],
invalidates?: string[]
) => Promise<void>;
collectTests: (
files: TestSpecification[],
invalidates?: string[]
) => Promise<void>;
close?: () => Promise<void>;
}
이 함수는 (서버 구성이 업데이트되지 않는 한) 한 번만 호출됩니다. 일반적으로 이 함수 내에서 테스트에 필요한 모든 것을 초기화한 후 runTests
가 호출될 때 재사용하는 것이 좋습니다.
Vitest는 새로운 테스트가 실행되도록 예약될 때 runTests
를 호출합니다. files
가 비어 있을 경우 호출되지 않습니다. 첫 번째 인수는 TestSpecifications 배열입니다. runTests
가 호출되기 전에 파일은 sequencer
를 사용하여 정렬됩니다. 동일한 파일이 두 번 나타날 수도 있지만(가능성은 낮음), 항상 다른 프로젝트를 가질 것입니다. 이는 projects
구성을 통해 구현됩니다.
Vitest는 runTests
가 실행을 완료할 때까지 기다린 후에야 실행을 완료합니다 (즉, runTests
가 해결된 후에만 onFinished
를 내보냅니다).
사용자 지정 풀을 사용하는 경우, 테스트 파일과 결과를 직접 제공해야 합니다. 이를 위해 vitest.state
를 참조할 수 있으며, 그 중 collectFiles
와 updateTasks
가 가장 중요합니다. Vitest는 @vitest/runner
패키지의 startTests
함수를 사용하여 이를 수행합니다.
Vitest는 vitest.collect
가 호출되거나 CLI 명령을 통해 vitest list
가 호출되면 collectTests
를 호출합니다. runTests
와 동일하게 작동하지만, 테스트 콜백을 실행하지 않고 vitest.state.collectFiles(files)
를 호출하여 해당 작업만 보고하면 됩니다.
다른 프로세스 간에 통신하려면 vitest/node
의 createMethodsRPC
를 사용하여 메서드 객체를 생성하고, 선호하는 모든 형태의 통신 방법을 사용할 수 있습니다. 예를 들어, birpc
와 함께 WebSockets를 사용하려면 다음과 같이 작성할 수 있습니다:
import { createBirpc } from 'birpc';
import { parse, stringify } from 'flatted';
import { createMethodsRPC, TestProject } from 'vitest/node';
function createRpc(project: TestProject, wss: WebSocketServer) {
return createBirpc(createMethodsRPC(project), {
post: msg => wss.send(msg),
on: fn => wss.on('message', fn),
serialize: stringify,
deserialize: parse,
});
}
테스트를 실행하지 않고 수집된 것으로 표시하는, 처음부터 직접 만든 간단한 풀의 예는 pool/custom-pool.ts에서 확인할 수 있습니다.