Mocking är ett bibliotek för testning i Python. Det låter dig ersätta delar av ditt system som testas med mocka föremål och göra påståenden om hur de har använts. Denna handledning kommer att diskutera i detalj vad mocking är och hur man använder det i Python applikationer.
Mocking är ett bibliotek för testning i Python som låter dig ersätta delar av ditt system som testas med mocka föremål och göra påståenden om hur de har använts.
I Python uppnås mocking genom att ersätta delar av ditt system med mocka objekt med unittest.mock-modulen. Denna modul innehåller ett antal användbara klasser och funktioner, nämligen patchfunktionen (som decorator och context manager) och MagicMock-klassen. Dessa två komponenter är mycket viktiga för att uppnå mocking i Python.
Ett mock funktionssamtal returnerar vanligtvis ett fördefinierat värde omedelbart. Ett mock-objekts attribut och metoder definieras också i testet utan att skapa det verkliga objektet.
Mocking tillåter dig också att returnera fördefinierade värden till varje funktionssamtal när du skriver test. Detta gör det möjligt för dig att ha större kontroll vid provning.
Mock finns i Python 3, men om du använder en Python-version nedan
3.3, kan du fortfarande använda unittest.mock
genom att importera det som ett separat bibliotek som så.
$ pip installera mock
Några av fördelarna med mocking är:
Användning av falsk
är enkelt som:
>>> från mock import Mock >>> mock = Mock (return_values = 10) >>> mock (1,4, foo = 'bar')>>> mock.return_values 10
Här importerar vi mock-modulen, skapar ett mock objekt och anger returvärden. När det mocka objektet heter, vill vi att det ska kunna returnera några värden. I vårt fall vill vi att mock-objektet returnerar ett värde av 10. Om vi kallar det mocka objektet med argumenten (1, 4, foo = "bar")
, resultatet blir värdet 10, vilket definierades som ett returvärde.
Du kan också hämta undantag i mocks enligt följande:
>>> mock = Mock (side_effect = KeyError ('foobar')) >>> mock () Traceback (senaste samtal sist): ... KeyError: 'foobar'
De bieffekter
argumentet tillåter dig att utföra vissa saker som att höja ett undantag när en mock kallas.
Tänk på denna enkla funktion:
importförfrågningar def api (): response = requests.get ('https://www.google.com/') returneringssvar
Den här funktionen utför en API-begäran till Googles webbsida och returnerar ett svar.
Det motsvarande enkla testfallet kommer att vara enligt följande:
importera unittest från main import api-klassen TetsApi (unittest.TestCase): def test_api (self): assert api () == 200
Om du kör ovanstående test ska du ge en utmatning som så:
---------------------------------------------------------------------- Ran 1 test i 3.997s OK
Låt oss introducera mocking till det här exemplet, och det resulterande testet med Mock-modulen kommer att vara som visas nedan:
importera unittest från mock import Mock från mock import patch importförfrågningar importera unittest class TetsApi (unittest.TestCase): def test_api (själv): med patch.object (requests, 'get') som get_mock: get_mock.return_value = mock_response = Mock ) mock_response.status_code = 200 assert api () == 200
Om du kör ovanstående test ska du ge en utmatning som så:
---------------------------------------------------------------------- Ran 1 test i 0.001s OK
Som framgår av ovanstående tar mocking-modulen mindre tid att göra samma API-samtal som det normala testfallet.
Låt oss anta att du har ett skript som interagerar med ett externt API och samtalar till det API närhelst en viss funktion heter. I det här exemplet kommer vi att använda Twitter API för att implementera ett Python-skript som kommer att skicka till Twitter-profilsidan.
Vi vill inte skicka meddelanden på Twitter varje gång vi testar manuset, och det är där Mocking kommer in.
Låt oss börja. Vi kommer att använda python-twitter-biblioteket, och det första vi ska göra är att skapa en mapp python_mock
och, inuti mappen, skapa två filer, nämligen tweet.py
och mock_test.py
.
Skriv följande kod till filen tweet.py
.
# PiP installera python-twitter import twitter # definierar autentiseringsuppgifter consumer_key = 'iYD2sKY4NC8teRb9BUM8UguRa' consumer_secret = 'uW3tHdH6UAqlxA7yxmcr8FSMSzQIBIpcC4NNS7jrvkxREdJ15m' access_token_key = '314.746.354-Ucq36TRDnfGAxpOVtnK1qZxMfRKzFHFhyRqzNpTx7wZ1qHS0qycy0aNjoMDpKhcfzuLm6uAbhB2LilxZzST8w' access_token_secret = '7wZ1qHS0qycy0aNjoMDpKhcfzuLm6uAbhB2LilxZzST8w' def post_tweet (api, tweet): # inlägget 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 ("Ange din tweet:") post_tweet (api, meddelande) om __name__ == '__main__': main ()
I koden ovan importerar vi först Twitter-biblioteket och anger sedan autentiseringsuppgifter, som du enkelt kan hämta från Twitter Apps-sidan.
Twitter API är exponerat via twitter.Api
klass, så vi skapar klassen genom att förmedla våra tokens och hemliga nycklar.
De post_tweet
funktionen tar in ett autentiseringsobjekt och meddelandet och lägger sedan in tweeten i Twitter-profilen.
Vi fortsätter sedan och stöter på API-samtalet på Twitter så att API inte postar till Twitter varje gång det heter. Gå vidare och öppna mock_test.py
fil och lägg till följande kod.
Mock_test.py # Manager App Using Ionic: Part 1 ") mock_twitter.PostUpdate.assert_called_with (" Skapa en Task Manager App med joniska: Del 1 ") om __name__ == '__main__': unittest.main ()
Om du kör ovanstående test ska du ge en utmatning som så:
---------------------------------------------------------------------- Ran 1 test i 0.001s OK
Denna handledning har täckt de flesta av grundarna för mocking och hur man använder mocking för att utföra externa API-samtal. För mer information, besök den officiella Python mocking dokumentationen. Du kan också hitta ytterligare resurser om autentisering med Twitter API i den här handledningen.
Tveka inte att se vad vi har till salu och studera på Envato Market, och snälla fortsätt och fråga några frågor och ge din värdefulla feedback med hjälp av flödet nedan.