Executor de Teste
WARNING
Esta é uma API avançada. Se você está apenas executando testes, provavelmente não precisa disso. É utilizada principalmente por autores de bibliotecas.
Você pode especificar o caminho para seu executor de testes com a opção runner
no seu arquivo de configuração. Este arquivo deve ter uma exportação padrão com uma classe que implementa estes métodos:
export interface VitestRunner {
/**
* Primeira ação a ser executada antes de coletar e executar os testes.
*/
onBeforeCollect?(paths: string[]): unknown;
/**
* Chamado após coletar os testes e antes de "onBeforeRun".
*/
onCollected?(files: File[]): unknown;
/**
* Chamado quando o executor de testes deve cancelar as próximas execuções de teste.
* O executor deve responder a este método e marcar os testes e suítes como ignorados em
* "onBeforeRunSuite" e "onBeforeRunTest" quando for chamado.
*/
onCancel?(reason: CancelReason): unknown;
/**
* Chamado antes de executar um único teste. Ainda não possui "result".
*/
onBeforeRunTest?(test: Test): unknown;
/**
* Chamado antes de realmente executar a função de teste. Já possui "result" com "state" e "startTime".
*/
onBeforeTryTest?(test: Test, retryCount: number): unknown;
/**
* Chamado após o resultado e o estado serem definidos.
*/
onAfterRunTest?(test: Test): unknown;
/**
* Chamado logo após executar a função de teste. Ainda não tem novo estado. Não será chamado se a função de teste gerar uma exceção.
*/
onAfterTryTest?(test: Test, retryCount: number): unknown;
/**
* Chamado antes de executar uma única suíte. Ainda não possui "result".
*/
onBeforeRunSuite?(suite: Suite): unknown;
/**
* Chamado após executar uma única suíte. Tem estado e resultado.
*/
onAfterRunSuite?(suite: Suite): unknown;
/**
* Se definido, será chamado em vez da partição e tratamento usual da suíte do Vitest.
* Os hooks "before" e "after" não serão ignorados.
*/
runSuite?(suite: Suite): Promise<void>;
/**
* Se definido, será chamado em vez do tratamento usual do Vitest para testes. Útil se você tiver sua função de teste personalizada.
* Os hooks "before" e "after" não serão ignorados.
*/
runTest?(test: Test): Promise<void>;
/**
* Chamado quando uma tarefa é atualizada. O mesmo que "onTaskUpdate" em um notificador, mas isso está sendo executado na mesma thread que os testes.
*/
onTaskUpdate?(task: [string, TaskResult | undefined][]): Promise<void>;
/**
* Chamado antes de executar todos os testes nos caminhos coletados.
*/
onBeforeRun?(files: File[]): unknown;
/**
* Chamado logo após executar todos os testes nos caminhos coletados.
*/
onAfterRun?(files: File[]): unknown;
/**
* Chamado quando um novo contexto para um teste é definido. Útil se você deseja apenas adicionar propriedades personalizadas ao contexto.
* Se você deseja apenas definir um contexto personalizado com um executor, considere usar "beforeAll" em "setupFiles" em vez disso.
*/
extendTestContext?(context: TestContext): TestContext;
/**
* Chamado quando certos arquivos são importados. Pode ser chamado em duas situações: ao coletar testes e ao importar arquivos de setup.
*/
importFile(filepath: string, source: VitestRunnerImportSource): unknown;
/**
* Configuração disponível publicamente.
*/
config: VitestRunnerConfig;
}
Ao instanciar esta classe, o Vitest passa a configuração do Vitest. Você deve expô-la como uma propriedade config
.
WARNING
O Vitest também injeta uma instância de ViteNodeRunner
como a propriedade __vitest_executor
. Você pode usá-la para processar arquivos no método importFile
(este é o comportamento padrão de TestRunner
e BenchmarkRunner
).
ViteNodeRunner
expõe o método executeId
, que é usado para importar arquivos de teste em um ambiente amigável ao Vite. Isso significa que ele resolverá as importações e transformará o conteúdo do arquivo em tempo de execução para que o Node possa executá-lo.
TIP
O suporte a Snapshots e alguns outros recursos dependem do executor. Caso não queira perdê-los, você pode estender seu executor de VitestTestRunner
importado de vitest/runners
. Ele também expõe BenchmarkNodeRunner
se você quiser estender a funcionalidade de benchmark.
Sua Função de Tarefa
Você pode expandir o sistema de tarefas do Vitest com suas próprias tarefas. Uma tarefa é um objeto que faz parte de uma suíte. Ela é adicionada automaticamente à suíte atual através do método suite.custom
:
// ./utils/custom.js
import { getCurrentSuite, setFn } from 'vitest/suite';
export { describe, beforeAll, afterAll } from 'vitest';
// esta função será chamada quando o Vitest coletar tarefas
export const myCustomTask = function (name, fn) {
const task = getCurrentSuite().custom(name);
task.meta = {
customPropertyToDifferentiateTask: true,
};
setFn(task, fn || (() => {}));
};
// ./garden/tasks.test.js
import {
afterAll,
beforeAll,
describe,
myCustomTask,
} from '../utils/custom.js';
import { gardener } from './gardener.js';
describe('take care of the garden', () => {
beforeAll(() => {
gardener.putWorkingClothes();
});
myCustomTask('weed the grass', () => {
gardener.weedTheGrass();
});
myCustomTask('water flowers', () => {
gardener.waterFlowers();
});
afterAll(() => {
gardener.goHome();
});
});
vitest ./garden/tasks.test.js
WARNING
Caso não tenha um executor personalizado ou não tenha definido o método runTest
, o Vitest tentará recuperar uma tarefa automaticamente. Se você não adicionou uma função com setFn
, ele falhará.
TIP
O sistema de tarefas personalizadas suporta hooks e contextos. Para suportar o encadeamento de propriedades (como only
, skip
e as suas personalizadas), importe createChainable
de vitest/suite
e envolva sua função com ele. Nesse caso, você precisará chamar custom
como custom.call(this)
.