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.
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.
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
Noen av fordelene med mocking inkluderer:
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.
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.
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
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.