Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Techniques de Simulation dans Unittest : Simulation des Dépendances | Cadre Unittest
Concepts Avancés de Python

bookTechniques de Simulation dans Unittest : Simulation des Dépendances

Tester du code qui dépend de services externes, de configurations ou qui présente des effets secondaires peut s’avérer complexe. Le mock est une technique puissante permettant de simuler le comportement d’interactions réelles complexes dans les tests, sans leur complexité ni leur imprévisibilité.

Par exemple, pour tester un service d’échange d’argent, une option consisterait à utiliser vos propres fonds pour simuler des transactions et observer les résultats. Cependant, cette méthode peut être risquée et coûteuse. Une alternative plus efficace et sans risque consiste à utiliser le mock pour émuler le processus d’envoi d’argent.

Test d’un service de transfert d’argent

class MoneyTransferService:
    def transfer(self, source_account, destination_account, amount):
        if source_account.balance < amount:
            raise ValueError("Insufficient funds")
        source_account.balance -= amount
        destination_account.balance += amount
        return True

Approche de test :

  1. Mock des soldes de comptes : utilisation du mock pour simuler différents états de compte, tels que fonds insuffisants ou fonds suffisants, afin de tester la réaction de la méthode de transfert ;
  2. Vérification des transactions : confirmation que les montants appropriés sont débités et crédités sur les comptes respectifs lors d’un transfert ;
  3. Gestion des exceptions : vérification que la méthode gère correctement les scénarios où le transfert ne peut pas être effectué.
import unittest
from unittest.mock import MagicMock

class TestMoneyTransferService(unittest.junit.TestCase):
    def setUp(self):
        self.transfer_service = MoneyTransferService()
        self.source_account = MagicMock()
        self.destination_account = MagicMock()

    def test_successful_transfer(self):
        # Set up the account balances
        self.source_account.balance = 1000
        self.destination_account.balance = 500

        # Perform the transfer
        successful = self.transfer_service.transfer(self.source_account, self.destination_account, 200)
        
        # Check balances
        self.assertTrue(successful)
        self.assertEqual(self.source_account.balance, 800)
        self.assertEqual(self.destination_account.balance, 700)

    def test_failed_transfer_due_to_insufficient_funds(self):
        # Set up the account balances
        self.source_account.balance = 100
        self.destination_account.balance = 500

        # Attempt to transfer more than the source balance
        with self.assertRaises(ValueError):
            self.transfer_service.transfer(self.source_account, self.destination_account, 200)
        
        # Verify that balances remain unchanged
        self.assertEqual(self.source_account.balance, 100)
        self.assertEqual(self.destination_account.balance, 500)
Tâche

Swipe to start coding

Votre tâche consiste à écrire des tests unitaires pour la classe MoneyTransferService en utilisant le framework unittest et unittest.mock. Vous devez :

  • Créer une classe de test héritant de unittest.TestCase ;
  • Utiliser MagicMock pour simuler des objets compte ;
  • Implémenter deux méthodes de test portant exactement les noms suivants :
    • test_successful_transfer ;
    • test_failed_transfer_due_to_insufficient_funds.
  • Dans test_successful_transfer, tester un transfert où la source dispose de fonds suffisants, et vérifier à la fois la valeur de retour et les soldes mis à jour ;
  • Dans test_failed_transfer_due_to_insufficient_funds, tester un transfert où la source ne dispose pas de fonds suffisants, vérifier qu'une exception ValueError est levée, et s'assurer que les soldes restent inchangés.

Remarque : Les noms des fonctions de test doivent correspondre exactement à ceux indiqués ci-dessus. Vos tests doivent vérifier le comportement en contrôlant directement les valeurs et la gestion des exceptions, sans utiliser d'expressions régulières ou de correspondance de motifs.

Solution

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 5. Chapitre 4
single

single

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Suggested prompts:

Can you explain how mocking helps in testing services with side effects?

What are some best practices for using MagicMock in unit tests?

Can you show how to extend these tests for additional scenarios, like negative transfer amounts?

close

bookTechniques de Simulation dans Unittest : Simulation des Dépendances

Glissez pour afficher le menu

Tester du code qui dépend de services externes, de configurations ou qui présente des effets secondaires peut s’avérer complexe. Le mock est une technique puissante permettant de simuler le comportement d’interactions réelles complexes dans les tests, sans leur complexité ni leur imprévisibilité.

Par exemple, pour tester un service d’échange d’argent, une option consisterait à utiliser vos propres fonds pour simuler des transactions et observer les résultats. Cependant, cette méthode peut être risquée et coûteuse. Une alternative plus efficace et sans risque consiste à utiliser le mock pour émuler le processus d’envoi d’argent.

Test d’un service de transfert d’argent

class MoneyTransferService:
    def transfer(self, source_account, destination_account, amount):
        if source_account.balance < amount:
            raise ValueError("Insufficient funds")
        source_account.balance -= amount
        destination_account.balance += amount
        return True

Approche de test :

  1. Mock des soldes de comptes : utilisation du mock pour simuler différents états de compte, tels que fonds insuffisants ou fonds suffisants, afin de tester la réaction de la méthode de transfert ;
  2. Vérification des transactions : confirmation que les montants appropriés sont débités et crédités sur les comptes respectifs lors d’un transfert ;
  3. Gestion des exceptions : vérification que la méthode gère correctement les scénarios où le transfert ne peut pas être effectué.
import unittest
from unittest.mock import MagicMock

class TestMoneyTransferService(unittest.junit.TestCase):
    def setUp(self):
        self.transfer_service = MoneyTransferService()
        self.source_account = MagicMock()
        self.destination_account = MagicMock()

    def test_successful_transfer(self):
        # Set up the account balances
        self.source_account.balance = 1000
        self.destination_account.balance = 500

        # Perform the transfer
        successful = self.transfer_service.transfer(self.source_account, self.destination_account, 200)
        
        # Check balances
        self.assertTrue(successful)
        self.assertEqual(self.source_account.balance, 800)
        self.assertEqual(self.destination_account.balance, 700)

    def test_failed_transfer_due_to_insufficient_funds(self):
        # Set up the account balances
        self.source_account.balance = 100
        self.destination_account.balance = 500

        # Attempt to transfer more than the source balance
        with self.assertRaises(ValueError):
            self.transfer_service.transfer(self.source_account, self.destination_account, 200)
        
        # Verify that balances remain unchanged
        self.assertEqual(self.source_account.balance, 100)
        self.assertEqual(self.destination_account.balance, 500)
Tâche

Swipe to start coding

Votre tâche consiste à écrire des tests unitaires pour la classe MoneyTransferService en utilisant le framework unittest et unittest.mock. Vous devez :

  • Créer une classe de test héritant de unittest.TestCase ;
  • Utiliser MagicMock pour simuler des objets compte ;
  • Implémenter deux méthodes de test portant exactement les noms suivants :
    • test_successful_transfer ;
    • test_failed_transfer_due_to_insufficient_funds.
  • Dans test_successful_transfer, tester un transfert où la source dispose de fonds suffisants, et vérifier à la fois la valeur de retour et les soldes mis à jour ;
  • Dans test_failed_transfer_due_to_insufficient_funds, tester un transfert où la source ne dispose pas de fonds suffisants, vérifier qu'une exception ValueError est levée, et s'assurer que les soldes restent inchangés.

Remarque : Les noms des fonctions de test doivent correspondre exactement à ceux indiqués ci-dessus. Vos tests doivent vérifier le comportement en contrôlant directement les valeurs et la gestion des exceptions, sans utiliser d'expressions régulières ou de correspondance de motifs.

Solution

Switch to desktopPassez à un bureau pour une pratique réelleContinuez d'où vous êtes en utilisant l'une des options ci-dessous
Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 5. Chapitre 4
single

single

some-alt