Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Mockaus ja testieristys | Testing with unittest and pytest
Pythonin Rakenteellinen Ohjelmointi

Mockaus ja testieristys

Pyyhkäise näyttääksesi valikon

Mocking on tehokas tekniikka yksikkötestauksessa, jonka avulla voit korvata testattavan järjestelmän osia mock-olioilla tai -funktioilla. Tavoitteena on eristää testattava koodiyksikkö sen riippuvuuksista, kuten tietokannoista, API-rajapinnoista tai muista monimutkaisista järjestelmistä. Mockien avulla voit hallita riippuvuuksien käyttäytymistä ja keskittyä testaamaan koodisi logiikkaa hallitussa ympäristössä.

Testien eristäminen on tärkeää, koska se varmistaa, etteivät testit häiritse toisiaan eivätkä ole riippuvaisia ulkopuolisista tekijöistä. Eristetyt testit ovat luotettavampia ja helpompia debugata, koska niiden tulokset riippuvat vain testattavasta koodista ja määrittelemistäsi olosuhteista, eivät ulkoisten järjestelmien tilasta tai käyttäytymisestä.

Pythonissa unittest.mock-moduuli tarjoaa työkalut olioiden ja funktioiden mockaamiseen. Mockingilla voit korvata oikean funktion tai olion mockilla, joka palauttaa hallittuja arvoja tai tallentaa, miten sitä on käytetty. Tämä on erityisen hyödyllistä, kun koodisi on vuorovaikutuksessa resurssien kanssa, jotka ovat hitaita, arvaamattomia tai eivät ole saatavilla testauksen aikana.

12345678910111213141516171819202122232425
import unittest from unittest.mock import patch def check_the_sky(): # Simulate a slow or unreliable API raise ConnectionError("API not available") def get_advice(): if check_the_sky(): return "Take an umbrella." else: return "Enjoy the sunshine!" class TestWeather(unittest.TestCase): @patch('__main__.check_the_sky') def test_advice_when_rainy(self, mock_check): mock_check.return_value = True self.assertEqual(get_advice(), "Take an umbrella.") @patch('__main__.check_the_sky') def test_advice_when_clear(self, mock_check): mock_check.return_value = False self.assertEqual(get_advice(), "Enjoy the sunshine!") unittest.main(argv=[''], exit=False)

Tässä koodiesimerkissä check_the_sky-funktio simuloi ulkoista riippuvuutta, joka on epäluotettava tai rikki, kuten sää-API, joka ei aina ole käytettävissä. get_advice-funktio sisältää testattavan logiikan — se kutsuu check_the_sky-funktiota ja palauttaa neuvon tuloksen perusteella.

unittest-testiluokka käyttää mocking-tekniikkaa korvatakseen oikean check_the_sky-funktion mockilla, joka palauttaa hallittuja arvoja. Näin voit testata, miten get_advice käyttäytyy eri tilanteissa, kuten kun taivas on selkeä tai sateinen, ilman että olet riippuvainen oikeasta ulkoisesta järjestelmästä.

@patch-koristetta käytetään korvaamaan oikea check_the_sky-funktio mock-oliolla jokaisen testimetodin ajaksi. Mock-olio välitetään testimetodille mock_check-parametrina. mock_check-olion avulla asetat haluamasi palautusarvon kyseiselle testille, jolloin voit hallita koodisi käyttäytymistä ja palautteita eri tilanteissa.

Note
Huomio

Tämän oppitunnin funktio unittest.main() sisältää muutamia ylimääräisiä parametreja, joita tarvitaan vain tässä oppimisympäristössä. Ne auttavat koodia toimimaan oikein alustalla, eivätkä ole osa ydinasioita, jotka sinun tarvitsee oppia Pythonista juuri nyt.

Mockauksen avulla testit voidaan eristää ulkoisista järjestelmistä, jotka voivat olla hitaita tai epäluotettavia. Tämä tekee testeistä nopeita, toistettavia ja deterministisiä, koska voit hallita tarkasti, mitä riippuvuus palauttaa jokaisessa testitapauksessa.

question mark

Milloin mockausta tulisi käyttää yksikkötesteissä?

Valitse kaikki oikeat vastaukset

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 4

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

Osio 5. Luku 4
some-alt