Workspace
Projeto de Exemplo
O Vitest oferece suporte integrado para monorepos através de um arquivo de configuração de workspace. Você pode criar um workspace para definir as configurações dos seus projetos.
Definindo um Workspace
Um workspace deve ter um arquivo vitest.workspace
ou vitest.projects
em sua raiz (na mesma pasta do seu arquivo de configuração principal, se você tiver um). O Vitest suporta extensões ts
/js
/json
para este arquivo.
O arquivo de configuração do workspace deve exportar por padrão uma lista de arquivos ou padrões globais que referenciam seus projetos. Por exemplo, se você tiver uma pasta chamada packages
que contém seus projetos, você pode definir um workspace com o seguinte arquivo de configuração:
export default ['packages/*'];
O Vitest tratará cada pasta em packages
como um projeto separado, mesmo que não possua um arquivo de configuração individual.
WARNING
O Vitest não considerará a configuração raiz como um projeto de workspace (portanto, não executará os testes especificados em include
), a menos que ela seja explicitamente especificada nesta configuração do workspace.
Você também pode referenciar projetos através de seus arquivos de configuração:
export default ['packages/*/vitest.config.{e2e,unit}.ts'];
Este padrão incluirá apenas projetos que possuam um arquivo vitest.config
com e2e
ou unit
antes da extensão.
WARNING
Se você estiver referenciando arquivos usando padrões glob, certifique-se de que o nome do arquivo de configuração comece com vite.config
ou vitest.config
. Caso contrário, o Vitest o ignorará.
Você também pode definir projetos com configuração inline. O arquivo de workspace suporta o uso de ambas as sintaxes simultaneamente.
import { defineWorkspace } from 'vitest/config';
// defineWorkspace oferece uma boa experiência de desenvolvimento com type hinting
export default defineWorkspace([
'packages/*',
{
// adicione "extends" para combinar duas configurações
extends: './vite.config.js',
test: {
include: ['tests/**/*.{browser}.test.{ts,js}'],
// recomenda-se definir um nome ao usar configurações inline
name: 'happy-dom',
environment: 'happy-dom',
},
},
{
test: {
include: ['tests/**/*.{node}.test.{ts,js}'],
name: 'node',
environment: 'node',
},
},
]);
WARNING
Todos os projetos devem ter nomes únicos. Caso contrário, o Vitest lançará um erro. Se você não fornecer um nome dentro da configuração inline, o Vitest atribuirá um número automaticamente. Se você não fornecer um nome dentro de uma configuração de projeto definida com a sintaxe glob, o Vitest usará o nome do diretório como padrão.
Se você não precisa de configurações inline, você pode simplesmente criar um pequeno arquivo JSON no seu diretório raiz:
["packages/*"]
Projetos de workspace não suportam todas as propriedades de configuração. Para garantir a tipagem correta, use o método defineProject
em vez do método defineConfig
dentro dos arquivos de configuração do projeto:
import { defineProject } from 'vitest/config';
export default defineProject({
test: {
environment: 'jsdom',
// "reporters" não é suportado em uma configuração de projeto,
// então um erro será exibido
reporters: ['json'],
},
});
Executando testes
Para executar os testes dentro do workspace, defina um script no seu package.json
raiz:
{
"scripts": {
"test": "vitest"
}
}
Agora os testes podem ser executados usando seu gerenciador de pacotes:
npm run test
yarn test
pnpm run test
bun test
Se você precisar executar os testes apenas dentro de um único projeto, use a opção --project
da CLI:
npm run test --project e2e
TIP
A opção da CLI --project
pode ser usada várias vezes para filtrar múltiplos projetos:
npm run test --project e2e --project unit
Configuração
Nenhuma das opções de configuração é herdada do arquivo de configuração de nível raiz. Você pode criar um arquivo de configuração compartilhado e combiná-lo com a configuração do projeto manualmente:
import { defineProject, mergeConfig } from 'vitest/config';
import configShared from '../vitest.shared.js';
export default mergeConfig(
configShared,
defineProject({
test: {
environment: 'jsdom',
},
})
);
Além disso, algumas das opções de configuração não são permitidas em uma configuração de projeto. Principalmente:
coverage
: o coverage é feito para todo o workspacereporters
: apenas reporters de nível raiz são suportadosresolveSnapshotPath
: apenas o resolver de nível raiz é respeitado- todas as outras opções que não afetam os runners de teste
TIP
Todas as opções de configuração que não são suportadas dentro de uma configuração de projeto têm o sinal * próximo a elas na página "Config".
Coverage
O coverage para projetos de workspace funciona sem configuração adicional. Mas, se você tiver a opção all
habilitada e usar extensões não convencionais em alguns de seus projetos, você precisará ter um plugin que lide com essa extensão no seu arquivo de configuração raiz.
Por exemplo, se você tiver um pacote que usa arquivos Vue e ele tiver seu próprio arquivo de configuração, mas alguns dos arquivos não forem importados em seus testes, o coverage falhará ao tentar analisar o uso de arquivos não utilizados, porque ele depende da configuração raiz em vez da configuração do projeto.