Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Fortgeschrittenes Mocking im Unittest-Framework | Unittest-Framework
Quizzes & Challenges
Quizzes
Challenges
/
Python Fortgeschrittene Konzepte

bookFortgeschrittenes Mocking im Unittest-Framework

Im vorherigen Kapitel haben wir die Bedeutung der Verwendung von Mock beim Testen gesehen. Nun betrachten wir die verschiedenen Möglichkeiten genauer und klären eventuelle Unklarheiten.

Einführung in MagicMock

MagicMock ist eine äußerst 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 abruft.

Verwendung von mock.patch

@mock.patch wird verwendet, um die echten Implementierungen von Objekten in Ihrem Code vorübergehend zu ersetzen.

Stellen Sie sich eine Funktion vor, die Benutzeranmeldedaten gegen eine Datenbank prüft. Sie können mock.patch verwenden, um zu vermeiden, dass tatsächlich auf die Datenbank zugegriffen wird:

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 statt als Dekorator zu verwenden, insbesondere wenn:

  • ein Objekt nur für einen Teil des Tests gemockt werden soll;
  • oder wenn übermäßiger Einsatz von Dekoratoren oder Parametern die Übersichtlichkeit der Tests beeinträchtigt.
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 0

class TestBankAccount(unittest.TestCase):
    def test_balance_retrieval(self):
        with patch.object(BankAccount, 'get_account_balance', return_value=1000) as mock_get:
            account = BankAccount(1)
            self.assertEqual(account.balance, 1000)
            mock_get.assert_called_once_with(1)

Pytest Monkey Patch

Das monkeypatch-Fixture in Pytest ermöglicht es, Klassen, Module oder Umgebungen während eines Tests vorübergehend zu verä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, die Umgebung während des Tests sicher zu verändern und zu verwalten, ohne Nebenwirkungen außerhalb des Testbereichs zu verursachen.

1. Welcher der folgenden Codeausschnitte mockt die Methode get_balance korrekt, sodass sie 500 zurückgibt?

2. Was prüft der folgende Test?

question mark

Welcher der folgenden Codeausschnitte mockt die Methode get_balance korrekt, sodass sie 500 zurückgibt?

Select the correct answer

question mark

Was prüft der folgende Test?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 5. Kapitel 5

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

bookFortgeschrittenes Mocking im Unittest-Framework

Swipe um das Menü anzuzeigen

Im vorherigen Kapitel haben wir die Bedeutung der Verwendung von Mock beim Testen gesehen. Nun betrachten wir die verschiedenen Möglichkeiten genauer und klären eventuelle Unklarheiten.

Einführung in MagicMock

MagicMock ist eine äußerst 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 abruft.

Verwendung von mock.patch

@mock.patch wird verwendet, um die echten Implementierungen von Objekten in Ihrem Code vorübergehend zu ersetzen.

Stellen Sie sich eine Funktion vor, die Benutzeranmeldedaten gegen eine Datenbank prüft. Sie können mock.patch verwenden, um zu vermeiden, dass tatsächlich auf die Datenbank zugegriffen wird:

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 statt als Dekorator zu verwenden, insbesondere wenn:

  • ein Objekt nur für einen Teil des Tests gemockt werden soll;
  • oder wenn übermäßiger Einsatz von Dekoratoren oder Parametern die Übersichtlichkeit der Tests beeinträchtigt.
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 0

class TestBankAccount(unittest.TestCase):
    def test_balance_retrieval(self):
        with patch.object(BankAccount, 'get_account_balance', return_value=1000) as mock_get:
            account = BankAccount(1)
            self.assertEqual(account.balance, 1000)
            mock_get.assert_called_once_with(1)

Pytest Monkey Patch

Das monkeypatch-Fixture in Pytest ermöglicht es, Klassen, Module oder Umgebungen während eines Tests vorübergehend zu verä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, die Umgebung während des Tests sicher zu verändern und zu verwalten, ohne Nebenwirkungen außerhalb des Testbereichs zu verursachen.

1. Welcher der folgenden Codeausschnitte mockt die Methode get_balance korrekt, sodass sie 500 zurückgibt?

2. Was prüft der folgende Test?

question mark

Welcher der folgenden Codeausschnitte mockt die Methode get_balance korrekt, sodass sie 500 zurückgibt?

Select the correct answer

question mark

Was prüft der folgende Test?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 5. Kapitel 5
some-alt