Google App Engine + Python WebApp2 的本地单元测试
Local unit testing for Google App Engine + Python WebApp2
我有一个非常简单的网络应用程序。所有重要的事情都发生在 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)
我正在努力成为一个好人并编写一些本地单元测试,但是 - 在查看 documentation 之后 - 我完全无法理解。我想要的只是一个基本框架,我可以在其中执行以下操作:
python test_security.py
并模拟两个访问域的用户 - 一个应该获取索引模板的@foo.com,另一个应该获取 403 模板的@bar.com。
这是我到目前为止的进展:
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.setup_env()
调用 self.testbed.setup_env()
之前调用 self.testbed.init_user_stub()
,而不是在调用
之后。
此外,您似乎还缺少初始 self.testbed = testbed.Testbed()
和可能的 testbed.activate()
调用。
您可能想看看这个答案:
如果您打算用 "python test_security.py" 调用它,您正在寻找的魔术词是:
if __name__ == '__main__':
unittest.main()
这将使您的单元测试 运行 - 目前您所做的只是定义它。
另请注意,您需要将 request.get_response 从 "main.app" 更改为 "index.app"。
我有一个非常简单的网络应用程序。所有重要的事情都发生在 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)
我正在努力成为一个好人并编写一些本地单元测试,但是 - 在查看 documentation 之后 - 我完全无法理解。我想要的只是一个基本框架,我可以在其中执行以下操作:
python test_security.py
并模拟两个访问域的用户 - 一个应该获取索引模板的@foo.com,另一个应该获取 403 模板的@bar.com。
这是我到目前为止的进展:
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.setup_env()
调用 self.testbed.setup_env()
之前调用 self.testbed.init_user_stub()
,而不是在调用
此外,您似乎还缺少初始 self.testbed = testbed.Testbed()
和可能的 testbed.activate()
调用。
您可能想看看这个答案:
如果您打算用 "python test_security.py" 调用它,您正在寻找的魔术词是:
if __name__ == '__main__':
unittest.main()
这将使您的单元测试 运行 - 目前您所做的只是定义它。
另请注意,您需要将 request.get_response 从 "main.app" 更改为 "index.app"。