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
FacileBouclons la boucle de notre système de gestion de bibliothèque en écrivant des tests qui vérifient que tout fonctionne correctement ! Vous allez créer un fichier de test qui valide les fonctionnalités de base de votre bibliothèque — en vous assurant que les livres peuvent être empruntés et retournés correctement, et que les conditions d'erreur sont gérées de manière appropriée.
Vous organiserez votre code sur cinq fichiers :
book.go: Votre structureBookavec les champsID,Title,Author,ISBNetAvailable. Incluez le constructeurNewBookqui initialise les livres comme disponibles.user.go: Votre structureUseravec les champsID,Name,EmailetBorrowedBooks. Incluez le constructeurNewUser.library.go: Votre structureLibraryavec des maps pour les livres et les utilisateurs, ainsi que les méthodesNewLibrary,AddBook,AddUser,BorrowetReturn. La méthodeBorrowdoit retourner des erreurs pour un utilisateur invalide, un livre invalide ou un livre indisponible. La méthodeReturndoit retourner des erreurs pour un utilisateur invalide, un livre invalide ou un livre non emprunté.library_test.go: C'est ici que vous écrirez vos fonctions de test ! Créez des tests qui vérifient :TestBorrowSuccess— Vérifie que l'emprunt d'un livre disponible réussit (aucune erreur retournée), que le livre devient indisponible et que l'ID du livre est ajouté à la liste des emprunts de l'utilisateur.TestBorrowUnavailable— Vérifie que l'emprunt d'un livre déjà emprunté retourne une erreur.TestBorrowInvalidUser— Vérifie que l'emprunt avec un ID d'utilisateur inexistant retourne une erreur.TestReturnSuccess— Vérifie que le retour d'un livre emprunté réussit, que le livre redevient disponible et que l'ID du livre est retiré de la liste des emprunts de l'utilisateur.
Chaque test doit configurer sa propre bibliothèque avec les livres et 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 rapportez 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 passent, 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 (fixtures) :
- Livre : ID
B001, TitleGo Programming, AuthorJohn Doe, ISBN123-456 - Utilisateur : ID
U001, NameAlice, Emailalice@test.com
Par exemple, étant donné :
borrow_successVotre sortie devrait être :
PASSEt étant donné :
borrow_unavailableVotre sortie devrait être :
PASSEt étant donné :
borrow_invalid_userVotre sortie devrait être :
PASSEt étant donné :
return_successVotre sortie devrait être :
PASSPour borrow_success : Créez la bibliothèque, ajoutez le livre et l'utilisateur, empruntez le livre, vérifiez qu'il n'y a pas d'erreur, vérifiez que le livre est indisponible, vérifiez que l'utilisateur a le livre dans sa liste d'emprunts.
Pour borrow_unavailable : Créez la bibliothèque, ajoutez le livre et l'utilisateur, définissez le champ Available du livre sur false, tentez d'emprunter, vérifiez qu'une erreur est retournée.
Pour borrow_invalid_user : Créez la bibliothèque, ajoutez seulement le livre (pas d'utilisateur), tentez d'emprunter avec l'ID utilisateur U001, vérifiez qu'une erreur est retournée.
Pour return_success : Créez la bibliothèque, ajoutez le livre et l'utilisateur, empruntez d'abord le livre, puis retournez-le, vérifiez qu'il n'y a pas d'erreur, vérifiez que le livre est à nouveau disponible, vérifiez que la liste des emprunts de l'utilisateur est vide.
L'écriture de tests garantit que votre système de bibliothèque se comporte correctement et vous donne la confiance nécessaire pour apporter 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
// Book: ID "B001", Title "Go Programming", Author "John Doe", ISBN "123-456"
// User: ID "U001", Name "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 retourne 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 retournée
fmt.Println("FAIL: not implemented")
case "borrow_invalid_user":
// TODO: Tester que l'emprunt avec un utilisateur invalide retourne une erreur
// 1. Créer la bibliothèque, ajouter seulement le livre (pas d'utilisateur)
// 2. Tenter d'emprunter avec l'ID utilisateur "U001"
// 3. Vérifier qu'une erreur est retourné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 vs non exportésIntroduction à la POO en GoLes Structs comme ClassesDéfinir des méthodes sur les StructsReceveurs par pointeur vs par valeurInitialisation de StructsFonctions constructeursRécapitulatif - Calculatrice simple4Interfaces
Introduction aux interfacesImplémentation impliciteL'interface comme contratInterface vide (any)Assertion de typeType SwitchComposition d'interfacesInterfaces Stringer & ErrorRécapitulatif - Calculateur de formes7Encapsulation
Champs exportés vs non exportésEncapsulation au niveau du packageMéthodes Getter & SetterMasquage d'informations en GoRécapitulatif - Dossiers étudiants10Génériques (Go 1.18+)
Introduction aux génériquesParamètres de typeContraintes de typeStructures génériquesContournement pour les méthodes génériquesRécapitulatif - Collections génériques13Patrons de conception, Partie 1
Introduction aux Design PatternsPatron SingletonPatron FactoryPatron Abstract FactoryPatron ObserverPatron Strategy2Exploration approfondie des Types et Structs
Types de base et compositesDéfinitions de types personnalisésTags de StructStructs anonymesStructs imbriquéesValeurs par défaut et Zero ValuesRécapitulatif - Carnet de contacts5Composition plutôt qu'héritage
Pourquoi Go n'a pas d'héritageLes bases de l'imbrication de structsPromotion de méthodesImbriquer plusieurs structsImbrication vs AgrégationMasquage de méthodes imbriquéesRécapitulatif - Hiérarchie des employés8Gestion des erreurs & POO
L'interface errorTypes d'erreurs personnalisésError Wrapping (fmt.Errorf)Erreurs sentinelleserrors.Is() et errors.As()Panic, Defer et RecoverRécapitulatif - File Parser11Bibliothèque standard et POO
io.Reader & io.WriterL'interface sort.InterfaceL'interface fmt.Stringerencoding/json avec les StructsL'interface http.HandlerRécapitulatif - Modèles d'API REST14Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositeMiddleware en tant que Décorateur3Pointeurs et Mémoire
Bases des pointeurs en GoPointeurs vers des structsPassage par valeur vs référenceLa fonction new()Garbage Collection en GoRécapitulatif - Constructeur de liste chaînée6Le polymorphisme en Go
Le polymorphisme via les interfacesLe Duck Typing en GoRègles de satisfaction des interfacesCollections polymorphesInjection de dépendancesRécapitulatif - Processeur de paiement9Concurrence et POO
Bases des GoroutinesChannels et CommunicationChannels avec buffer vs sans bufferL'instruction Selectsync.Mutex et sync.RWMutexsync.WaitGroupConception de structures Thread-SafeRécapitulatif - Worker Pool12Concepts POO Avancés
Pattern Functional OptionsPattern Builder en GoChaînage de méthodesAlias de types vs DéfinitionsBases de la RéflexionAperçu de la génération de code15Projet : Gestion de bibliothèque
Présentation et structure du projetStructures Livre et Utilisateur