Mocking og Testisolering
Stryg for at vise menuen
Mocking er en kraftfuld teknik i enhedstestning, der gør det muligt at erstatte dele af det system, du tester, med mock-objekter eller funktioner. Målet er at isolere den kodeenhed, du tester, fra dens afhængigheder, såsom databaser, API'er eller andre komplekse systemer. Ved at bruge mocks kan du kontrollere afhængighedernes opførsel og fokusere på at teste logikken i din kode i et kontrolleret miljø.
Testisolering er vigtig, fordi det sikrer, at tests ikke påvirker hinanden og ikke bliver påvirket af faktorer uden for deres rækkevidde. Isolerede tests er mere pålidelige og nemmere at fejlfinde, fordi deres resultater kun afhænger af den testede kode og de specifikke betingelser, du har opsat, ikke af tilstanden eller opførslen af eksterne systemer.
I Python tilbyder modulet unittest.mock værktøjer til at mocke objekter og funktioner. Når du bruger mocking, kan du erstatte en reel funktion eller et objekt med en mock, der returnerer kontrollerede værdier eller registrerer, hvordan det blev brugt. Dette er især nyttigt, når din kode interagerer med ressourcer, der er langsomme, uforudsigelige eller utilgængelige under testning.
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 dette kodeeksempel simulerer funktionen check_the_sky en ekstern afhængighed, der er upålidelig eller ikke fungerer, såsom et vejr-API, der måske ikke altid er tilgængeligt. Funktionen get_advice indeholder den logik, du ønsker at teste — den kalder check_the_sky og returnerer et råd baseret på resultatet.
Testklassen unittest bruger mocking til at erstatte den rigtige check_the_sky-funktion med en mock, der returnerer kontrollerede værdier. Dette gør det muligt at teste, hvordan get_advice opfører sig i forskellige scenarier, såsom når himlen er klar eller regnfuld, uden at være afhængig af det faktiske eksterne system.
Dekoratoren @patch bruges til midlertidigt at erstatte den rigtige check_the_sky-funktion med et mock-objekt under hver testmetode. Mock-objektet sendes til testmetoden som parameteren mock_check. Du bruger mock_check til at angive den returværdi, du ønsker for den pågældende test, så du kan kontrollere, hvordan din kode opfører sig og hvad den returnerer i hvert scenarie.
Funktionen unittest.main() i denne lektion indeholder et par ekstra parametre, som kun er nødvendige for dette læringsmiljø. De hjælper koden med at køre korrekt på platformen og er ikke en del af de centrale Python-koncepter, du behøver at lære nu.
Ved at bruge mocking isolerer du dine tests fra eksterne systemer, der kan være langsomme eller upålidelige. Dette gør dine tests hurtige, gentagelige og deterministiske, fordi du præcist styrer, hvad afhængigheden returnerer i hver test.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat