Mocking è una libreria per test in Python. Ti permette di sostituire parti del tuo sistema sotto test con oggetti finti e di fare affermazioni su come sono stati usati. Questo tutorial discuterà in dettaglio cosa è il mocking e come usarlo nelle applicazioni Python.
Mocking è una libreria per il testing in Python che ti permette di sostituire parti del tuo sistema sotto test con oggetti mock e fare asserzioni su come sono stati usati.
In Python, il mocking si ottiene sostituendo parti del tuo sistema con oggetti finti usando il modulo unittest.mock. Questo modulo contiene una serie di classi e funzioni utili, vale a dire la funzione patch (come decorator e context manager) e la classe MagicMock. Queste due componenti sono molto importanti per ottenere il mocking in Python.
Una chiamata di funzione fittizia di solito restituisce immediatamente un valore predefinito. Anche gli attributi e i metodi dell'oggetto fittizio sono definiti nel test, senza creare l'oggetto reale.
Mocking consente inoltre di restituire valori predefiniti a ciascuna chiamata di funzione durante la scrittura dei test. Questo ti permette di avere più controllo durante i test.
Mock è disponibile in Python 3, ma se stai usando una versione di Python qui sotto
3.3, puoi ancora usarlo unittest.mock
importandolo come una libreria separata come questa.
$ pip installa mock
Alcuni dei vantaggi del beffeggiamento includono:
Utilizzo di finto
è semplice come:
>>> da mock import Mock >>> mock = Mock (return_values = 10) >>> mock (1,4, foo = 'bar')>>> mock.return_values 10
Qui, importiamo il modulo mock, creiamo un oggetto mock e specifichiamo i valori di ritorno. Quando viene chiamato l'oggetto mock, vogliamo che sia in grado di restituire alcuni valori. Nel nostro caso, vogliamo che l'oggetto mock restituisca un valore di 10. Se chiamiamo l'oggetto fittizio con gli argomenti (1, 4, foo = 'bar')
, il risultato sarà il valore 10, che è stato definito come valore di ritorno.
Puoi anche sollevare eccezioni all'interno di mock come segue:
>>> mock = Mock (side_effect = KeyError ('foobar')) >>> mock () Traceback (ultima chiamata ultima): ... KeyError: 'foobar'
Il effetti collaterali
argomento ti permette di eseguire determinate cose come sollevare un'eccezione quando viene chiamata una finta.
Considera questa semplice funzione:
richieste di importazione def api (): response = requests.get ('https://www.google.com/') risposta di risposta
Questa funzione esegue una richiesta API alla pagina web di Google e restituisce una risposta.
Il caso di test semplice corrispondente sarà il seguente:
import unittest dalla classe di importazione principale TetsApi (unittest.TestCase): def test_api (self): assert api () == 200
Eseguendo il test precedente dovrebbe dare un risultato simile:
---------------------------------------------------------------------- Ran 1 test in 3.997s OK
Introduciamo il mocking in questo esempio e il test risultante con il modulo Mock sarà come mostrato di seguito:
import unittest da mock import Mock da mock import patch import richieste import unittest class TetsApi (unittest.TestCase): def test_api (self): con patch.object (request, 'get') as get_mock: get_mock.return_value = mock_response = Mock ( ) mock_response.status_code = 200 assert api () == 200
Eseguendo il test precedente dovrebbe dare un risultato simile:
---------------------------------------------------------------------- Ran 1 test in 0.001s OK
Come visto sopra, il modulo di simulazione impiega meno tempo per effettuare la stessa chiamata API del caso di test normale.
Supponiamo che tu abbia uno script che interagisce con un'API esterna e che effettui chiamate a tale API ogni volta che viene chiamata una determinata funzione. In questo esempio, useremo l'API di Twitter per implementare uno script Python che pubblicherà sulla pagina del profilo di Twitter.
Non vogliamo pubblicare messaggi su Twitter ogni volta che testiamo lo script, ed è qui che entra in gioco Mocking.
Iniziamo. Useremo la libreria python-twitter e la prima cosa che faremo è creare una cartella python_mock
e, all'interno della cartella, creare due file, vale a dire tweet.py
e mock_test.py
.
Scrivi il seguente codice nel file tweet.py
.
# Pip install python-twitter importazione di Twitter # definiscono credenziali di autenticazione consumer_key = consumer_secret 'iYD2sKY4NC8teRb9BUM8UguRa' = access_token_key 'uW3tHdH6UAqlxA7yxmcr8FSMSzQIBIpcC4NNS7jrvkxREdJ15m' = '314.746.354-Ucq36TRDnfGAxpOVtnK1qZxMfRKzFHFhyRqzNpTx7wZ1qHS0qycy0aNjoMDpKhcfzuLm6uAbhB2LilxZzST8w' access_token_secret = '7wZ1qHS0qycy0aNjoMDpKhcfzuLm6uAbhB2LilxZzST8w' def post_tweet (api, Tweet): # messaggio di stato Tweet = api.PostUpdate (tweet) return status 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 ("Inserisci il tuo tweet:") post_tweet (api, message) se __name__ == '__main__': main ()
Nel codice sopra, prima importiamo la libreria di Twitter e poi definiamo le credenziali di autenticazione, che puoi facilmente ottenere dalla pagina delle app di Twitter.
L'API di Twitter è esposta tramite twitter.Api
classe, quindi creiamo la classe passando i nostri token e le nostre chiavi segrete.
Il post_tweet
la funzione accetta un oggetto di autenticazione e il messaggio e quindi pubblica il tweet sul profilo Twitter.
Quindi procediamo e prendiamo in giro la chiamata API a Twitter in modo che l'API non invii messaggi su Twitter ogni volta che viene chiamata. Vai avanti e apri il mock_test.py
file e aggiungi il seguente codice.
# mock_test.py #! / usr / bin / env python import unittest da mock import Mock import tweet class TweetTest (unittest.TestCase): def test_example (self): mock_twitter = Mock () tweet.post_tweet (mock_twitter, "Creazione di un task Manager App Using Ionic: Part 1 ") mock_twitter.PostUpdate.assert_called_with (" Creazione di un'app Task Manager tramite Ionic: parte 1 ") se __name__ == '__main__': unittest.main ()
Eseguendo il test precedente dovrebbe dare un risultato simile:
---------------------------------------------------------------------- Ran 1 test in 0.001s OK
Questo tutorial ha coperto la maggior parte delle nozioni di base di mocking e come utilizzare il mocking per eseguire chiamate API esterne. Per ulteriori informazioni, visitare la documentazione di mocking ufficiale di Python. In questo tutorial puoi trovare ulteriori risorse sull'autenticazione con l'API di Twitter.
Inoltre, non esitare a vedere ciò che abbiamo a disposizione per la vendita e per studiare nel mercato Envato, e per favore vai avanti e fai tutte le domande e fornisci il tuo prezioso feedback usando il feed qui sotto.