Tests et intégration
Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy. Leçon 104 sur 107.
Défi
FacileMenons notre système de gestion de bibliothèque à son terme en écrivant des tests qui vérifient que tout fonctionne correctement ! Vous allez créer un fichier de test qui valide les fonctionnalités essentielles de votre bibliothèque : vérifier que les books peuvent être empruntés et rendus correctement, et que les conditions d’erreur sont gérées correctement.
Vous organiserez votre code sur cinq fichiers :
book.go: votre structureBookavec les champsID,Title,Author,ISBNetAvailable. Incluez le constructeurNewBookqui initialise les books comme disponibles.user.go: votre structureUseravec les champsID,Name,EmailetBorrowedBooks. Incluez le constructeurNewUser.library.go: votre structureLibraryavec des maps pour les books et les utilisateurs, ainsi que les méthodesNewLibrary,AddBook,AddUser,BorrowetReturn. La méthodeBorrowdoit renvoyer des erreurs en cas d’utilisateur invalide, de book invalide ou de book indisponible. La méthodeReturndoit renvoyer des erreurs en cas d’utilisateur invalide, de book invalide ou de book non emprunté.library_test.go: c’est ici que vous écrirez vos fonctions de test ! Créez des tests qui vérifient :TestBorrowSuccess: vérifiez que l’emprunt d’un book disponible réussit (aucune erreur renvoyée), que le book devient indisponible et que l’ID du book est ajouté à la liste des books empruntés par l’utilisateurTestBorrowUnavailable: vérifiez que l’emprunt d’un book déjà emprunté renvoie une erreurTestBorrowInvalidUser: vérifiez que l’emprunt avec un ID d’utilisateur inexistant renvoie une erreurTestReturnSuccess: vérifiez que le retour d’un book emprunté réussit, que le book redevient disponible et que l’ID du book est supprimé de la liste des books empruntés par l’utilisateur
Chaque test doit configurer sa propre bibliothèque avec les books et les utilisateurs nécessaires, effectuer l’opération et vérifier les résultats à l’aide de
t.Errorout.Errorflorsque les assertions échouent.main.go: exécutez vos tests manuellement et affichez les résultats. Lisez le nom du test à exécuter (borrow_success,borrow_unavailable,borrow_invalid_useroureturn_success). En fonction du nom du test, configurez le scénario approprié et affichezPASSsi toutes les assertions réussissent, ouFAIL: [reason]si une assertion échoue.
L’entrée suivante sera fournie :
- Un nom de test :
borrow_success,borrow_unavailable,borrow_invalid_useroureturn_success
Pour chaque test, utilisez ces données de test standard :
- Book : ID
B001, TitleGo Programming, AuthorJohn Doe, ISBN123-456 - User : ID
U001, NameAlice, Emailalice@test.com
Par exemple, avec :
borrow_successVotre sortie doit être :
PASSEt avec :
borrow_unavailableVotre sortie doit être :
PASSEt avec :
borrow_invalid_userVotre sortie doit être :
PASSEt avec :
return_successVotre sortie doit être :
PASSPour borrow_success : créez une bibliothèque, ajoutez un book et un utilisateur, empruntez le book, vérifiez qu’il n’y a aucune erreur, vérifiez que le book est indisponible et vérifiez que l’utilisateur possède le book dans sa liste de books empruntés.
Pour borrow_unavailable : créez une bibliothèque, ajoutez un book et un utilisateur, définissez Available du book sur false, tentez de l’emprunter et vérifiez qu’une erreur est renvoyée.
Pour borrow_invalid_user : créez une bibliothèque, ajoutez uniquement le book (sans utilisateur), tentez d’emprunter avec l’ID utilisateur U001 et vérifiez qu’une erreur est renvoyée.
Pour return_success : créez une bibliothèque, ajoutez un book et un utilisateur, empruntez d’abord le book, puis rendez-le, vérifiez qu’il n’y a aucune erreur, vérifiez que le book est de nouveau disponible et vérifiez que la liste de books empruntés par l’utilisateur est vide.
Écrire des tests garantit que votre système de bibliothèque se comporte correctement et vous donne la confiance nécessaire pour effectuer des modifications sans casser les fonctionnalités existantes !
Essayez vous-même
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
testName, _ := reader.ReadString('\n')
testName = strings.TrimSpace(testName)
// Fixtures de test standard
// Livre : ID "B001", Titre "Go Programming", Auteur "John Doe", ISBN "123-456"
// Utilisateur : ID "U001", Nom "Alice", Email "alice@test.com"
switch testName {
case "borrow_success":
// TODO: Tester que l'emprunt d'un livre disponible réussit
// 1. Créer la bibliothèque, ajouter le livre et l'utilisateur
// 2. Emprunter le livre
// 3. Vérifier : pas d'erreur, livre indisponible, l'utilisateur a le livre dans sa liste
// Afficher "PASS" si tout réussit, ou "FAIL: [reason]" en cas d'échec
fmt.Println("FAIL: not implemented")
case "borrow_unavailable":
// TODO: Tester que l'emprunt d'un livre indisponible renvoie une erreur
// 1. Créer la bibliothèque, ajouter le livre et l'utilisateur
// 2. Définir Available du livre à false
// 3. Tenter d'emprunter
// 4. Vérifier qu'une erreur est renvoyée
fmt.Println("FAIL: not implemented")
case "borrow_invalid_user":
// TODO: Tester que l'emprunt avec un utilisateur invalide renvoie une erreur
// 1. Créer la bibliothèque, ajouter uniquement le livre (pas d'utilisateur)
// 2. Tenter d'emprunter avec l'ID utilisateur "U001"
// 3. Vérifier qu'une erreur est renvoyée
fmt.Println("FAIL: not implemented")
case "return_success":
// TODO: Tester que le retour d'un livre emprunté réussit
// 1. Créer la bibliothèque, ajouter le livre et l'utilisateur
// 2. Emprunter d'abord le livre
// 3. Retourner le livre
// 4. Vérifier : pas d'erreur, livre disponible, liste de l'utilisateur vide
fmt.Println("FAIL: not implemented")
default:
fmt.Println("FAIL: unknown test")
}
}
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO en Go
Fichiers externesEspace de travail et modules GoPackages et importsNoms exportés et non exportésIntroduction à la POO en GoStructs comme classesDéfinir des méthodes sur des structsRécepteurs pointeurs ou par valeurInitialisation des structsFonctions constructeursRécapitulatif - Calculatrice simple4Interfaces
Introduction aux interfacesImplémentation impliciteL’interface comme contratInterface vide (any)Assertion de typeCommutation de typeComposition d’interfacesInterfaces Stringer et ErrorRécapitulatif - Calculateur de formes7Encapsulation
Champs exportés vs non exportésEncapsulation au niveau du packageMéthodes Getter et SetterDissimulation de l’information en GoRécapitulatif – Fiches d’étudiants10Génériques (Go 1.18+)
Introduction aux génériquesParamètres de typeContraintes de typeStructures génériquesSolution de contournement pour les méthodes génériquesRécapitulatif - Collection générique2Plongée approfondie dans les types et les structs
Types de base et compositesDéfinitions de types personnalisésTags de structStructs anonymesStructs imbriquésValeurs zéro et valeurs par défautRécapitulatif - Carnet de contacts5La composition plutôt que l’héritage
Pourquoi Go n’a pas d’héritageBases de l’inclusion de structsPromotion des méthodesInclure plusieurs structsInclusion ou agrégationMasquage des méthodes inclusesRécapitulatif : hiérarchie des employés8Gestion des erreurs et POO
L’interface errorTypes d’erreurs personnalisésEnrobage des erreurs (fmt.Errorf)Erreurs sentinelleserrors.Is() et errors.As()Panic, Defer et RecoverRécapitulatif - Analyseur de fichiers11Bibliothèque standard et POO
io.Reader et io.Writersort.InterfaceInterface fmt.Stringerencoding/json avec des structsInterface http.HandlerRécapitulatif - Modèles d’API REST14Modèles de conception – Partie 2
Modèle CommandeModèle AdaptateurModèle DécorateurModèle Méthode modèleModèle ÉtatModèle CompositeMiddleware comme décorateur3Pointeurs et mémoire
Notions de base des pointeurs en GoPointeurs vers des structuresPassage par valeur ou par référenceLa fonction new()Garbage collection en GoRécapitulatif - Constructeur de listes chaînées6Polymorphisme en Go
Polymorphisme via les interfacesDuck typing en GoRègles de satisfaction des interfacesCollections polymorphesInjection de dépendancesRécapitulatif – Processeur de paiements9Concurrence et POO
Bases des GoroutinesCanaux et communicationCanaux tamponnés ou non tamponnésInstruction selectsync.Mutex et sync.RWMutexsync.WaitGroupConception de structures thread-safeRécapitulatif - Pool de workers12Concepts avancés de la POO
Pattern des options fonctionnellesPattern Builder en GoChaînage de méthodesAlias de types vs définitionsBases de la réflexionVue d’ensemble de la génération de code15Projet : gestion de bibliothèque
Vue d’ensemble et structure du projetStructures Book et UserEntraînez-vous par vous-même : Compilateur Go en ligne