Quando migrar uma suíte Angular para Vitest

Vitest é o default test runner desde o Angular v21 (novembro/2025), mas suítes Karma/Jasmine existentes pedem filtro de migração. A documentação oficial de migração é explícita: 'Migrating an existing project to Vitest is considered experimental.' Doug Parker já anunciava a depreciação do Karma em abril/2023; o caminho foi longo.

Default não é obrigação

Para projetos novos do Angular CLI, Vitest é o default atual. Isso é um sinal forte sobre a direção dos testes no Angular. Não é a mesma coisa que dizer que toda suíte Karma/Jasmine existente deve migrar em uma branch.

Uma migração de test runner só é bem-sucedida se o time confia no resultado depois. Se a migração deixa o CI mais rápido, mas ninguém acredita nas falhas ou nos passes, o projeto perdeu sinal.

A primeira fatia importa

CandidatoBoa primeira fatia?Por quê
Pipes purosSimPouca dependência de DOM e paridade fácil de assertions.
Services sem globais de browserSimFeedback rápido com setup simples.
Helpers de validaçãoSimÚtil para forms sem complexidade de UI.
Componentes pequenosTalvezBom se evitam overlays, animações e timers complexos.
Specs de overlay, canvas, drag/drop ou browser pesadoDepoisComeçam pelo caminho mais difícil da migração.

O que rodar primeiro

A primeira branch de migração deve provar configuração, comportamento no CI e um conjunto pequeno de padrões de teste. Não comece apagando Karma de uma aplicação grande.

O caminho oficial de migração inclui configuração manual, browser mode opcional e um schematic experimental para refatorar Jasmine para Vitest. Isso significa que todo diff gerado ainda precisa de review.

Comandos para um piloto pequeno de Vitestbash
npm install --save-dev vitest jsdom
ng test --no-watch
ng g @schematics/angular:refactor-jasmine-vitest --include=src/app/orders

O que me faria esperar

Espere se a suíte depende muito de fakeAsync, flush, APIs apenas de browser, launchers customizados de Karma ou setup global de teste que ninguém entende hoje. Isso não bloqueia para sempre, mas é um péssimo começo.

O guia oficial de migração para Vitest é explícito: helpers baseados em Zone.js, como fakeAsync, flush e waitForAsync, não são suportados. Exemplos novos nesta série devem preferir async nativo, assertions em Observables ou timers do Vitest, a menos que estejam claramente marcados como código Karma/Jasmine.

A proposta correta não é 'migrar todos os testes para Vitest'. É 'migrar esta fatia, comparar tempo e qualidade do CI, documentar padrões sem suporte e decidir a próxima fatia'.

Artefato para reaproveitar

Critérios de aceite para piloto Vitest

  • Uma fatia pequena migrada e revisada.
  • Tempo de CI comparado antes e depois.
  • Padrões sem suporte documentados, especialmente helpers de teste baseados em Zone.js.
  • Necessidade de browser mode decidida explicitamente.
  • Karma mantido até o time confiar no caminho novo.

Fontes consultadas

Modern Angular Playbook

Este artigo é um play.

O Playbook do Angular Moderno reúne o diagnóstico, a matriz de adoção, onze jogadas e o plano de 30 dias. Grátis, em inglês e português.

Você recebe os dois PDFs por email, pela lista do Dojo IA.

Abrir playbook →

André Ramosdisponível para vagas remotas, UTC−3Entre em contato →

Leia também

Guia · 8 min

Testando componentes no Angular com Vitest: TestBed, jsdom e browser mode

Como os testes de componente do Angular se comportam de verdade no Vitest: o TestBed não muda, o DOM é jsdom (sem layout, sem CSS de verdade), e os specs que precisam de um browser real são os que valem mover pro browser mode do Vitest.

Ler artigo →

Guia · 8 min

Mockando serviços e HttpClient no Angular com Vitest: vi.fn, spies e DI

O mapa de spies de Jasmine para Vitest nos testes Angular (vi.fn, vi.spyOn, mockReturnValue), por que um mock por DI vence o vi.mock para serviços, e como o HttpTestingController segue funcionando com provideHttpClientTesting.

Ler artigo →

Guia · 7 min

De Karma para Vitest no Angular: a config que realmente roda

O que o test target de Vitest do Angular v21 realmente é (uma linha), de onde vêm polyfills e styles, o install que tira o Karma, e as poucas opções que valem adicionar.

Ler artigo →