L'unità locale Test per Python: descrive come eseguire i test delle unità per un'applicazione. Sebbene i test delle unità siano ideali per testare unità separate di di codice, l'integrazione di queste unità di codice è ciò che fa funzionare l'applicazione, quindi i test di integrazione sono altrettanto importanti.
Per le applicazioni App Engine, i gestori delle richieste sono un'integrazione fondamentale punti. Mentre un'applicazione WSGI instrada le richieste al gestore corretto, il gestore stesso elabora i dati della richiesta e genera una risposta (ulteriori informazioni informazioni su Requests Gestori). I gestori delle richieste sono normali oggetti Python come qualsiasi altro funzione o classe, che li rende facili da usare nei test automatici. Ma poiché un'applicazione WSGI li aggrega come una shell, utilizzeremo una shell simile nel nostro test.
WebTest
Per i nostri test, utilizzeremo il framework WebTest. WebTest è un che offre un'interfaccia semplice per testare le applicazioni basate su WSGI e quindi i gestori delle richieste. A tale scopo, esegue il wrapping di un'applicazione WSGI in una speciale app di test che possa essere utilizzata per i test. WebTest ti consente di interagire con i tuoi gestori senza un ambiente App Engine completo; puoi inviare facilmente le richieste e modificare l'ambiente di richiesta. Le risposte hanno anche un'interfaccia adatta ai test. Non è necessario utilizzare WebTest, ma ti semplifica la vita.
Prima di iniziare, installa WebTest sulla tua macchina locale o dove intendi eseguire i test degli handler. Le istruzioni sono disponibili all'indirizzo http://webtest.pythonpaste.org/#installation
Test di un gestore "Hello World" semplice
Iniziamo testando un semplice gestore "Hello World!" che risponde a una richiesta dell'utente con una risposta in testo normale. La risposta dell'handle è "Hello World!". e il tipo di contenuti è "text/plain":
import webapp2 import webtest class HelloWorldHandler(webapp2.RequestHandler): def get(self): # Create the handler's response "Hello World!" in plain text. self.response.headers['Content-Type'] = 'text/plain' self.response.out.write('Hello World!')
Poi, crea il caso di test e inizializza un'applicazione di test che utilizza il tuo gestore:
... class AppTest(unittest.TestCase): def setUp(self): # Create a WSGI application. app = webapp2.WSGIApplication([('/', HelloWorldHandler)]) # Wrap the app with WebTest’s TestApp. self.testapp = webtest.TestApp(app) # Test the handler. def testHelloWorldHandler(self): response = self.testapp.get('/') self.assertEqual(response.status_int, 200) self.assertEqual(response.normal_body, 'Hello World!') self.assertEqual(response.content_type, 'text/plain')
Come puoi vedere, WebTest ti consente di effettuare richieste GET con una semplice chiamata get(), mentre gli altri metodi di richiesta hanno metodi simili. Il valore restituito è risposta con cui puoi testare codice di stato, corpo, tipo di contenuti e molto altro ancora: dai un'occhiata sulla home page di WebTest per un una descrizione dettagliata di tutte le cose che puoi fare.
La creazione di un Test del gestore che utilizza un servizio App Engine
Ora vediamo come testare un gestore che utilizza un servizio App Engine. Ciò significa che ora dobbiamo gestire due componenti che potrebbero influire sui nostri test: l'handler e il servizio che stiamo utilizzando. Come descritto nella sezione il test delle unità locali per Python, il modo migliore per gestire i servizi nei test è utilizza testbed.
L'esempio seguente utilizza Memcache, ma il principio è lo stesso per ad altri servizi come Datastore o Task Queue.
Il gestore che testiamo memorizza nella cache la chiave e il valore specificati. Tieni presente che analizziamo entrambi i valori dai parametri di richiesta.
from google.appengine.api import memcache from google.appengine.ext import testbed import webapp2 import webtest class CacheHandler(webapp2.RequestHandler): def post(self): key = self.request.get('key') value = self.request.get('value') memcache.set(key, value)
Nel test, come prima, crea prima un'applicazione e avvolgila con WebTest. Inoltre, attiva un Testbed e assicurati di disattivarla dopo il test.
... class AppTest(unittest.TestCase): def setUp(self): app = webapp2.WSGIApplication([('/cache/', CacheHandler)]) self.testapp = webtest.TestApp(app) self.testbed = testbed.Testbed() self.testbed.activate() def tearDown(self): self.testbed.deactivate() def testCacheHandler(self): # First define a key and value to be cached. key = 'answer' value = '42' self.testbed.init_memcache_stub() params = {'key': key, 'value': value} # Then pass those values to the handler. response = self.testapp.post('/cache/', params) # Finally verify that the passed-in values are actually stored in Memcache. self.assertEqual(value, memcache.get(key))
Configurazione di un framework di test
Se vuoi, puoi configurare un framework di test. Verifica la presenza di gestori che utilizzano WebTest può essere eseguiti come i test delle unità per App Engine. L'unica differenza è che devi assicurati di aver installato WebTest.