2016-06-17 14 views
0

Ich habe eine wirklich einfache Web-App. Alle wichtigen Sachen passiert in index.py:Testen der lokalen Einheit für Google App Engine + Python WebApp2

from google.appengine.api import users 
import webapp2 
import os 
import jinja2 

JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)), 
    extensions=['jinja2.ext.autoescape'], 
    autoescape=True) 

def get_user(): 
    user = {} 
    user['email'] = str(users.get_current_user()) 
    user['name'], user['domain'] = user['email'].split('@') 
    user['logout_link'] = users.create_logout_url('/') 
    return user 

class BaseHandler(webapp2.RequestHandler): 

    def dispatch(self): 
    user = get_user() 
    template_values = {'user': user} 
    if user['domain'] != 'foo.com': 
     template_values['page_title'] = 'Access Denied' 
     template = '403' 
    else: 
     template_values['page_title'] = 'Home' 
     template = 'index' 
    template_engine = JINJA_ENVIRONMENT.get_template('%s.html' % template) 
    self.response.write(template_engine.render(template_values)) 

app = webapp2.WSGIApplication([ 
    ('/', BaseHandler), 
], debug=True) 

Ich versuche, ein guter Mensch zu sein und einige lokale Unit-Tests zu schreiben, aber - nachdem sie an der documentation suchen - ich bin total aus meiner Tiefe. Alles was ich will ist ein Grundgerüst, wo ich so etwas tun kann:

python test_security.py 

und simulieren zwei Benutzer die Domäne schlagen - ein @ foo.com, die den Index-Vorlage bekommen sollte, und ein @ bar.com wer sollte erhalten die Vorlage 403.

Hier ist, wo ich bisher habe:

import sys 

# I don't want to talk about it, let's just ignore this block 
sys.path.append('C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2') 
sys.path.append('C:\Program Files (x86)\Google\google_appengine\lib\webob-1.2.3') 
sys.path.append('C:\Program Files (x86)\Google\google_appengine\lib\jinja2-2.6') 
sys.path.append('C:\Program Files (x86)\Google\google_appengine\lib\yaml-3.10') 
sys.path.append('C:\Program Files (x86)\Google\google_appengine\lib\jinja2-2.6') 
sys.path.append('C:\Program Files (x86)\Google\google_appengine') 
sys.path.append('C:\pytest') 


# A few proper imports 
import unittest 
import webapp2 
from google.appengine.ext import testbed 

# Import the module I'd like to test 
import index 

class TestHandlers(unittest.TestCase): 
    def test_hello(self): 

     self.testbed = testbed.Testbed() 
     self.testbed.init_user_stub() 
     self.testbed.setup_env(USER_EMAIL='[email protected]',USER_ID='1', USER_IS_ADMIN='0') 

     request = webapp2.Request.blank('/') 
     response = request.get_response(main.app) 

     print "running test" 

     self.assertEqual(response.status_int, 200) 
     self.assertEqual(response.body, 'Hello, world!') 

Vorhersagbar dies nicht funktioniert überhaupt nicht. Was vermisse ich? Überschätze ich einfach, wie einfach das sein sollte?

+0

Was "funktioniert überhaupt nicht" bedeutet genau? –

+0

"laufender Test" gibt nie aus - also während ich denke, dass ich den Test definiert habe, bin ich mir nicht sicher, was ich tun muss, um ihn auszuführen. Ich bin mir sicher, dass ich Fehler bekommen werde, wenn ich versuche, es zum Laufen zu bringen, aber es einfach zu machen, wäre ein schöner erster Schritt :) – mcl

Antwort

2

Wenn Sie über das Aufrufen dieser mit „Python test_security.py“ planen, die magischen Worte, die Sie suchen sind:

if __name__ == '__main__': 
    unittest.main() 

Damit wird Ihr Komponententest ausgeführt - im Moment definieren Sie ihn nur noch.

Beachten Sie auch, dass Sie Ihre request.get_response von "main.app" zu "index.app" ändern müssen.

1

Ich vermute (in erster Linie auf der Grundlage der Funktionsnamen), dass Sie self.testbed.init_user_stub()vor Aufruf self.testbed.setup_env() aufrufen sollten, nicht nach.

Auch Sie scheinen zu fehlen eine erste und möglicherweise eine testbed.activate() Anruf.

Sie könnte wollen diese Antwort überprüfen: https://stackoverflow.com/a/21139805/4495081

+0

Bearbeitetes Codebeispiel in Übereinstimmung damit - danke. Leider ist das Problem (naja, das erste von vielen Problemen), dass mein Testmodul nicht wirklich läuft (der Testdruck dort wird nie ausgelöst). Ich bin überrascht (vielleicht töricht), wie undurchsichtig die Testwelt für einen Anfänger ist. Die App funktioniert gut, aber bisher sind die Tests schwieriger als die eigentliche Funktionalität! – mcl

+1

Am Anfang ist es oft schwer. Verzweifeln Sie nicht und beißen Sie nicht mehr, als Sie kauen können. Kleine Schritte, bis Sie mit der neuen Technologie vertraut sind, dann wird es ein Kinderspiel. Ihr Code zeigt nicht, wie/wo Sie die 'test_hello()' Methode aufrufen. –

+0

Danke! Ich werde es weiter versuchen :) – mcl