Un projet moderne a déjà un outil de construction, une résolution de modules et une transformation de fichiers. Un lanceur de tests qui redemande tout cela en double part avec un handicap.
Vitest a fait le choix inverse : il se branche sur la configuration existante et lance les tests avec.
Définition
Vitest est un lanceur de tests JavaScript et TypeScript bâti sur Vite. Il découvre les fichiers de test, les exécute, compare les résultats attendus aux résultats obtenus et rend un rapport. Les modules Module ES y fonctionnent nativement, sans étape de conversion.
// facturation.test.js
import { describe, it, expect } from "vitest";
import { totalTTC } from "./facturation.js";
describe("totalTTC", () => {
it("applique 20 % de TVA par défaut", () => {
expect(totalTTC(19)).toBe(22.8);
});
it("accepte un autre taux", () => {
expect(totalTTC(100, 0.055)).toBe(105.5);
});
});Un fichier dont le nom contient .test. ou .spec. est ramassé automatiquement. La commande npx vitest le lance et reste ensuite à l'écoute des modifications, en ne rejouant que ce qui dépend du fichier touché.
Les fonctions du quotidien
| Fonction | Rôle |
|---|---|
| describe | Regroupe des tests qui parlent du même sujet |
| it ou test | Déclare un test et sa phrase descriptive |
| expect | Ouvre une assertion sur une valeur obtenue |
| beforeEach | Prépare un état neuf avant chaque test |
| vi | L'objet qui fabrique les doubles et pilote l'horloge |
Côté assertions, toBe compare par identité, toEqual compare le contenu en profondeur, toThrow attend une Error, et rejects attend une promesse rompue.
La configuration
Un seul fichier suffit à décrire l'environnement d'exécution et le rapport de Couverture de code. Il s'ajoute à la racine du projet, à côté du package.json.
// vitest.config.js
import { defineConfig } from "vitest/config";
export default defineConfig({
test: {
environment: "node",
globals: false,
coverage: {
provider: "v8",
reporter: ["text", "html"],
},
},
});La valeur jsdom pour environment fournit un document et une window simulés, ce qui permet de tester du code d'interface sans ouvrir de navigateur.
Questions fréquentes
Vitest ou Jest ?
Les deux interfaces sont volontairement très proches, au point qu'une migration se résume souvent à changer les importations. Vitest a l'avantage sur un projet déjà servi par Vite, puisqu'il n'y a plus qu'une configuration à tenir. Sur une base ancienne outillée avec Webpack, l'écosystème de Jest reste très installé.
Faut-il lancer les tests en continu ?
Pendant l'écriture, oui : le mode par défaut relance uniquement les tests concernés par le fichier modifié, et la boucle de retour se compte en dizaines de millisecondes. En intégration continue, on utilise vitest run, qui exécute une seule fois puis rend la main avec un code de sortie.
Où placer les fichiers de test ?
Deux conventions coexistent : à côté du fichier testé, ou dans un dossier dédié qui reproduit l'arborescence. La première rend le test visible et le fait vivre avec le code qu'il couvre. La seconde garde les dossiers de production propres. L'important est de choisir une fois pour tout le projet.