Test del gestore per Python 2

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 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 viene eseguito 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 un facile da testare. Non è necessario utilizzare WebTest, ma ti semplifica la vita.

Prima di iniziare, installa WebTest sul tuo computer locale o ovunque intendono eseguire test sui gestori. Le istruzioni sono disponibili all'indirizzo http://webtest.pythonpaste.org/#installation

Test di un semplice "Hello World" Gestore

Iniziamo con il test di un semplice "Hello World!" che risponde a un alla 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!')

Crea quindi lo scenario 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 consente di effettuare richieste GET con una semplice funzione (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 diamo un'occhiata a come testare un gestore che utilizza un oggetto App Engine completamente gestito di Google Cloud. Ciò significa che ora dobbiamo gestire due componenti che possono influenzare test: il gestore 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 sottoposto a test memorizza nella cache la chiave e il valore specificati. Nota che analizziamo entrambi i valori dai parametri della 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 in precedenza, devi prima creare un'applicazione e includerla nel Test Web. 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 impostare 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.