Projets de Test
Exemple de Projet
WARNING
Cette fonctionnalité était auparavant connue sous le nom d'workspace
. L'workspace
est déprécié depuis la version 3.2 et a été remplacé par la configuration projects
. Leur fonctionnalité est identique.
Vitest permet de définir plusieurs configurations de projet au sein d'un seul processus Vitest. Cette fonctionnalité est particulièrement utile pour les configurations de monorepo, mais peut également être employée pour exécuter des tests avec différentes configurations, telles que resolve.alias
, plugins
, ou test.browser
, entre autres.
Définir des Projets
Vous pouvez définir des projets dans votre configuration racine :
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: ['packages/*'],
},
});
Les configurations de projet peuvent être définies directement dans le fichier, via des fichiers externes ou des modèles glob qui référencent vos projets. Par exemple, si vous avez un dossier nommé packages
qui contient vos projets, vous pouvez définir un tableau dans votre configuration Vitest racine :
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: ['packages/*'],
},
});
Vitest traitera chaque dossier dans packages
comme un projet distinct, même s'il ne contient pas de fichier de configuration. Si ce modèle glob correspond à n'importe quel fichier, il sera considéré comme une configuration Vitest, même s'il n'a pas vitest
dans son nom ou possède une extension de fichier inhabituelle.
WARNING
Vitest ne considère pas le fichier vitest.config
racine comme un projet, à moins qu'il ne soit explicitement spécifié dans la configuration. Par conséquent, la configuration racine n'influencera que les options globales telles que reporters
et coverage
. Notez que Vitest exécutera toujours certains hooks de plugins, comme apply
, config
, configResolved
ou configureServer
, spécifiés dans le fichier de configuration racine. Vitest utilise également les mêmes plugins pour exécuter les configurations de démarrage globales et l'outil de couverture personnalisé.
Vous pouvez également référencer des projets via leurs fichiers de configuration :
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: ['packages/*/vitest.config.{e2e,unit}.ts'],
},
});
Ce motif n'inclura que les projets dont le fichier vitest.config
contient e2e
ou unit
avant l'extension.
Vous pouvez également définir des projets en utilisant la configuration intégrée. La configuration prend en charge les deux syntaxes simultanément.
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: [
// cible chaque dossier et fichier à l'intérieur du dossier `packages`
'packages/*',
{
// ajoutez "extends: true" pour hériter des options de la configuration racine
extends: true,
test: {
include: ['tests/**/*.{browser}.test.{ts,js}'],
// il est recommandé de définir un nom lors de l'utilisation de configurations intégrées
name: 'happy-dom',
environment: 'happy-dom',
},
},
{
test: {
include: ['tests/**/*.{node}.test.{ts,js}'],
// la couleur du libellé du nom peut être changée
name: { label: 'node', color: 'green' },
environment: 'node',
},
},
],
},
});
WARNING
Tous les projets doivent avoir des noms uniques ; sinon, Vitest générera une erreur. Si un nom n'est pas fourni dans la configuration intégrée, Vitest attribuera un numéro. Pour les configurations de projet définies avec la syntaxe de modèle glob, Vitest utilisera par défaut la propriété "name" dans le fichier package.json
le plus proche ou, si aucun n'existe, le nom du dossier.
Les projets ne prennent pas en charge toutes les propriétés de configuration. Pour une meilleure sécurité de type, utilisez la méthode defineProject
au lieu de defineConfig
dans les fichiers de configuration de projet :
// @errors: 2769
import { defineProject } from 'vitest/config';
export default defineProject({
test: {
environment: 'jsdom',
// "reporters" n'est pas pris en charge dans une configuration de projet,
// ce qui entraînera une erreur
reporters: ['json'],
},
});
Exécuter les tests
Pour exécuter les tests, définissez un script dans votre package.json
racine :
{
"scripts": {
"test": "vitest"
}
}
Maintenant, les tests peuvent être exécutés en utilisant votre gestionnaire de packages :
npm run test
yarn test
pnpm run test
bun run test
Si vous avez besoin d'exécuter des tests uniquement dans un seul projet, utilisez l'option CLI --project
:
npm run test --project e2e
yarn test --project e2e
pnpm run test --project e2e
bun run test --project e2e
TIP
L'option CLI --project
peut être utilisée plusieurs fois pour filtrer plusieurs projets :
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
Configuration
Aucune des options de configuration n'est héritée du fichier de configuration racine par défaut. Vous pouvez créer un fichier de configuration partagé et le fusionner manuellement avec la configuration du projet :
import { defineProject, mergeConfig } from 'vitest/config';
import configShared from '../vitest.shared.js';
export default mergeConfig(
configShared,
defineProject({
test: {
environment: 'jsdom',
},
})
);
De plus, vous pouvez utiliser l'option extends
pour hériter de votre configuration racine. Toutes les options seront fusionnées.
import { defineConfig } from 'vitest/config';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
test: {
pool: 'threads',
projects: [
{
// héritera des options de cette configuration, telles que les plugins et le pool
extends: true,
test: {
name: 'unit',
include: ['**/*.unit.test.ts'],
},
},
{
// n'héritera d'aucune option de cette configuration
// (ceci est le comportement par défaut)
extends: false,
test: {
name: 'integration',
include: ['**/*.integration.test.ts'],
},
},
],
},
});
Options non prises en charge
Certaines options de configuration ne sont pas autorisées dans une configuration de projet. Parmi les plus notables :
coverage
: la couverture s'applique à l'ensemble du processusreporters
: seuls les reporters définis au niveau racine sont pris en chargeresolveSnapshotPath
: seul le résolveur défini au niveau racine est pris en compte- toutes les autres options qui n'affectent pas les runners de tests
Toutes les options de configuration non prises en charge dans une configuration de projet sont signalées par un signe * dans le guide "Config". Elles doivent être définies uniquement dans le fichier de configuration racine.