Introduksjon til Mocking i Python

Mocking er et bibliotek for testing i Python. Det tillater deg å erstatte deler av systemet som testes med mock objekter og gjøre påstand om hvordan de har blitt brukt. Denne opplæringen vil diskutere i detalj hva mocking er og hvordan du bruker det i Python-applikasjoner.

Hva er Mocking?

Mocking er et bibliotek for testing i Python som gjør at du kan erstatte deler av systemet ditt under test med mock objekter og hevder hvordan de har blitt brukt.

I Python oppnås mocking ved å erstatte deler av systemet med mock objekter ved hjelp av unittest.mock-modulen. Denne modulen inneholder en rekke nyttige klasser og funksjoner, nemlig patch-funksjonen (som dekorator og kontekstleder) og MagicMock-klassen. Disse to komponentene er svært viktige for å oppnå mocking i Python.

Et mock funksjonsanrop returnerer vanligvis en forhåndsdefinert verdi umiddelbart. En mock objektets attributter og metoder er også definert i testen uten å skape det virkelige objektet.

Mocking lar deg også returnere forhåndsdefinerte verdier til hvert funksjonsanrop når du skriver tester. Dette gir deg mulighet til å få mer kontroll når du tester.

Forutsetninger

Mock er tilgjengelig i Python 3, men hvis du bruker en Python-versjon nedenfor
3.3, kan du fortsatt bruke unittest.mock ved å importere det som et eget bibliotek som det.

$ pip installere mock

Fordeler med mocking

Noen av fordelene med mocking inkluderer:

  1. Unngå for mange avhengigheter. Mocking reduserer funksjonens avhengighet. Hvis du for eksempel har en funksjon En klasse som avhenger av en funksjon B, må du skrive noen enhetstester som dekker funksjonene som tilbys av funksjon B. La oss si at koden vokser i fremtiden, og du har flere funksjoner, det vil si A, avhenger på B, B avhenger av C, og C avhenger av D. Hvis en feil blir introdusert i Z, vil alle enhetstester mislykkes.
  2. Redusert overbelastning. Dette gjelder ressursintensive funksjoner. En mock av den funksjonen ville kutte ned på unødvendig ressursbruk under testen, og dermed redusere prøvetiden.
  3. Bypass tidsbegrensninger i funksjoner. Dette gjelder for planlagte aktiviteter. Tenk deg en prosess som har blitt planlagt å utføre hver time. I en slik situasjon kan det hende at tidskilden gjør at du faktisk kan teste slik logikk, slik at testen din ikke trenger å løpe i flere timer og venter på at tiden skal passere.

bruk

Bruk av håne er enkelt som:

>>> fra mock import Mock >>> mock = Mock (return_values ​​= 10) >>> mock (1,4, foo = 'bar')  >>> mock.return_values ​​10 

Her importerer vi mock-modulen, lager en mock objekt, og angi returverdier. Når den spotte gjenstanden heter, vil vi at den skal kunne returnere noen verdier. I vårt tilfelle ønsker vi det mock-objektet å returnere en verdi på 10. Hvis vi kaller det spotte objektet med argumentene (1, 4, foo = 'bar'), Resultatet blir verdien 10, som ble definert som en returverdi.

Du kan også hente unntak i mocks som følger:

>>> mock = Mock (side_effect = KeyError ('foobar')) >>> mock () Traceback (siste anrop sist): ... KeyError: 'foobar'

De bivirkninger argumentet lar deg utføre visse ting som å hente et unntak når en mock kalles.

Eksempel

Vurder denne enkle funksjonen:

Import forespørsler def api (): response = requests.get ('https://www.google.com/') returrespons

Denne funksjonen utfører en API-forespørsel til Googles nettside og returnerer et svar.

Tilsvarende enkle test tilfelle vil være som følger:

importer unittest fra main import api klassen TetsApi (unittest.TestCase): def test_api (selv): assert api () == 200

Kjører den ovennevnte testen, bør gi en utgang slik:

---------------------------------------------------------------------- Ran 1 test i 3.997s OK 

La oss introdusere stønn på dette eksempelet, og den resulterende testen med Mock-modulen vil være som vist nedenfor:

import unittest fra mock import Mock fra mock import patch import forespørsler importere unittest class TetsApi (unittest.TestCase): def test_api (selv): med patch.object (forespørsler, få) som get_mock: get_mock.return_value = mock_response = Mock ) mock_response.status_code = 200 assert api () == 200

Kjører den ovennevnte testen, bør gi en utgang slik:

---------------------------------------------------------------------- Ran 1 test i 0.001s OK

Som nevnt ovenfor, tar mocking-modulen mindre tid til å gjøre det samme API-anropet som det normale testet.

Større eksempel

La oss anta at du har et skript som samhandler med en ekstern API og foretar anrop til den API når en bestemt funksjon kalles. I dette eksemplet skal vi bruke Twitter API for å implementere et Python-skript som vil legge inn på Twitter profilsiden.

Vi ønsker ikke å legge inn meldinger på Twitter hver gang vi tester skriptet, og det er der Mocking kommer inn.

La oss komme i gang. Vi skal bruke python-twitter-biblioteket, og det første vi skal gjøre er å lage en mappe python_mock og, i mappen, opprett to filer, nemlig tweet.py og mock_test.py.

Skriv følgende kode til filen tweet.py.

# Pip installere python-twitter import twitter # definere godkjenningslegitimasjon consumer_key = 'iYD2sKY4NC8teRb9BUM8UguRa' consumer_secret = 'uW3tHdH6UAqlxA7yxmcr8FSMSzQIBIpcC4NNS7jrvkxREdJ15m' access_token_key = '314746354-Ucq36TRDnfGAxpOVtnK1qZxMfRKzFHFhyRqzNpTx7wZ1qHS0qycy0aNjoMDpKhcfzuLm6uAbhB2LilxZzST8w' access_token_secret = '7wZ1qHS0qycy0aNjoMDpKhcfzuLm6uAbhB2LilxZzST8w' def post_tweet (api, tweet): # post tweet status = api.PostUpdate (tweet) returstatus def main (): api = twitter.Api (consumer_key = consumer_key, consumer_secret = consumer_secret, access_token_key = access_token_key, access_token_secret = access_token_secret) message = raw_input ("Skriv inn tweet:") post_tweet (api, melding) hvis __name__ == '__main__': main () 

I koden ovenfor importerer vi først Twitter-biblioteket og definerer deretter autentiseringsinformasjonen, som du enkelt kan få fra Twitter Apps-siden.

Twitter API er eksponert via twitter.Api klassen, så vi lager klassen ved å sende våre tokens og hemmelige nøkler.

De post_tweet funksjonen tar inn et autentiseringsobjekt og meldingen og legger deretter inn tweetet til Twitter-profilen.

Vi fortsetter da og støtter API-anropet til Twitter, slik at API-en ikke legger til Twitter hver gang den heter. Gå videre og åpne mock_test.py fil og legg til følgende kode.

Mock_test.py # Manager App Using Ionic: Part 1 ") mock_twitter.PostUpdate.assert_called_with (" Opprette en Task Manager App ved hjelp av ionisk: Del 1 ") hvis __name__ == '__main__': unittest.main ()

Kjører den ovennevnte testen, bør gi en utgang slik:

---------------------------------------------------------------------- Ran 1 test i 0.001s OK 

Konklusjon

Denne opplæringen har dekket det meste av grunnlaget for mocking og hvordan man bruker mocking til å utføre eksterne API-anrop. For mer informasjon, besøk den offisielle Python mocking dokumentasjonen. Du kan også finne flere ressurser på godkjenning med Twitter API i denne opplæringen.

I tillegg, ikke nøl med å se hva vi har tilgjengelig for salg og for studier i Envato Market, og vær så snill å fortsette å stille spørsmål og gi din verdifulle tilbakemelding ved å bruke feedet under.