Techniques 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 :
- 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 ;
- 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 ;
- 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)
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
MagicMockpour 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 exceptionValueErrorest 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
Merci pour vos commentaires !
single
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
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?
Génial!
Completion taux amélioré à 3.13
Techniques 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 :
- 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 ;
- 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 ;
- 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)
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
MagicMockpour 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 exceptionValueErrorest 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
Merci pour vos commentaires !
single