Skip to content
Vitest 2
Main Navigation 가이드API구성브라우저 모드고급
2.1.9
1.6.1
0.34.6

한국어

English
简体中文
繁體中文
Español
Français
Русский
Português – Brasil
Deutsch
日本語
Italiano
Polski
Türkçe
čeština
magyar

한국어

English
简体中文
繁體中文
Español
Français
Русский
Português – Brasil
Deutsch
日本語
Italiano
Polski
Türkçe
čeština
magyar

외관

Sidebar Navigation

Node API

테스트 러너

작업 메타데이터

리포터 확장하기

커스텀 풀

이 페이지에서

커스텀 풀 ​

WARNING

이것은 고급 API입니다. 단순히 테스트를 실행하려는 경우 필요하지 않을 수 있습니다. 주로 라이브러리 작성자가 사용합니다.

Vitest는 풀을 사용하여 테스트를 실행합니다. 기본적으로 다음과 같은 여러 풀이 제공됩니다.

  • threads: node:worker_threads를 사용하여 테스트를 실행합니다 (새 워커 컨텍스트를 통해 격리 제공).
  • forks: node:child_process를 사용하여 테스트를 실행합니다 (새 child_process.fork 프로세스로 격리 제공).
  • vmThreads: node:worker_threads를 사용하여 테스트를 실행합니다 (단, 격리는 새 워커 컨텍스트 대신 vm 모듈로 제공).
  • browser: 브라우저 제공자를 사용하여 테스트를 실행합니다.
  • typescript: 테스트에서 타입 검사를 실행합니다.

파일 경로를 지정하여 사용자 정의 풀을 정의할 수 있습니다.

ts
import { defineConfig } from 'vitest/config';

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 인터페이스를 준수하는 객체를 반환해야 합니다.

ts
import { ProcessPool, WorkspaceProject } from 'vitest/node';

export interface ProcessPool {
  name: string;
  runTests: (
    files: [project: WorkspaceProject, testFile: string][],
    invalidates?: string[]
  ) => Promise<void>;
  collectTests: (
    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.collect가 호출되거나 CLI 명령을 통해 vitest list가 호출되면 Vitest는 collectTests를 호출합니다. 이는 runTests와 동일한 방식으로 작동하지만 테스트 콜백을 실행할 필요 없이 vitest.state.collectFiles(files)를 호출하여 태스크를 보고하기만 하면 됩니다.

다른 프로세스 간에 통신하려면 vitest/node에서 제공하는 createMethodsRPC를 사용하여 메서드 객체를 생성하고, 원하는 통신 방식을 사용할 수 있습니다. 예를 들어, birpc와 함께 WebSockets를 사용하려면 다음과 같이 작성할 수 있습니다.

ts
import { createBirpc } from 'birpc';
import { parse, stringify } from 'flatted';
import { createMethodsRPC, WorkspaceProject } 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 보고자에게 결과를 보고해야 합니다.

ts
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에서 간단한 예제를 확인할 수 있습니다.

Pager
이전리포터 확장하기

MIT 라이선스 하에 배포되었습니다.

Copyright (c) 2024 Mithril Contributors

https://v2.vitest.dev/advanced/pool

MIT 라이선스 하에 배포되었습니다.

Copyright (c) 2024 Mithril Contributors