Edistynyt 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?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme