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
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Pythonin Rakenteellinen Ohjelmointi

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

question mark

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

Select the correct answer

question mark

Mitä seuraava testi tarkistaa?

Select the correct answer

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

Suggested prompts:

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?

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?

Select the correct answer

question mark

Mitä seuraava testi tarkistaa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 5
some-alt