Edistynyt Mockaus Unittestissä
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
Can you explain the difference between Mock and MagicMock?
How does mock.patch work with classes and methods?
When should I use a context manager instead of a decorator for patching?
Mahtavaa!
Completion arvosana parantunut arvoon 3.13
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!