Proyectos de prueba
Proyecto de ejemplo
WARNING
Esta característica también se conoce como workspace
. El workspace
está obsoleto desde la versión 3.2 y ha sido reemplazado por la configuración projects
. Funcionalmente son equivalentes.
Vitest permite definir múltiples configuraciones de proyecto dentro de un único proceso de Vitest. Esta característica es particularmente útil para configuraciones de monorepositorios, pero también puede usarse para ejecutar pruebas con diferentes configuraciones, como resolve.alias
, plugins
o test.browser
, entre otras.
Definición de proyectos
Puedes definir proyectos en tu configuración raíz:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: ['packages/*'],
},
});
Las configuraciones de proyecto pueden ser configuraciones en línea, archivos o patrones glob que hacen referencia a tus proyectos. Por ejemplo, si tienes una carpeta llamada packages
que contiene tus proyectos, puedes definir un array en tu configuración raíz de Vitest:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: ['packages/*'],
},
});
Vitest tratará cada carpeta en packages
como un proyecto separado, incluso si no contiene un archivo de configuración. Si este patrón glob coincide con cualquier archivo, se considerará una configuración de Vitest, incluso si no tiene vitest
en su nombre o tiene una extensión de archivo poco común.
WARNING
Vitest no trata el archivo vitest.config
raíz como un proyecto a menos que se especifique explícitamente en la configuración. En consecuencia, la configuración raíz solo influirá en opciones globales como reporters
y coverage
. Ten en cuenta que Vitest siempre ejecutará ciertos ganchos (hooks) de plugins, como apply
, config
, configResolved
o configureServer
, especificados en el archivo de configuración raíz. Vitest también utiliza los mismos plugins para ejecutar configuraciones de inicialización global y proveedores personalizados de cobertura.
También puedes hacer referencia a proyectos mediante sus archivos de configuración:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: ['packages/*/vitest.config.{e2e,unit}.ts'],
},
});
Este patrón solo incluirá proyectos con un archivo vitest.config
que contenga e2e
o unit
en su nombre antes de la extensión.
También puedes definir proyectos usando configuración en línea. La configuración admite ambas sintaxis al mismo tiempo.
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: [
// abarca cada carpeta y archivo dentro de la carpeta `packages`
'packages/*',
{
// agrega "extends: true" para heredar las opciones de la configuración raíz
extends: true,
test: {
include: ['tests/**/*.{browser}.test.{ts,js}'],
// se recomienda definir un nombre al usar configuraciones en línea
name: 'happy-dom',
environment: 'happy-dom',
},
},
{
test: {
include: ['tests/**/*.{node}.test.{ts,js}'],
// el color de la etiqueta de nombre se puede cambiar
name: { label: 'node', color: 'green' },
environment: 'node',
},
},
],
},
});
WARNING
Todos los proyectos deben tener nombres únicos; de lo contrario, Vitest generará un error. Si no se proporciona un nombre en la configuración en línea, Vitest asignará un número. Para las configuraciones de proyecto definidas con sintaxis glob, Vitest por defecto utilizará la propiedad "name" en el archivo package.json
más cercano o, si no existe, el nombre de la carpeta.
Los proyectos no admiten todas las propiedades de configuración. Para una mejor seguridad de tipos, usa el método defineProject
en lugar de defineConfig
dentro de los archivos de configuración del proyecto:
// @errors: 2769
import { defineProject } from 'vitest/config';
export default defineProject({
test: {
environment: 'jsdom',
// "reporters" no es compatible con la configuración de un proyecto,
// por lo que generará un error
reporters: ['json'],
},
});
Ejecución de pruebas
Para ejecutar pruebas, define un script en tu package.json
raíz:
{
"scripts": {
"test": "vitest"
}
}
Ahora las pruebas se pueden ejecutar a través de tu gestor de paquetes:
npm run test
yarn test
pnpm run test
bun run test
Si necesitas ejecutar pruebas solo dentro de un único proyecto, usa la opción CLI --project
:
npm run test --project e2e
yarn test --project e2e
pnpm run test --project e2e
bun run test --project e2e
TIP
La opción CLI --project
se puede usar varias veces para seleccionar múltiples proyectos:
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
Configuración
Ninguna de las opciones de configuración se hereda del archivo de configuración raíz por defecto. Puedes crear un archivo de configuración compartido y fusionarlo con la configuración del proyecto:
import { defineProject, mergeConfig } from 'vitest/config';
import configShared from '../vitest.shared.js';
export default mergeConfig(
configShared,
defineProject({
test: {
environment: 'jsdom',
},
})
);
Además, puedes usar la opción extends
para heredar de tu configuración de nivel raíz. Todas las opciones se combinarán.
import { defineConfig } from 'vitest/config';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
test: {
pool: 'threads',
projects: [
{
// heredará opciones de esta configuración, como los plugins y el pool
extends: true,
test: {
name: 'unit',
include: ['**/*.unit.test.ts'],
},
},
{
// no heredará ninguna opción de esta configuración; este es el comportamiento predeterminado
extends: false,
test: {
name: 'integration',
include: ['**/*.integration.test.ts'],
},
},
],
},
});
Opciones no compatibles
Algunas de las opciones de configuración no están permitidas en la configuración de proyectos. Cabe destacar las siguientes:
coverage
: la cobertura se aplica a todo el procesoreporters
: solo se admiten los reporters de nivel raízresolveSnapshotPath
: solo se respeta el resolvedor de nivel raíz- todas las demás opciones que no afectan a los ejecutores de pruebas
Todas las opciones de configuración que no son compatibles dentro de la configuración de un proyecto se indican con el signo * en la guía de "Configuración". Deben definirse una única vez en el archivo de configuración raíz.