使用假登录用户测试 GAE 处理程序
Testing a GAE handler with a fake logged in user
我在 GAE 上有一个工作站点,为了保持这种状态,我正在尝试添加一些单元测试。
我想要的第一件事是进行基本冒烟测试,以确认经过身份验证的用户可以加载主页。这是我的尝试:
import webtest
import unittest
from google.appengine.api import users
from google.appengine.datastore import datastore_stub_util
from google.appengine.ext import ndb
from google.appengine.ext import testbed
# Handler under test
import main
from common import User
class MainTestCase(unittest.TestCase):
def setUp(self):
self.testbed = testbed.Testbed()
self.testbed.activate()
self.testbed.init_user_stub()
self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(
probability=0)
self.testbed.init_datastore_v3_stub(consistency_policy=self.policy)
self.testbed.init_memcache_stub()
ndb.get_context().clear_cache()
def tearDown(self):
self.testbed.deactivate()
def loginUser(self, email='user@example.com', id='123', is_admin=False):
self.testbed.setup_env(
user_email=email, user_id=id,
user_is_admin='1' if is_admin else '0',
overwrite=True)
def testMainHandler(self):
User(user_email='user@testing.com', is_admin = False).put()
self.loginUser(email='user@testing.com')
self.testapp = webtest.TestApp(main.app)
response = self.testapp.get('/')
self.assertEqual(response.status_int, 200)
当我 运行 这个测试时,我得到一个 403 而不是 200 和(稍微挖掘一下)记录的错误 "user@testing.com is not registered"。 main.py 的相关位在这里:
try:
active_email = users.get_current_user().email()
user_acl = User.query(User.user_email == active_email).fetch(1)[0]
security['user_exists'] = True
except IndexError:
security['user_exists'] = False
return security
我怀疑我设置的用户是正确的(如记录的错误所证明)但是当 main.py 运行 是 User.query 时,它击中了 "real"(测试期间为空)数据存储,而不是我插入测试用户的假测试平台版本。
这听起来对吗?关于如何更好地做到这一点的任何提示?
您的查询 User.query(User.user_email == active_email).fetch(1)
是最终一致的,因此 put() 的结果可能不会立即显示。更复杂的是,您有 self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(
probability=0)
导致数据存储模拟器非常不一致。您可能需要考虑将查询更改为高度一致或在 Datastore 模式下尝试 Cloud Firestore。
对于您的测试,您可以设置 probability=1.0 来查看问题是否为最终一致性查询。
我在 GAE 上有一个工作站点,为了保持这种状态,我正在尝试添加一些单元测试。
我想要的第一件事是进行基本冒烟测试,以确认经过身份验证的用户可以加载主页。这是我的尝试:
import webtest
import unittest
from google.appengine.api import users
from google.appengine.datastore import datastore_stub_util
from google.appengine.ext import ndb
from google.appengine.ext import testbed
# Handler under test
import main
from common import User
class MainTestCase(unittest.TestCase):
def setUp(self):
self.testbed = testbed.Testbed()
self.testbed.activate()
self.testbed.init_user_stub()
self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(
probability=0)
self.testbed.init_datastore_v3_stub(consistency_policy=self.policy)
self.testbed.init_memcache_stub()
ndb.get_context().clear_cache()
def tearDown(self):
self.testbed.deactivate()
def loginUser(self, email='user@example.com', id='123', is_admin=False):
self.testbed.setup_env(
user_email=email, user_id=id,
user_is_admin='1' if is_admin else '0',
overwrite=True)
def testMainHandler(self):
User(user_email='user@testing.com', is_admin = False).put()
self.loginUser(email='user@testing.com')
self.testapp = webtest.TestApp(main.app)
response = self.testapp.get('/')
self.assertEqual(response.status_int, 200)
当我 运行 这个测试时,我得到一个 403 而不是 200 和(稍微挖掘一下)记录的错误 "user@testing.com is not registered"。 main.py 的相关位在这里:
try:
active_email = users.get_current_user().email()
user_acl = User.query(User.user_email == active_email).fetch(1)[0]
security['user_exists'] = True
except IndexError:
security['user_exists'] = False
return security
我怀疑我设置的用户是正确的(如记录的错误所证明)但是当 main.py 运行 是 User.query 时,它击中了 "real"(测试期间为空)数据存储,而不是我插入测试用户的假测试平台版本。
这听起来对吗?关于如何更好地做到这一点的任何提示?
您的查询 User.query(User.user_email == active_email).fetch(1)
是最终一致的,因此 put() 的结果可能不会立即显示。更复杂的是,您有 self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(
probability=0)
导致数据存储模拟器非常不一致。您可能需要考虑将查询更改为高度一致或在 Datastore 模式下尝试 Cloud Firestore。
对于您的测试,您可以设置 probability=1.0 来查看问题是否为最终一致性查询。