使用Testbed对Google App Engine进行单元测试时,InvalidModuleError()

理查德·科菲尔德

尝试为包含多个模块的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()?

还是我无法以某种方式初始化测试平台以确保模块的版本有效?

编辑:我继续工作,在此,并通过谷歌应用程序引擎代码的类已经查明_LocalFakeDispatcherrequest_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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何对Google App Engine Go HTTP处理程序进行单元测试?

您在App Engine上使用了哪种方法进行轻量级Python单元测试?

使用 firebase-server 进行单元测试时,this.app.database 不是函数

使用Gorilla MUX的单元测试App Engine

用Java进行单元测试App Engine图像上传

单元测试时是否应该使用Angular TestBed?

Google App Engine的gradle单元测试在哪里需要persistence.xml?

如何为Google App Engine单元测试设置已经一致的数据?

Google App Engine + Python WebApp2的本地单元测试

如何为使用Go中的App Engine服务的代码运行单元测试?

对EmberJS App进行单元测试(实际单元测试)

如何使用JEST在React App中对功能进行单元测试

使用JMeter进行负载测试时,Google App Engine Flexible中的502服务器错误

根据测试执行顺序,使用TestBed.inject进行角单元测试成功/失败

使用 RxJava 时对 LiveData 进行本地单元测试

使用 jasmine 进行单元测试时模拟全局对象

使用Spock进行Java单元测试时发生异常

使用Jasmine进行单元测试时避免副作用

在App Engine Java JDO中对XG跨组事务进行单元测试

App Engine单元测试:ImportError:起始目录不可导入

如何在pycharm中运行App Engine单元测试?

App Engine本地单元测试不同的实例[GO]

如何在使用 Mock 对 Google Cloud Functions 进行单元测试时处理 abort()

使用JUnit,Spring 4和Vaadin对单元进行单元测试时获得NPE

对使用RTOS的项目进行单元测试

使用Mockito进行Runnable的单元测试

使用 MockEndPointsandSkip 进行 Camel 单元测试

使用GitLab CI进行单元测试

使用StaticLoggerBinder对类进行单元测试