Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Mocking-Tekniikat Unittestissä: Riippuvuuksien Simulointi | Unittest-Kehyksen Hallinta
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Pythonin Rakenteellinen Ohjelmointi

bookMocking-Tekniikat Unittestissä: Riippuvuuksien Simulointi

Koodin testaaminen, joka on riippuvainen ulkoisista palveluista, asetuksista tai aiheuttaa sivuvaikutuksia, voi olla haastavaa. Mocking on tehokas tekniikka, jolla simuloidaan monimutkaisten todellisten vuorovaikutusten käyttäytymistä testeissä ilman niiden monimutkaisuutta ja arvaamattomuutta.

Esimerkiksi, jos sinun täytyy testata rahanvaihtopalvelua, yksi vaihtoehto voisi olla käyttää omia varoja transaktioiden simulointiin ja tulosten tarkkailuun. Tämä menetelmä voi kuitenkin olla riskialtis ja kallis. Tehokkaampi ja riskitön vaihtoehto on käyttää mocking-tekniikkaa rahansiirron lähettämisen emulointiin.

Rahansiirtopalvelun testaaminen

class MoneyTransferService:
    def transfer(self, source_account, destination_account, amount):
        if source_account.balance < amount:
            raise ValueError("Insufficient funds")
        source_account.balance -= amount
        destination_account.balance += amount
        return True

Testauslähestymistapa:

  1. Mockkaa tilien saldot: käytä mocking-tekniikkaa simuloidaksesi erilaisia tilitilanteita, kuten riittämättömät varat tai riittävät varat, testataksesi miten transfer-metodi reagoi;
  2. Vahvista transaktiot: vahvista, että oikeat summat veloitetaan ja hyvitetään asianomaisilta tileiltä siirron aikana;
  3. Käsittele poikkeukset: varmista, että metodi käsittelee oikein tilanteet, joissa siirtoa ei voida suorittaa.
import unittest
from unittest.mock import MagicMock

class TestMoneyTransferService(unittest.junit.TestCase):
    def setUp(self):
        self.transfer_service = MoneyTransferService()
        self.source_account = MagicMock()
        self.destination_account = MagicMock()

    def test_successful_transfer(self):
        # Set up the account balances
        self.source_account.balance = 1000
        self.destination_account.balance = 500

        # Perform the transfer
        successful = self.transfer_service.transfer(self.source_account, self.destination_account, 200)
        
        # Check balances
        self.assertTrue(successful)
        self.assertEqual(self.source_account.balance, 800)
        self.assertEqual(self.destination_account.balance, 700)

    def test_failed_transfer_due_to_insufficient_funds(self):
        # Set up the account balances
        self.source_account.balance = 100
        self.destination_account.balance = 500

        # Attempt to transfer more than the source balance
        with self.assertRaises(ValueError):
            self.transfer_service.transfer(self.source_account, self.destination_account, 200)
        
        # Verify that balances remain unchanged
        self.assertEqual(self.source_account.balance, 100)
        self.assertEqual(self.destination_account.balance, 500)
Tehtävä

Swipe to start coding

Tehtävänäsi on kirjoittaa yksikkötestit MoneyTransferService-luokalle käyttäen unittest-kehystä ja unittest.mock-moduulia. Sinun tulee:

  • Luoda testiluokka, joka perii unittest.TestCase -luokan;
  • Käyttää MagicMock-luokkaa tilin olioiden simuloimiseen;
  • Toteuttaa kaksi testimetodia seuraavilla täsmällisillä nimillä:
    • test_successful_transfer;
    • test_failed_transfer_due_to_insufficient_funds.
  • Metodissa test_successful_transfer testaa siirtoa, jossa lähdetilillä on riittävästi varoja, ja varmista sekä palautusarvo että päivittyneet saldot;
  • Metodissa test_failed_transfer_due_to_insufficient_funds testaa siirtoa, jossa lähdetilillä ei ole tarpeeksi varoja, varmista että ValueError-poikkeus heitetään ja että saldot pysyvät muuttumattomina.

Huom: Testifunktioiden nimet tulee olla täsmälleen yllä mainitut. Testien tulee varmistaa toiminnallisuus tarkistamalla arvot ja poikkeusten käsittely suoraan, ei käyttämällä regexiä tai mallin täsmäytystä.

Ratkaisu

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 4
single

single

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

close

bookMocking-Tekniikat Unittestissä: Riippuvuuksien Simulointi

Pyyhkäise näyttääksesi valikon

Koodin testaaminen, joka on riippuvainen ulkoisista palveluista, asetuksista tai aiheuttaa sivuvaikutuksia, voi olla haastavaa. Mocking on tehokas tekniikka, jolla simuloidaan monimutkaisten todellisten vuorovaikutusten käyttäytymistä testeissä ilman niiden monimutkaisuutta ja arvaamattomuutta.

Esimerkiksi, jos sinun täytyy testata rahanvaihtopalvelua, yksi vaihtoehto voisi olla käyttää omia varoja transaktioiden simulointiin ja tulosten tarkkailuun. Tämä menetelmä voi kuitenkin olla riskialtis ja kallis. Tehokkaampi ja riskitön vaihtoehto on käyttää mocking-tekniikkaa rahansiirron lähettämisen emulointiin.

Rahansiirtopalvelun testaaminen

class MoneyTransferService:
    def transfer(self, source_account, destination_account, amount):
        if source_account.balance < amount:
            raise ValueError("Insufficient funds")
        source_account.balance -= amount
        destination_account.balance += amount
        return True

Testauslähestymistapa:

  1. Mockkaa tilien saldot: käytä mocking-tekniikkaa simuloidaksesi erilaisia tilitilanteita, kuten riittämättömät varat tai riittävät varat, testataksesi miten transfer-metodi reagoi;
  2. Vahvista transaktiot: vahvista, että oikeat summat veloitetaan ja hyvitetään asianomaisilta tileiltä siirron aikana;
  3. Käsittele poikkeukset: varmista, että metodi käsittelee oikein tilanteet, joissa siirtoa ei voida suorittaa.
import unittest
from unittest.mock import MagicMock

class TestMoneyTransferService(unittest.junit.TestCase):
    def setUp(self):
        self.transfer_service = MoneyTransferService()
        self.source_account = MagicMock()
        self.destination_account = MagicMock()

    def test_successful_transfer(self):
        # Set up the account balances
        self.source_account.balance = 1000
        self.destination_account.balance = 500

        # Perform the transfer
        successful = self.transfer_service.transfer(self.source_account, self.destination_account, 200)
        
        # Check balances
        self.assertTrue(successful)
        self.assertEqual(self.source_account.balance, 800)
        self.assertEqual(self.destination_account.balance, 700)

    def test_failed_transfer_due_to_insufficient_funds(self):
        # Set up the account balances
        self.source_account.balance = 100
        self.destination_account.balance = 500

        # Attempt to transfer more than the source balance
        with self.assertRaises(ValueError):
            self.transfer_service.transfer(self.source_account, self.destination_account, 200)
        
        # Verify that balances remain unchanged
        self.assertEqual(self.source_account.balance, 100)
        self.assertEqual(self.destination_account.balance, 500)
Tehtävä

Swipe to start coding

Tehtävänäsi on kirjoittaa yksikkötestit MoneyTransferService-luokalle käyttäen unittest-kehystä ja unittest.mock-moduulia. Sinun tulee:

  • Luoda testiluokka, joka perii unittest.TestCase -luokan;
  • Käyttää MagicMock-luokkaa tilin olioiden simuloimiseen;
  • Toteuttaa kaksi testimetodia seuraavilla täsmällisillä nimillä:
    • test_successful_transfer;
    • test_failed_transfer_due_to_insufficient_funds.
  • Metodissa test_successful_transfer testaa siirtoa, jossa lähdetilillä on riittävästi varoja, ja varmista sekä palautusarvo että päivittyneet saldot;
  • Metodissa test_failed_transfer_due_to_insufficient_funds testaa siirtoa, jossa lähdetilillä ei ole tarpeeksi varoja, varmista että ValueError-poikkeus heitetään ja että saldot pysyvät muuttumattomina.

Huom: Testifunktioiden nimet tulee olla täsmälleen yllä mainitut. Testien tulee varmistaa toiminnallisuus tarkistamalla arvot ja poikkeusten käsittely suoraan, ei käyttämällä regexiä tai mallin täsmäytystä.

Ratkaisu

Switch to desktopVaihda työpöytään todellista harjoitusta vartenJatka siitä, missä olet käyttämällä jotakin alla olevista vaihtoehdoista
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 4
single

single

some-alt