Tests unitaires (NUnit/xUnit)
Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy — leçon 67 sur 70.
Défi
FacileTerminons votre projet de système de bibliothèque en ajoutant des tests unitaires ! Les tests sont essentiels pour s'assurer que votre code fonctionne correctement et continue de fonctionner au fur et à mesure que vous apportez des modifications. Vous allez créer un fichier de test dédié qui vérifie les fonctionnalités de base de votre système de bibliothèque.
Vous continuerez à travailler avec la structure de votre projet existant, en ajoutant un nouveau fichier de test :
Book.cs: Conservez votre classe Book avecId,Title,Author,IsAvailable, et les méthodesBorrow()etReturn().User.cs: Conservez votre classe User avec le suivi des emprunts, la constanteMaxBooks,CanBorrow(), et les méthodes de gestion des livres empruntés.Library.cs: Conservez votre classe Library avec la logique d'emprunt, les méthodes de recherche, et les méthodesGetAllBooks()etGetAllUsers().LibraryTests.cs: C'est votre nouveau fichier de test ! Créez une classe de test qui vérifie que votre système de bibliothèque fonctionne correctement. Vous écrirez des méthodes de test qui vérifient divers scénarios et indiquent si chaque test réussit ou échoue.Program.cs: Votre point d'entrée qui exécute les tests et affiche les résultats.
Votre classe de test doit inclure des méthodes qui testent ces scénarios :
TestBookBorrow- Vérifier que l'emprunt d'un livre disponible réussit et modifie sa disponibilitéTestBookBorrowUnavailable- Vérifier que l'emprunt d'un livre déjà emprunté échoue de manière appropriéeTestUserBorrowingLimit- Vérifier que les utilisateurs ne peuvent pas emprunter plus de 3 livresTestBookReturn- Vérifier que le retour d'un livre emprunté fonctionne correctementTestSearchByAuthor- Vérifier que la recherche par auteur renvoie les bons livres
Chaque méthode de test doit retourner un booléen indiquant si le test a réussi. Créez un exécuteur de tests simple qui exécute tous les tests et affiche les résultats.
Vous recevrez les entrées suivantes :
- Nombre de scénarios de test à exécuter (1-5, correspondant aux tests listés ci-dessus)
Pour chaque test exécuté, affichez le résultat au format :
{TestName}: {PASS|FAIL}Une fois tous les tests terminés, affichez un résumé :
--- Test Summary ---
Passed: {count}
Failed: {count}
Total: {count}Par exemple, si l'entrée est :
3La sortie devrait être :
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
--- Test Summary ---
Passed: 3
Failed: 0
Total: 3Un autre exemple avec les 5 tests :
5La sortie devrait être :
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
TestBookReturn: PASS
TestSearchByAuthor: PASS
--- Test Summary ---
Passed: 5
Failed: 0
Total: 5Vos tests doivent créer de nouvelles instances de Book, User, et Library pour chaque test afin de garantir l'isolation. De cette façon, l'état d'un test n'affecte pas un autre. Considérez chaque test comme une vérification autonome d'un comportement spécifique de votre système !
Essayez vous-même
using System;
using Library.Tests;
class Program
{
public static void Main(string[] args)
{
// TODO: Créer une instance de BorrowingServiceTests
// TODO: Exécuter chaque méthode de test, en imprimant le nom du test avant chaque résultat
// Exemple:
// Console.WriteLine("BorrowBook_WhenBookAvailable_ReturnsTrue");
// tests.BorrowBook_WhenBookAvailable_ReturnsTrue();
}
}Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et Utilisateur