Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Mockning och Testisolering | Testing with unittest and pytest
Python Strukturell Programmering

Mockning och Testisolering

Svep för att visa menyn

Mockning är en kraftfull teknik inom enhetstestning som gör det möjligt att ersätta delar av ditt system under test med mock-objekt eller funktioner. Syftet är att isolera den koddel du testar från dess beroenden, såsom databaser, API:er eller andra komplexa system. Genom att använda mocks kan du kontrollera beroendenas beteende och fokusera på att testa logiken i din kod i en kontrollerad miljö.

Testisolering är viktigt eftersom det säkerställer att tester inte stör varandra och inte påverkas av faktorer utanför deras omfång. Isolerade tester är mer tillförlitliga och enklare att felsöka eftersom deras resultat endast beror på koden som testas och de specifika villkor du sätter upp, inte på tillståndet eller beteendet hos externa system.

I Python tillhandahåller modulen unittest.mock verktyg för att mocka objekt och funktioner. När du använder mockning kan du ersätta en verklig funktion eller ett objekt med en mock som returnerar kontrollerade värden eller registrerar hur den användes. Detta är särskilt användbart när din kod interagerar med resurser som är långsamma, oförutsägbara eller otillgängliga under testning.

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)

I detta kodexempel simulerar funktionen check_the_sky ett externt beroende som är opålitligt eller trasigt, till exempel ett väder-API som kanske inte alltid är tillgängligt. Funktionen get_advice innehåller logiken du vill testa — den anropar check_the_sky och returnerar råd baserat på resultatet.

Testklassen för unittest använder mockning för att ersätta den verkliga funktionen check_the_sky med en mock som returnerar kontrollerade värden. Detta gör det möjligt att testa hur get_advice beter sig i olika scenarier, såsom när himlen är klar eller regnig, utan att förlita sig på det faktiska externa systemet.

Dekoratorn @patch används för att tillfälligt ersätta den verkliga funktionen check_the_sky med ett mock-objekt under varje testmetod. Mock-objektet skickas till testmetoden som parametern mock_check. Du använder mock_check för att ange det returvärde du vill ha för det testet, så att du kan kontrollera hur din kod beter sig och vad den returnerar i varje scenario.

Note
Observera

Funktionen unittest.main() i denna lektion innehåller ett par extra parametrar som endast krävs för denna lärmiljö. De hjälper koden att köras korrekt på plattformen och är inte en del av de grundläggande Python-koncepten du behöver lära dig just nu.

Genom att använda mocking isolerar du dina tester från externa system som kan vara långsamma eller opålitliga. Detta gör dina tester snabba, repeterbara och deterministiska, eftersom du exakt styr vad beroendet returnerar i varje testfall.

question mark

När bör du använda mocking i enhetstester?

Välj alla rätta svar

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 4

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 5. Kapitel 4
some-alt