Le développement piloté par les tests (TDD) est une méthodologie puissante pour écrire du code propre et sans bug. Dans cet article, nous explorerons comment implémenter TDD à l'aide du programme d'exécution de tests intégré de Bun, Bun Test, connu pour sa rapidité et sa simplicité.
Le développement piloté par les tests (TDD) est une pratique de développement logiciel dans laquelle les tests sont écrits avant le code. La pratique TDD guide la mise en œuvre et garantit la fonctionnalité à travers des cycles itératifs d'écriture, de test et de refactoring.
TDD est un processus de développement qui suit ces étapes :
Ce processus itératif est conçu pour produire du code robuste et bien testé.
Si vous n'avez pas installé Bun, installez-le en suivant les instructions de la documentation JavaScript de Bun.
Ensuite, initialisez un nouveau projet :
bun init
➜ example bun init bun init helps you get started with a minimal project and tries to guess sensible defaults. Press ^C anytime to quit package name (example): entry point (index.ts): Done! A package.json file was saved in the current directory.
Créez un fichier de test dans le répertoire tests (par exemple, tests/example.test.js). Bun détecte automatiquement les fichiers se terminant par .test.ts ou .test.js pour les tests.
mkdir tests touch tests/example.test.js
Commençons par un exemple simple.
Nous allons créer un fichier de calculatrice pour implémenter certaines fonctions mathématiques.
Nous allons d’abord nous concentrer sur une fonction simple, comme sum(), même si JavaScript possède déjà un opérateur d’addition natif. Cela nous permet de nous concentrer sur la structuration des tests plutôt que sur la complexité de la logique.
Voici le plan :
Dans le fichier tests/calculator.test.js, vous pouvez implémenter vos tests :
import { describe, expect, it } from "bun:test"; import { sum } from "../calculator"; describe("sum function", () => { it("should return the sum of two numbers (both are positive)", () => { expect(sum(2, 3)).toBe(5); }); it("should return the sum of two numbers (one is negative)", () => { expect(sum(-1, 2)).toBe(1); }); });
Ces tests vérifient le comportement de la fonction sum(), définie dans le module calculatrice. Les tests sont écrits à l'aide de la bibliothèque de tests de Bun et organisés dans un bloc de description nommé « fonction somme ». Le bloc décrire() permet de regrouper les tests « similaires ». Chaque bloc it() spécifie un scénario particulier à tester. Voici ce que fait chaque test :
Ces tests garantissent que la fonction somme se comporte comme prévu pour les scénarios d'addition de base, couvrant à la fois les nombres positifs et les entrées mixtes (positives et négatives).
Maintenant, vous pouvez créer votre module de calculatrice qui exportera la fonction sum().
Dans le fichier calculator.ts :
bun init
La première version de la fonction renvoie une valeur codée en dur, je m'attends donc à ce que les tests échouent.
Exécution des tests :
➜ example bun init bun init helps you get started with a minimal project and tries to guess sensible defaults. Press ^C anytime to quit package name (example): entry point (index.ts): Done! A package.json file was saved in the current directory.
Maintenant, nous pouvons ajuster la logique de la fonction sum() dans la calculatrice.ts ajuster la logique de la fonction sum() :
mkdir tests touch tests/example.test.js
Maintenant, si vous lancez les tests, vous aurez un statut « vert » ✅.
Si vous souhaitez exécuter les mêmes tests avec différents scénarios (valeurs d'entrée), vous pouvez utiliser la méthode each().
import { describe, expect, it } from "bun:test"; import { sum } from "../calculator"; describe("sum function", () => { it("should return the sum of two numbers (both are positive)", () => { expect(sum(2, 3)).toBe(5); }); it("should return the sum of two numbers (one is negative)", () => { expect(sum(-1, 2)).toBe(1); }); });
En utilisant une approche basée sur un ensemble de données, ce code teste la fonction somme du module calculateur. La méthode it.each() est utilisée pour simplifier les cas de test répétitifs en itérant sur un ensemble de données d'entrées et de sorties attendues. Voici un aperçu de son fonctionnement :
Tout d'abord, vous pouvez définir un ensemble de données
export function sum(a: number, b: number) { // Function yet to be implemented return 0; }
L'ensemble de données est un tableau de tableaux. Chaque tableau interne représente un cas de test, où les éléments correspondent à :
La fonction de description regroupe tous les tests liés à la fonction somme sous un seul bloc pour une meilleure organisation.
Dans le bloc décrire(), it.each(dataset) parcourt chaque ligne du tableau de l'ensemble de données.
"La somme de %d et %d doit être %d" est un modèle de description pour le test, où %d est remplacé par les nombres réels de l'ensemble de données à chaque itération.
Par exemple, la première itération génère la description : "La somme de 2 et 3 devrait être 5".
Dans la fonction de rappel (a, b, attendu), les éléments de chaque ligne de l'ensemble de données sont déstructurés en variables : a, b et attendu. Ensuite, dans le test, la fonction somme est appelée avec a et b, et le résultat est vérifié à l'aide de expect() pour s'assurer qu'il correspond à ce qui était attendu.
Pour montrer un exemple supplémentaire pour TDD, implémentons une fonction moyenne dans le module de calculatrice qui calcule la moyenne (moyenne) d'un tableau de nombres. Suivant l'approche TDD, nous commencerons par écrire les tests.
Dans le calculator.test.js déjà existant, ajoutez ces tests spécifiques à la fonction Mean() :
bun init
Maintenant dans le fichier calculator.ts, ajoutez la fonction Mean() :
➜ example bun init bun init helps you get started with a minimal project and tries to guess sensible defaults. Press ^C anytime to quit package name (example): entry point (index.ts): Done! A package.json file was saved in the current directory.
Vous pouvez donc maintenant réexécuter les tests
mkdir tests touch tests/example.test.js
Tous les tests devraient réussir.
Dans ce cas, l’implémentation est déjà testée, aucune refactorisation supplémentaire n’est donc nécessaire. Cependant, prenez toujours le temps de revoir votre code pour des améliorations.
La couverture des tests est une métrique qui mesure le pourcentage de votre base de code exécuté lors de tests automatisés. Il fournit un aperçu de la façon dont vos tests valident votre code.
La couverture du test Bun permet d'identifier la « couverture de ligne ».
La couverture de ligne vérifie si chaque ligne de code est exécutée pendant la suite de tests.
Exécution de la couverture de test :
import { describe, expect, it } from "bun:test"; import { sum } from "../calculator"; describe("sum function", () => { it("should return the sum of two numbers (both are positive)", () => { expect(sum(2, 3)).toBe(5); }); it("should return the sum of two numbers (one is negative)", () => { expect(sum(-1, 2)).toBe(1); }); });
Bien qu'une couverture de test élevée soit importante, ce n'est pas la seule mesure de la qualité du code. Visez des tests significatifs axés sur les fonctionnalités, les cas extrêmes et les parties critiques de votre application. Atteindre une couverture à 100 % est idéal, mais pas au prix de la rédaction de tests inutiles ou triviaux.
Le développement piloté par les tests (TDD) avec Bun Test permet aux développeurs d'écrire du code propre, maintenable et robuste en se concentrant d'abord sur les exigences et en garantissant la fonctionnalité grâce à des tests itératifs. En tirant parti des outils de test rapides et efficaces de Bun, vous pouvez rationaliser votre processus de développement et gérer en toute confiance les cas extrêmes. L'adoption de TDD améliore non seulement la qualité du code, mais favorise également un état d'esprit consistant à écrire du code modulaire et testable dès le départ. Commencez petit, répétez souvent et laissez vos tests guider votre mise en œuvre.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!