Kursinhalt
Python Fortgeschrittene Konzepte
Python Fortgeschrittene Konzepte
Mocking im Detail
Im vorherigen Kapitel haben wir die Bedeutung der Verwendung von Mock beim Testen gesehen. Jetzt werfen wir einen genaueren Blick auf die verschiedenen Fähigkeiten und klären alle Aspekte, die unklar waren.
Einführung in MagicMock
MagicMock ist eine unglaublich vielseitige Implementierung von Mock, die magische Methoden unterstützt. Sie können es verwenden, um das Verhalten komplexer Objekte in Ihren Tests nachzuahmen, wie wir im vorherigen Kapitel gesehen haben.
from unittest.mock import MagicMock
import unittest
class BankAccount:
def __init__(self, id):
self.id = id
self.balance = self.get_account_balance(id)
def get_account_balance(self, id):
# Simulates a database call
pass
class TestBankAccount(unittest.TestCase):
def test_balance_retrieval(self):
account = BankAccount(1)
account.get_account_balance = MagicMock(return_value=1000)
self.assertEqual(account.balance, 1000)
In diesem Beispiel wird MagicMock verwendet, um die Methode get_account_balance
zu simulieren, die normalerweise Daten aus einer Datenbank abrufen würde.
Verwendung von mock.patch
@mock.patch wird verwendet, um die tatsächlichen Implementierungen von Objekten in Ihrem Code vorübergehend zu ersetzen.
Stellen Sie sich eine Funktion vor, die Benutzeranmeldeinformationen gegen eine Datenbank überprüft. Sie können mock.patch verwenden, um zu vermeiden, die tatsächliche Datenbank zu treffen:
from unittest.mock import patch
import unittest
def authenticate(username, password):
# Assume this function checks credentials against a database
pass
class TestAuthentication(unittest.TestCase):
@patch('module_containing.authenticate')
def test_login(self, mock_auth):
mock_auth.return_value = True
response = authenticate('user', 'pass')
self.assertTrue(response)
Mocking mit Context Manager
Manchmal ist es vorzuziehen, patch() als Context Manager anstelle eines Dekorators zu verwenden, insbesondere wenn:
- Sie ein Objekt nur für einen Teil des Tests mocken müssen;
- oder wenn übermäßiger Gebrauch von Dekoratoren oder Parametern die Klarheit Ihrer Tests verringert.
from unittest.mock import patch
import unittest
class BankAccount:
def __init__(self, id):
self.id = id
self.balance = self.get_account_balance(id)
def get_account_balance(self, id):
# Simulates a database call
return 100 # Dummy return value for demonstration
class TestBankAccount(unittest.TestCase):
def test_balance_retrieval(self):
with patch('__main__.BankAccount.get_account_balance', return_value=1000):
account = BankAccount(1)
self.assertEqual(account.balance, 1000)
Pytest Monkey Patch
Das monkeypatch-Fixture in Pytest ermöglicht es Ihnen, Klassen, Module oder Umgebungen während eines Tests vorübergehend zu ändern.
import os
import pytest
def test_api_url(monkeypatch):
# Set the API_URL environment variable to a test URL
monkeypatch.setenv('API_URL', 'https://testapi.com')
# Now check that the environment variable was set correctly
assert os.environ['API_URL'] == 'https://testapi.com'
Das monkeypatch-Fixture ermöglicht es Ihnen, die Umgebung während des Tests sicher zu ändern und zu verwalten, ohne Nebenwirkungen außerhalb des Testbereichs zu verursachen.
1. Welcher der folgenden Code-Snippets mockt die Methode get_balance korrekt, um 500 zurückzugeben?
2. Was überprüft der folgende Test?
Danke für Ihr Feedback!