尝试为包含多个模块的Google App Engine应用编写一些Python单元测试时,我一直在尝试一些错误。
我一直在遵循https://cloud.google.com/appengine/docs/python/tools/localunittesting上给出的指导
首先,我得到以下信息:
ERROR:root:AssertionError('未找到服务“模块”的api代理”,)
但是,我确定这是因为我没有正确初始化Testbed,并且需要单独调用以下内容:
self.testbed.init_modules_stub()
尽管已经调用:
self.testbed.init_all_stubs()
这对我来说似乎很奇怪,但不是主要问题...现在,我已经越过了这个错误,相反,我得到:
错误:root:InvalidModuleError()
该代码非常简单。这是测试用例的相关部分:
def setUp(self):
self.testbed = testbed.Testbed()
self.testbed.activate()
self.testbed.init_all_stubs
self.testbed.init_modules_stub()
def test_should_submit_a_task(self):
post_content = '{ "bucket": "/test/", "filename", "test", "operation": "read" }'
request = webapp2.Request.blank('/path/to/module/method', POST=post_content)
response = request.get_response(main.application)
self.assertEquals(response.status_int, 200)
来自测试代码的错误所在的行如下:
host = get_hostname(queue)
我可以看到已使用模块名称正确初始化了“队列”。
get_hostname()中google_appengine中的评论状态:
“如果给定的模块版本无效,则引发:InvalidModuleError。”
因此由于某种原因,我的模块版本无效。
因此,在测试代码时是否有必要手动将模块版本传递给get_hostname()?
还是我无法以某种方式初始化测试平台以确保模块的版本有效?
编辑:我继续工作,在此,并通过谷歌应用程序引擎代码的类已经查明_LocalFakeDispatcher
在request_info.py
。该类设置了一些默认值以用于测试。问题是,我的测试到达此处试图确定模块是否有效,但是与该存根中的默认值之一不匹配,因此最终返回无效模块错误。
有什么方法可以覆盖此调度程序中的默认值,以将其设置为预期的模块名称和版本?
看到:
class _LocalFakeDispatcher(Dispatcher):
"""A fake Dispatcher implementation usable by tests."""
def __init__(self,
module_names=None,
module_name_to_versions=None,
module_name_to_default_versions=None,
module_name_to_version_to_hostname=None):
super(_LocalFakeDispatcher, self).__init__()
if module_names is None:
module_names = ['default']
if module_name_to_versions is None:
module_name_to_versions = {'default': ['1']}
etc. ...
非常感谢
R.
$ gcloud --version Google Cloud SDK 0.9.44
app 2015.01.15 app-engine-go-darwin-x86_64 1.9.17 app-engine-java 1.9.17 app-engine-managed-vms 2014.11.03 app-engine-python 1.9.17等
需要致电的问题与您所拥有init_modules_stub
的SDK版本(以及的版本testbed/__init__.py
)有关;init_all_stubs
在当前版本中已添加(不确定确切的时间),因此升级应使您无需显式调用。但是正如您所说,这不是主要问题。
但是关于一个更实质性的问题-根据我的看法,您没有做错任何事情,因为没有文档说您应该做任何特别的事情来初始化模块的存根。
幸运的是,解决办法是不是太可怕了。具体来说,您可以在单元测试代码的早期阶段进行初始化:
from google.appengine.api import request_info
# edit all_versions per modules & versions thereof needing tests
all_versions = {'default':[1], 'andsome':[2], 'others':[1]}
def_versions = {m:all_versions[m][0] for m in all_versions}
m2h = {m:{def_versions[m]:'localhost:8080'} for m in def_versions}
request_info._local_dispatcher = request_info._LocalFakeDispatcher(
module_names = list(all_versions),
module_name_to_versions = all_versions,
module_name_to_default_versions = def_versions,
module_name_to_version_to_hostname = m2h)
当然,假设这些是您想要的模块名称和版本!
是的,它绝对应该更容易(测试平台或某些模块应该公开执行此操作的功能-理想情况下,通过分析适当的yaml
文件,但至少使用显式参数),并且,很重要的是,它应有据可查。
我是5年前测试平台第一版的第一作者的第一作者,我个人为没有关注它而道歉(对不起-同时,我正忙于非常不同的工作!测试,我应该在此上花费20%的时间)。
请打开一个功能要求,要求对其进行很好的曝光和记录,并感谢您的耐心配合以及出色的“侦查工作”,以找出问题的症结所在!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句