Mocking og testisolasjon
Sveip for å vise menyen
Mocking er en kraftig teknikk innen enhetstesting som lar deg erstatte deler av systemet du tester med mock-objekter eller funksjoner. Målet er å isolere kodeenheten du tester fra dens avhengigheter, som databaser, API-er eller andre komplekse systemer. Ved å bruke mocks kan du kontrollere oppførselen til avhengigheter og fokusere på å teste logikken i koden din i et kontrollert miljø.
Testisolasjon er viktig fordi det sikrer at tester ikke påvirker hverandre og ikke blir påvirket av faktorer utenfor deres omfang. Isolerte tester er mer pålitelige og enklere å feilsøke fordi resultatene kun avhenger av koden som testes og de spesifikke forholdene du setter opp, ikke av tilstanden eller oppførselen til eksterne systemer.
I Python tilbyr unittest.mock-modulen verktøy for å mocke objekter og funksjoner. Når du bruker mocking, kan du erstatte en ekte funksjon eller et objekt med en mock som returnerer kontrollerte verdier eller registrerer hvordan den ble brukt. Dette er spesielt nyttig når koden din samhandler med ressurser som er trege, upålitelige eller utilgjengelige under testing.
12345678910111213141516171819202122232425import 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)
I denne kodeeksempelet simulerer funksjonen check_the_sky en ekstern avhengighet som er upålitelig eller ødelagt, for eksempel et vær-API som kanskje ikke alltid er tilgjengelig. Funksjonen get_advice inneholder logikken du ønsker å teste — den kaller check_the_sky og returnerer råd basert på resultatet.
Testklassen unittest bruker mocking for å erstatte den ekte check_the_sky-funksjonen med en mock som returnerer kontrollerte verdier. Dette gjør det mulig å teste hvordan get_advice oppfører seg i ulike scenarier, som når himmelen er klar eller regnfull, uten å være avhengig av det faktiske eksterne systemet.
Dekoratoren @patch brukes til midlertidig å erstatte den ekte check_the_sky-funksjonen med et mock-objekt under hver testmetode. Mock-objektet sendes til testmetoden som parameteren mock_check. Du bruker mock_check til å angi returverdien du ønsker for den testen, slik at du kan kontrollere hvordan koden din oppfører seg og hva den returnerer i hvert scenario.
Funksjonen unittest.main() i denne leksjonen inkluderer noen ekstra parametere som kun er nødvendige for dette læringsmiljøet. De hjelper koden å kjøre riktig på plattformen og er ikke en del av de sentrale Python-konseptene du trenger å lære nå.
Ved å bruke mocking isolerer du testene dine fra eksterne systemer som kan være trege eller upålitelige. Dette gjør testene dine raske, repeterbare og deterministiske, fordi du har full kontroll over hva avhengigheten returnerer i hver test.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår