Créez le main.go initial en utilisant l'exemple simple de babyapi
Utilisez la CLI pour générer un passe-partout de test
Implémentez chaque test en remplissant les espaces réservés avec le JSON attendu
Exécutez les tests et voyez s'ils réussissent !
Puisque PUT est idempotent, tous les champs doivent être inclus. Pour éviter cela, nous souhaitons ajouter la prise en charge du basculement des requêtes Terminé avec PATCH. Nous commençons par ajouter un test simple pour déterminer à quoi nous attendons cette fonctionnalité
Ce test échoue car babyapi ne prend pas en charge PATCH par défaut. Nous pouvons résoudre ce problème en implémentant Patch pour la structure TODO. Puisque nous avons défini notre fonctionnalité avec deux tests, notre implémentation la plus simple ne consiste pas simplement à définir Completed = true et nous devons utiliser la valeur de la requête
Nous pouvons désormais modifier le statut Terminé d'un TODO, mais nous ne pouvons toujours pas utiliser PATCH pour modifier d'autres champs, comme le montre ce nouvel ensemble de tests
Mettre à jour le correctif pour définir les champs restants
Nos tests échouent toujours puisque nous mettons toujours à jour le TODO avec les champs de requête, même s'ils sont vides. Corrigez ce problème en mettant à jour l'implémentation pour vérifier les valeurs vides
Le nouveau test UpdateWithPatch réussit, mais nos tests précédents échouent. Depuis que nous avons modifié Completed pour qu'il soit *bool, les TODO créés avec une valeur vide s'afficheront comme null
Implémentez le rendu pour TODO afin que nous puissions traiter zéro comme faux
La mise en œuvre de la fonctionnalité PATCH avec un développement piloté par les tests a abouti à un ensemble de tests robustes et à une fonctionnalité bien implémentée. Depuis que nous avons commencé par définir l'entrée et la sortie attendues d'une requête PATCH dans les tests, il était facile de voir les problèmes causés par la non-vérification des valeurs vides dans la requête. De plus, nos tests préexistants ont pu protéger contre les modifications brutales lors du changement du type de Terminé en *bool.
Le développement piloté par les tests est une approche efficace pour créer un code entièrement testé et correct. En commençant par les tests à l'esprit, nous pouvons garantir que chaque élément de code est conçu pour être testable au lieu de laisser les tests être une réflexion après coup.
Si vous hésitez à adopter le TDD, voici quelques idées pour commencer :
Même si TDD ne convient pas à la façon dont vous écrivez du code, c'est toujours un outil puissant à avoir à votre actif. Je vous encourage à consacrer au moins un peu de temps à l'essayer et à voir comment cela affecte votre processus de développement.
","image":"http://www.luping.net/uploads/20240730/172232678666a89f02dc4a5.jpg","datePublished":"2024-07-30T16:06:26+08:00","dateModified":"2024-07-30T16:06:26+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}Le développement piloté par les tests est une méthode efficace pour garantir un code bien testé et refactorisable. L'idée de base est que vous commencez le développement en écrivant des tests. Ces tests documentent clairement les attentes et créent une rubrique pour une mise en œuvre réussie. Lorsque cela est fait correctement, vous pouvez définir clairement l'entrée/sortie attendue d'une fonction avant d'écrire un code. Cela présente quelques avantages immédiats :
Maintenant que vous êtes convaincu des avantages, vous pouvez vous lancer dans le développement piloté par les tests (TDD) en suivant ces étapes :
Ces étapes sont suivies dans un cycle afin que vous ajoutiez toujours plus de tests pour contester la mise en œuvre actuelle.
La dernière étape, qui spécifie l'écriture de la quantité minimale de code, est celle où les choses peuvent devenir fastidieuses si elles sont suivies de manière rigide. Il est important de comprendre pourquoi cette règle existe avant de pouvoir déterminer quand il convient de s'en écarter.
Vous êtes chargé d'implémenter la fonction Add(x, y int) int. Avant de passer à l'implémentation et de renvoyer simplement x y, écrivez le test le plus simple : 1 1 == 2. Ensuite, quelle est l'implémentation la plus simple qui réussirait le test ? C'est juste le retour 2. Maintenant, vos tests réussissent !
À ce stade, vous réalisez que vous avez besoin de plus de tests, alors vous accélérez le rythme et en ajoutez quelques autres :
Maintenant, vos tests échouent, vous devez donc corriger l'implémentation. Vous ne pouvez pas simplement renvoyer 3 ou renvoyer 105 cette fois, vous devez donc trouver une solution qui fonctionne pour tous les tests. Cela conduit à l'implémentation : return x y.
Bien que cela semble trop fastidieux dans l'exemple trivial, le strict respect de cette méthode vous a amené à écrire plusieurs tests au lieu de simplement faire confiance à votre implémentation. Bien sûr, votre idée initiale de renvoyer x y aurait fonctionné, mais le but est de vous recycler pour vous fier aux tests plutôt qu'à votre propre compréhension du code. Dans le monde réel, vous n'êtes pas le seul à travailler sur ce morceau de code et vous oublierez inévitablement les détails d'implémentation. Ce processus vous oblige à écrire plus de tests et à réfléchir à davantage de façons de rompre avec une implémentation simple.
Au final, vous acquerrez de l'expérience et apprendrez à trouver l'équilibre qui fonctionne dans les différents scénarios que vous rencontrez. Vous reviendrez à l'implémentation à pleine vitesse des fonctionnalités, constaterez que vous avez moins de bogues et écrirez du code plus maintenable.
Passons à un exemple plus compliqué utilisant TDD pour une API HTTP REST. Ce guide étape par étape utilise mon framework Go, babyapi, mais les concepts peuvent être appliqués n'importe où.
babyapi utilise des génériques pour créer une API CRUD complète autour des structures Go, ce qui rend très facile la création d'une API REST complète et d'une CLI client. En plus de cela, le package babytest fournit des outils pour créer des tests de tables API de bout en bout. L'utilisation de TDD au niveau de l'API permet de tester entièrement les couches HTTP et de stockage d'une nouvelle API ou fonctionnalité en même temps.
Avertissement : étant donné que babyapi gère la majeure partie de l'implémentation et est également utilisé pour générer un passe-partout de test, nous ne commençons pas techniquement par TDD. Cependant, nous verrons à quel point cela est bénéfique lors de l'ajout du support des requêtes PATCH à notre API.
Créer un nouveau projet Go
Créez le main.go initial en utilisant l'exemple simple de babyapi
Utilisez la CLI pour générer un passe-partout de test
Implémentez chaque test en remplissant les espaces réservés avec le JSON attendu
Exécutez les tests et voyez s'ils réussissent !
Puisque PUT est idempotent, tous les champs doivent être inclus. Pour éviter cela, nous souhaitons ajouter la prise en charge du basculement des requêtes Terminé avec PATCH. Nous commençons par ajouter un test simple pour déterminer à quoi nous attendons cette fonctionnalité
Ce test échoue car babyapi ne prend pas en charge PATCH par défaut. Nous pouvons résoudre ce problème en implémentant Patch pour la structure TODO. Puisque nous avons défini notre fonctionnalité avec deux tests, notre implémentation la plus simple ne consiste pas simplement à définir Completed = true et nous devons utiliser la valeur de la requête
Nous pouvons désormais modifier le statut Terminé d'un TODO, mais nous ne pouvons toujours pas utiliser PATCH pour modifier d'autres champs, comme le montre ce nouvel ensemble de tests
Mettre à jour le correctif pour définir les champs restants
Nos tests échouent toujours puisque nous mettons toujours à jour le TODO avec les champs de requête, même s'ils sont vides. Corrigez ce problème en mettant à jour l'implémentation pour vérifier les valeurs vides
Le nouveau test UpdateWithPatch réussit, mais nos tests précédents échouent. Depuis que nous avons modifié Completed pour qu'il soit *bool, les TODO créés avec une valeur vide s'afficheront comme null
Implémentez le rendu pour TODO afin que nous puissions traiter zéro comme faux
La mise en œuvre de la fonctionnalité PATCH avec un développement piloté par les tests a abouti à un ensemble de tests robustes et à une fonctionnalité bien implémentée. Depuis que nous avons commencé par définir l'entrée et la sortie attendues d'une requête PATCH dans les tests, il était facile de voir les problèmes causés par la non-vérification des valeurs vides dans la requête. De plus, nos tests préexistants ont pu protéger contre les modifications brutales lors du changement du type de Terminé en *bool.
Le développement piloté par les tests est une approche efficace pour créer un code entièrement testé et correct. En commençant par les tests à l'esprit, nous pouvons garantir que chaque élément de code est conçu pour être testable au lieu de laisser les tests être une réflexion après coup.
Si vous hésitez à adopter le TDD, voici quelques idées pour commencer :
Même si TDD ne convient pas à la façon dont vous écrivez du code, c'est toujours un outil puissant à avoir à votre actif. Je vous encourage à consacrer au moins un peu de temps à l'essayer et à voir comment cela affecte votre processus de développement.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3