Vitest
Vitest oferece execuções de testes TypeScript rápidas, modo de observação, mocking e cobertura para backends Node que superam o node:test básico.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
npm install -D vitest @vitest/coverage-v8// vitest.config.ts
import { defineConfig } from "vitest/config";
export default defineConfig({
test: {
environment: "node",
include: ["test/**/*.test.ts", "src/**/*.test.ts"],
coverage: { provider: "v8", reporter: ["text", "lcov"] },
},
});{ "scripts": { "test": "vitest run", "test:watch": "vitest" } }Quando usar isso:
- Uso intensivo de
vi.mock()para APIs e bancos de dados externos. - Modo de observação durante TDD em serviços TypeScript.
- Limiares de cobertura em CI.
Exemplo de Trabalho
// src/users/client.ts
export async function fetchUser(id: string): Promise<{ id: string; name: string }> {
const res = await fetch(`https://api.example.com/users/${id}`);
if (!res.ok) throw new Error("erro upstream");
return res.json() as Promise<{ id: string; name: string }>;
}// test/users/client.test.ts
import { afterEach, describe, expect, it, vi } from "vitest";
import { fetchUser } from "../../src/users/client.js";
afterEach(() => vi.restoreAllMocks());
describe("fetchUser", () => {
it("retorna o json do usuário", async () => {
vi.stubGlobal(
"fetch",
vi.fn().mockResolvedValue({
ok: true,
json: async () => ({ id: "1", name: "Ada" }),
}),
);
await expect(fetchUser("1")).resolves.toEqual({ id: "1", name: "Ada" });
});
});# CI
- run: npm run test -- --coverageO que isso demonstra:
vi.stubGlobalsubstituifetchsem refatoração de injeção de dependência.vitest runpara passagem única para CI;vitestobserva localmente.- A cobertura V8 se integra com Codecov/Sonar.
Mergulho Profundo
Como Funciona
- Vitest usa o pipeline de transformação do Vite para transpilação rápida de TS (esbuild/swc).
- Compatível com a API semelhante ao Jest (
describe,it,expect,vi). environment: "node"evita jsdom, a menos que esteja testando o DOM.- Threads de pool executam arquivos de teste em paralelo.
Dicas de Configuração
| Opção | Propósito |
|---|---|
setupFiles | Configuração global de teste (variáveis de ambiente) |
testTimeout | Aumentar para testes de integração |
pool: "forks" | Isolar falhas de add-ons nativos |
Notas TypeScript
vitest/configtipadefineConfig.- Aliases de caminho do
tsconfigpodem ser conectados via pluginvite-tsconfig-paths, se necessário.
Armadilhas
- Misturar Vitest e node:test - Dois runners confundem os contribuidores. Correção: escolha um por repositório ou por pacote em um monorepo.
- Mocking de módulos ESM - Problemas de hoisting com
vi.mock. Correção: use a fábricavi.mocke importações dinâmicas após o mock. - Testes de integração no pool padrão - Condições de corrida de banco de dados. Correção:
vitest.integration.config.tsseparado comfileParallelism: false. - Cobertura em código apenas de ramificação - Falsa confiança. Correção: combine cobertura com testes de mutação ou asserções de comportamento com moderação.
- Instabilidade de Snapshot - Ruído de PR grande. Correção: prefira
toEqualexplícito em campos estáveis.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| node:test | Dependências zero, testes unitários simples | Necessidades de mocking intensivo |
| Jest | Suítes de brownfield existentes | Greenfield preferindo velocidade |
| tap | Consumidores TAP | Equipe quer a DX do Vitest |
FAQs
Vitest é apenas para frontends Vite?
Não. environment: "node" visa APIs e workers de backend.
Como faço mock de um módulo?
vi.mock("../src/db.js", () => ({ query: vi.fn() }));Vitest pode testar aplicativos Express?
Sim, com Supertest ou app.inject para Fastify. Exporte createApp() sem escutar.
Como defino limiares de cobertura?
coverage: { thresholds: { lines: 80, functions: 80 } }Funciona em monorepos?
vitest.config.ts por pacote ou configuração raiz com array projects.
Como testar serviços NestJS?
Use @nestjs/testing Test.createTestingModule dentro de blocos describe do Vitest.
Modo de observação no Docker?
DX ruim; use observação localmente, vitest run em contêineres.
ESM ou CJS?
Prefira projetos "type": "module"; Vitest lida com ESM nativamente no Node 24.
Como depuro um teste?
vitest --inspect-brk ou extensão Vitest do VS Code.
Paralelo ou serial?
describe.sequential ou configuração separada para suítes de integração de banco de dados.
Relacionado
- node:test & node:assert - alternativa de dependência zero
- Supertest & Integração HTTP - testes HTTP
- Melhores Práticas de Teste - comportamento sobre implementação
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (LTS Ativo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.