Google app engine 谷歌应用程序引擎的本地单元测试&x2B;Python WebApp2

Google app engine 谷歌应用程序引擎的本地单元测试&x2B;Python WebApp2,google-app-engine,webapp2,python-unittest,webtest,Google App Engine,Webapp2,Python Unittest,Webtest,我有一个非常简单的web应用程序。所有重要的事情都发生在index.py中: 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.a

我有一个非常简单的web应用程序。所有重要的事情都发生在index.py中:

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)
我试图成为一个好人,写一些本地的单元测试,但是——在看了之后——我完全超出了我的深度。我想要的只是一个基本框架,在这个框架中,我可以执行以下操作:

python test_security.py 
并模拟两个访问域的用户-一个@foo.com应该获得索引模板,另一个@bar.com应该获得403模板

到目前为止,我已经做到了:

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='test@foo.com',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!')
可以预见,这根本不起作用。我错过了什么?我是不是过分高估了这应该有多简单?

我怀疑(主要基于函数名)您应该在调用
self.testbed.init\u user\u stub()之前调用
,而不是之后调用
self.testbed.setup\u env()

另外,您似乎缺少一个初始的
self.testbed=testbed.testbed()
,可能还缺少一个
testbed.activate()
调用


您可能想查看以下答案:

如果您计划使用“python test_security.py”调用此函数,您需要的神奇词汇是:

if __name__ == '__main__':
    unittest.main()
这将使您的单元测试运行——目前您所做的只是定义它


另外请注意,您需要将request.get_response从“main.app”更改为“index.app”。

什么“根本不起作用”确切地说是什么意思?“运行测试”从不输出-因此,虽然我认为我已经定义了测试,但我不确定运行它需要做什么。我敢肯定,当我试图让它运行时,我会出错,但只是让它运行将是一个很好的第一步:)根据此编辑代码示例-谢谢。不幸的是,问题(很多问题中的第一个问题)是我的测试模块没有实际运行(其中的测试打印从未触发)。对于新手来说,测试的世界是如此的不透明,我感到惊讶(也许是愚蠢)。该应用程序运行良好,但到目前为止,测试比实际功能更难!一开始常常很难。不要绝望,不要咬得过多。小步骤,直到你熟悉了新技术,然后它将是一件轻而易举的事。您的代码没有显示如何/在何处调用
test\u hello()
方法。谢谢!我会继续努力:)