Projetos de Teste
Exemplo de Projeto
WARNING
Este recurso também é conhecido como workspace
. O workspace
foi descontinuado desde a versão 3.2 e substituído pela configuração projects
. Ambos são funcionalmente equivalentes.
O Vitest oferece uma forma de definir múltiplas configurações de projeto dentro de um único processo Vitest. Este recurso é particularmente útil para configurações de monorepo, mas também pode ser usado para executar testes com diferentes configurações, como resolve.alias
, plugins
, test.browser
e muito mais.
Definindo Projetos
Você pode definir projetos em seu config raiz:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: ['packages/*'],
},
});
As configurações de projeto podem ser configurações inline, arquivos ou padrões glob que referenciam seus projetos. Por exemplo, se você tem uma pasta chamada packages
que contém seus projetos, você pode definir um array em sua configuração raiz do Vitest:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: ['packages/*'],
},
});
O Vitest tratará cada pasta em packages
como um projeto separado, mesmo que não contenha um arquivo de configuração. Se este padrão glob corresponder a qualquer arquivo, ele será considerado uma configuração do Vitest, mesmo que não tenha vitest
em seu nome ou tenha uma extensão de arquivo incomum.
WARNING
O Vitest não trata o arquivo vitest.config
raiz como um projeto, a menos que seja explicitamente especificado na configuração. Consequentemente, a configuração raiz afetará apenas opções globais, como reporters
e coverage
. Observe que o Vitest sempre executará certos hooks de plugin, como apply
, config
, configResolved
ou configureServer
, especificados no arquivo de configuração raiz. O Vitest também usa os mesmos plugins para executar configurações globais e para o provedor de coverage personalizado.
Você também pode referenciar projetos por meio de seus arquivos de configuração:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: ['packages/*/vitest.config.{e2e,unit}.ts'],
},
});
Este padrão incluirá apenas projetos com um arquivo vitest.config
que contenha e2e
ou unit
antes da extensão.
Você também pode definir projetos usando configuração inline. A configuração suporta ambas as sintaxes simultaneamente.
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: [
// corresponde a todas as pastas e arquivos dentro da pasta `packages`
'packages/*',
{
// adicione "extends: true" para herdar as opções da configuração raiz
extends: true,
test: {
include: ['tests/**/*.{browser}.test.{ts,js}'],
// é recomendado definir um nome ao usar configurações inline
name: 'happy-dom',
environment: 'happy-dom',
},
},
{
test: {
include: ['tests/**/*.{node}.test.{ts,js}'],
// a cor do label do nome pode ser alterada
name: { label: 'node', color: 'green' },
environment: 'node',
},
},
],
},
});
WARNING
Todos os projetos devem ter nomes únicos; caso contrário, o Vitest gerará um erro. Se um nome não for fornecido na configuração inline, o Vitest atribuirá um número. Para configurações de projeto definidas com sintaxe glob, o Vitest usará por padrão a propriedade "name" no arquivo package.json
mais próximo ou, se não existir, o nome da pasta.
Os projetos não suportam todas as propriedades de configuração disponíveis. Para uma melhor segurança de tipos, use o método defineProject
em vez de defineConfig
dentro dos arquivos de configuração do projeto:
// @errors: 2769
import { defineProject } from 'vitest/config';
export default defineProject({
test: {
environment: 'jsdom',
// "reporters" não é suportado em uma configuração de projeto,
// então mostrará um erro
reporters: ['json'],
},
});
Executando testes
Para executar testes, defina um script em seu package.json
raiz:
{
"scripts": {
"test": "vitest"
}
}
Agora os testes podem ser executados com seu gerenciador de pacotes:
npm run test
yarn test
pnpm run test
bun run test
Se você precisar executar testes apenas dentro de um único projeto, use a opção CLI --project
:
npm run test --project e2e
yarn test --project e2e
pnpm run test --project e2e
bun run test --project e2e
TIP
A opção CLI --project
pode ser utilizada várias vezes para filtrar vários projetos:
npm run test --project e2e --project unit
yarn test --project e2e --project unit
pnpm run test --project e2e --project unit
bun 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 mesclá-lo com a configuração do projeto por conta própria:
import { defineProject, mergeConfig } from 'vitest/config';
import configShared from '../vitest.shared.js';
export default mergeConfig(
configShared,
defineProject({
test: {
environment: 'jsdom',
},
})
);
Além disso, você pode usar a opção extends
para herdar de sua configuração de nível raiz. Todas as opções serão combinadas.
import { defineConfig } from 'vitest/config';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
test: {
pool: 'threads',
projects: [
{
// herdará opções desta configuração, como plugins e pool
extends: true,
test: {
name: 'unit',
include: ['**/*.unit.test.ts'],
},
},
{
// não herdará nenhuma opção desta configuração
// este é o comportamento padrão
extends: false,
test: {
name: 'integration',
include: ['**/*.integration.test.ts'],
},
},
],
},
});
Opções Não Suportadas
Algumas das opções de configuração não são permitidas em uma configuração de projeto. Mais notadamente:
coverage
: a cobertura é feita para todo o processoreporters
: apenas os reporters definidos na configuração raiz são suportadosresolveSnapshotPath
: apenas o resolvedor de nível raiz é considerado- todas as outras opções que não afetam diretamente os executores de teste
Todas as opções de configuração que não são suportadas dentro de uma configuração de projeto são marcadas com * no guia "Config". Elas devem ser definidas uma vez no arquivo de configuração raiz.