Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Edistynyt Mockaus Unittestissä | Unittest-Kehyksen Hallinta
Pythonin Rakenteellinen Ohjelmointi

bookEdistynyt Mockaus Unittestissä

Pyyhkäise näyttääksesi valikon

Edellisessä luvussa tarkastelimme Mock-olion merkitystä testauksessa. Nyt syvennymme sen eri ominaisuuksiin ja selvennämme mahdollisesti epäselviä kohtia.

Johdanto MagicMockiin

MagicMock on erittäin monipuolinen Mock-toteutus, joka tukee taikametodeja. Sitä voidaan käyttää monimutkaisten olioiden käyttäytymisen jäljittelemiseen testeissä, kuten aiemmassa luvussa nähtiin.

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)

Tässä esimerkissä MagicMockia käytetään simuloimaan get_account_balance-metodia, joka normaalisti hakisi tietoja tietokannasta.

mock.patchin käyttö

@mock.patch-koristetta käytetään korvaamaan olioiden todelliset toteutukset tilapäisesti koodissasi.

Kuvittele funktio, joka tarkistaa käyttäjän tunnistetiedot tietokantaa vasten. mock.patchin avulla voit välttää varsinaisen tietokannan käytön:

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 context managerin avulla

Joskus on suositeltavaa käyttää patch()-funktiota context managerina koristteen sijaan, erityisesti kun:

  • haluat mockata olion vain osan testistä ajan;
  • tai kun koristeiden tai parametrien liiallinen käyttö heikentää testien selkeyttä.
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

monkeypatch-fixture Pytestissä mahdollistaa luokkien, moduulien tai ympäristöjen tilapäisen muokkaamisen testin aikana.

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'

monkeypatch-fixture mahdollistaa ympäristön turvallisen muokkaamisen ja hallinnan testin aikana ilman, että sillä on vaikutuksia testin ulkopuolella.

1. Mikä seuraavista koodiesimerkeistä mokkaa get_balance-metodin oikein palauttamaan arvon 500?

2. Mitä seuraava testi tarkistaa?

question mark

Mikä seuraavista koodiesimerkeistä mokkaa get_balance-metodin oikein palauttamaan arvon 500?

Valitse oikea vastaus

question mark

Mitä seuraava testi tarkistaa?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 5

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 5. Luku 5
some-alt