【问题标题】:GAE Python Unittest RunnerGAE Python 单元测试运行器
【发布时间】:2020-02-20 10:43:47
【问题描述】:

我有一个在 Google 的 Cloud Endpoints 框架上运行的 Python API。

我正在尝试使用 dev_appserver 为我的单元测试实现一个运行器。

我已经复制并改编了 Google 提供的有关此功能的内容,只是稍作编辑以使其运行 devappserver 一体机。

这是我到目前为止所做的:

import argparse
import os
import sys
import unittest


def fixup_paths(path):
    """Adds GAE SDK path to system path and appends it to the google path
    if that already exists."""
    try:
        import google
        google.__path__.append("{0}/google".format(path))
    except ImportError:
        pass

    sys.path.insert(0, path)


def main(sdk_path, test_path, test_pattern):
    # If the SDK path points to a Google Cloud SDK installation
    # then we should alter it to point to the GAE platform location.
    if os.path.exists(os.path.join(sdk_path, 'platform/google_appengine')):
        sdk_path = os.path.join(sdk_path, 'platform/google_appengine')

    # Make sure google.appengine.* modules are importable.
    fixup_paths(sdk_path)

    # Make sure all bundled third-party packages are available.
    import dev_appserver
    dev_appserver.fix_sys_path()

    # Fix google shits
    from google.appengine.tools.devappserver2 import devappserver2

    # Start the devappserver
    server_instance = devappserver2.DevelopmentServer()
    server_instance.start()

    # Discover and run tests.
    suite = unittest.loader.TestLoader().discover(test_path, test_pattern)
    suite_result = unittest.TextTestRunner(verbosity=2).run(suite)
    server_instance.stop()
    return suite_result


if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument(
        'sdk_path',
        help='The path to the Google App Engine SDK or the Google Cloud SDK.')
    parser.add_argument(
        '--test-path',
        help='The path to look for tests, defaults to the current directory.',
        default=os.getcwd())
    parser.add_argument(
        '--test-pattern',
        help='The file pattern for test modules, defaults to *_test.py.',
        default='test_*.py')

    args = parser.parse_args()

    result = main(args.sdk_path, args.test_path, args.test_pattern)

    if not result.wasSuccessful():
        sys.exit(1)

但我正在为一个奇怪的导入错误而苦苦挣扎。

我一直在通过 Github 搜索,但我找不到任何东西:

Traceback (most recent call last):
  File "runner.py", line 65, in <module>
    result = main(args.sdk_path, args.test_path, args.test_pattern)
  File "runner.py", line 34, in main
    from google.appengine.tools.devappserver2 import devappserver2
  File "/Users/toto/Libraries/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 27, in <module>
    from google.appengine.tools.devappserver2 import api_server
  File "/Users/toto/Libraries/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/api_server.py", line 79, in <module>
    from google.appengine.tools.devappserver2 import wsgi_server
  File "/Users/toto/Libraries/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/wsgi_server.py", line 48, in <module>
    from cherrypy import wsgiserver
  File "/usr/local/lib/python2.7/site-packages/cherrypy/__init__.py", line 73, in <module>
    from ._cptools import default_toolbox as tools, Tool
  File "/usr/local/lib/python2.7/site-packages/cherrypy/_cptools.py", line 33, in <module>
    from cherrypy.lib import auth_basic, auth_digest
  File "/usr/local/lib/python2.7/site-packages/cherrypy/lib/auth_digest.py", line 27, in <module>
    from six.moves.urllib.request import parse_http_list, parse_keqv_list
ImportError: cannot import name parse_http_list

我不知道如何解决那个导入问题:(

【问题讨论】:

  • 只是猜测:可能某些软件包版本不兼容 - 请确保您使用所需版本的 six 和可能的其他软件包。 parse_http_list 是 Python 3,six 为 Python2 包装了它。
  • 一件看起来很奇怪的事情:您的代码在系统 Python 的 site-packages 目录中找到了 cherrypy,但我原以为它会找到与 App Engine SDK 捆绑在一起的版本。
  • 最后通过明确使用来自 google appengine sdk(运行正确版本)而不是默认 python 环境的包来修复它。谢谢你的回答!

标签: python unit-testing google-app-engine python-unittest


【解决方案1】:

错误的意思是你安装的包六不包含parse_http_list。尝试升级六包:

pip install six==1.14.0

可能是父包随后抛出错误,然后也升级该包。

【讨论】:

  • Google App Engine 的旧标准平台仅支持 Python2,因此升级不一定是一个简单的解决方案。
  • 然后尝试升级六包,看看是否有任何错误出现。对结果感到好奇。
  • 最后通过明确使用来自 google appengine sdk(运行正确版本)而不是默认 python 环境的包来修复它。谢谢你的回答!
  • 祝您进一步发展顺利!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
相关资源
最近更新 更多