Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Mocking im Detail | Unittest-Framework
Python Fortgeschrittene Konzepte
course content

Kursinhalt

Python Fortgeschrittene Konzepte

Python Fortgeschrittene Konzepte

1. Module und Importe
2. Fehlerbehandlung
3. Dateiverwaltung
4. Pytest Framework
5. Unittest-Framework
6. Iteratoren und Generatoren

book
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?

question mark

Welcher der folgenden Code-Snippets mockt die Methode get_balance korrekt, um 500 zurückzugeben?

Select the correct answer

question mark

Was überprü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

course content

Kursinhalt

Python Fortgeschrittene Konzepte

Python Fortgeschrittene Konzepte

1. Module und Importe
2. Fehlerbehandlung
3. Dateiverwaltung
4. Pytest Framework
5. Unittest-Framework
6. Iteratoren und Generatoren

book
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?

question mark

Welcher der folgenden Code-Snippets mockt die Methode get_balance korrekt, um 500 zurückzugeben?

Select the correct answer

question mark

Was überprü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