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

2024-02-07

当我尝试为由多个模块组成的 Google App Engine 应用程序编写一些 Python 单元测试时,我一直在努力解决一些错误。

我一直遵循以下指导https://cloud.google.com/appengine/docs/python/tools/localunittesting https://cloud.google.com/appengine/docs/python/tools/localunittesting

首先我得到以下信息:

ERROR:root:AssertionError('未找到服务“模块”的 api 代理',)

但我确定这是因为我没有正确初始化 Testbed,需要单独调用:

self.testbed.init_modules_stub()

尽管已经调用了:

self.testbed.init_all_stubs()

这对我来说似乎很奇怪,但这不是主要问题......现在我已经克服了这个错误,相反我得到了:

错误:根: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() 呢?

或者我是否未能以某种方式初始化测试台以确保模块的版本有效?

EDIT:我继续研究这个问题,并通过 Google App Engine 代码追踪到该类_LocalFakeDispatcher in request_info.py。该类设置了一些用于测试的默认值。问题是,我的测试到达这里试图确定模块是否有效,但它与此存根中的默认值之一不匹配,因此最终返回无效模块错误。

有什么方法可以覆盖此调度程序中的默认值,以将其设置为填充预期的模块名称和版本?

See:

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 --版本 Google Cloud SDK 0.9.44

应用程序 2015.01.15 应用程序引擎-go-darwin-x86_64 1.9.17 应用程序引擎java 1.9.17 应用程序引擎管理的虚拟机 2014.11.03 应用程序引擎-python 1.9.17 ETC。


需要打电话的问题init_modules_stub与 SDK 的版本有关(因此与testbed/__init__.py) 你有;已添加到init_all_stubs在当前版本中(不确定具体时间),因此升级应该可以让您消除对显式调用的需要。但正如你所说,这不是主要问题。

但关于更实质性的问题——在我看来,你没有做错任何事,因为没有文档说你应该做任何特别的事情来初始化模块的存根。

幸运的是,没有解决方法too糟糕的。具体来说,您可以在单元测试代码的早期进行初始化:

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)

当然假设这些是您想要的模块名称和版本!

是的,应该确实更容易(测试平台或some模块应该公开一个执行此操作的函数 - 理想情况下通过解析适当的yaml文件,但至少有明确的参数)and,非常重要的是,应该有很好的记录。

五年前,我是测试平台第一个版本前身的第一作者,我个人为没有关注它而道歉(抱歉——我was同时忙于不同的工作! ——但是,作为单元测试的狂热分子,我应该在这方面花费大约 20% 的时间)。

请提出一个关于很好地公开这一点并记录它的功能请求,并且thanks感谢您的耐心和出色的“侦探工作”,找出了问题的症结所在!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Testbed 对 Google App Engine 进行单元测试时出现 InvalidModuleError() 的相关文章

  • 通过 Python 与 Windows 控制台应用程序交互

    我在 Windows 上使用 python 2 5 我希望通过 Popen 与控制台进程交互 我目前有一小段代码 p Popen console app exe stdin PIPE stdout PIPE issue command 1
  • 如何测试顶级窗口是否打开?

    我感觉 Python 编程可能不是我的菜 我创建了一个 tkinter GUI 它使用按钮回调来打开另一个窗口 其他搜索说这个窗口应该是顶级窗口 并且它工作得很好 但是每次按下按钮时它都会打开另一个相同的窗口 如据我所知 窗口 问题 如何测
  • 使用 Marshmallow 中的数据更新行 (SQLAlchemy)

    我正在使用 Flask Flask SQLAlchemy Flask Marshmallow marshmallow sqlalchemy 尝试实现 REST api PUT 方法 我还没有找到任何使用 SQLA 和 Marshmallow
  • 使用 Flask SQLAlchemy 进行表(模型)继承

    我遵循了这个建议question https stackoverflow com questions 1337095 sqlalchemy inheritance但我仍然收到此错误 sqlalchemy exc NoForeignKeysE
  • 使用 GeoDjango 在坐标系之间进行转换

    我正在尝试将坐标信息添加到我的数据库中 添加django contrib gis支持我的应用程序 我正在写一个south数据迁移 从数据库中获取地址 并向 Google 询问坐标 到目前为止 我认为我最好的选择是使用geopy为了这 接下来
  • 同情因子简单关系

    我在 sympy 中有一个简单的因式分解问题 无法解决 我在 sympy 处理相当复杂的积分方面取得了巨大成功 但我对一些简单的事情感到困惑 如何得到 phi 2 2 phi phi 0 phi 0 2 8 因式分解 phi phi 0 2
  • 运行源代码中包含 Unicode 字符的 Python 2.7 代码

    我想运行一个在源代码中包含 unicode utf 8 字符的 Python 源文件 我知道这可以通过添加评论来完成 coding utf 8 在一开始的时候 但是 我希望不使用这种方法来做到这一点 我能想到的一种方法是以转义形式编写 un
  • 在一张图中同时绘制两个截面强度

    我有一个形状数组 512 512 看起来像 行 x 列 y 密度 z 数组的数量 0 012825 0 020408 0 022976 0 015938 0 02165 0 024357 0 036332 0 031904 0 025462
  • 01 无效令牌[重复]

    这个问题在这里已经有答案了 嘿 学习 python3有一段时间了 遇到字典和dictionary name get 方法并尝试获取随机键值 问题 data data get key 1 它有效并且返回 1 但如果我使用data get ke
  • Python 中的二进制相移键控

    我目前正在编写一些代码 以使用音频转换通过激光传输消息 文件 和其他数据 我当前的代码使用 python 中 binascii 模块中的 hexlify 函数将数据转换为二进制 然后为 1 发出一个音调 为 0 发出不同的音调 这在理论上是
  • Python 3.x 中的 PIL ImageTk 等效项

    我正在使用 Tkinter 开发一个应用程序 它使用以下数据库png图标的图像文件 为了在应用程序中使用所述图像 我使用 PIL 打开它们Image open 运行它通过ImageTk PhotoImage函数 然后将其传递给小部件构造函数
  • Python3模拟用另一个函数替换函数

    如何使用 python 中的另一个函数来模拟一个函数 该函数也将提供一个模拟对象 我有类似以下操作的代码 def foo arg1 arg2 r bar arg1 does interesting things 我想替换的实现bar函数 让
  • Python NLP 英式英语与美式英语

    我目前正在用Python 进行NLP 工作 然而 在我的语料库中 既有英式英语也有美式英语 实现 实现 我正在考虑将英式英语转换为美式英语 但是 我没有找到一个好的工具 包来做到这一点 有什么建议么 我也找不到包 但试试这个 请注意 我必须
  • 出现意外的关键字参数“timeout”(Python 中的 google-cloud-storage)

    使用 google cloud storage 的 Python 项目在本地运行良好 但是当它从 App Engine 运行时 会显示错误 Traceback most recent call last File opt python3 7
  • 如何在 Numpy 中实现垃圾收集

    我有一个名为main py 它引用另一个文件Optimisers py它仅具有功能并用于for循环进入main py 这些函数都有不同的优化功能 This Optimisers py然后引用另外两个类似的文件 其中也只有函数 它们位于whi
  • 将 ASCII 字符转换为“”unicode 表示法的脚本

    我正在对 Linux 区域设置文件进行一些更改 usr share i18n locales like pt BR 并且需要格式化字符串 例如 d m Y H M 必须以 Unicode 指定 其中每个 在本例中为 ASCII 字符表示为
  • 通过套接字发送字符串(python)

    我有两个脚本 Server py 和 Client py 我心中有两个目标 能够从客户端一次又一次地向服务器发送数据 能够将数据从服务器发送到客户端 这是我的 Server py import socket serversocket soc
  • Pandas - 分割大的Excel文件

    我有一个大约有 500 000 行的 Excel 文件 我想将其拆分为多个 Excel 文件 每个文件有 50 000 行 我想用熊猫来做 这样它会是最快和最简单的 有什么想法如何制作吗 感谢您的帮助 假设您的 Excel 文件只有一个 第
  • tweepy 流到 sqlite 数据库 - 语法错误[重复]

    这个问题在这里已经有答案了 可能的重复 tweepy 流到 sqlite 数据库 语法无效 https stackoverflow com questions 9434205 tweepy stream to sqlite database
  • 升级后 pip 损坏

    我做了 pip install U easyinstall 然后 pip install U pip 来升级我的 pip 但是 当我尝试使用 pip 时 我现在收到此错误 root d8fb98fc3a66 which pip usr lo

随机推荐