GAE Python Unittest Runner

问题描述 投票:1回答:1

我有一个在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

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

python unit-testing google-app-engine python-unittest
1个回答
0
投票

首先,与python2相关的任何事情都将寿终正寝。尝试升级到python3。您的脚本似乎与python3兼容,但是底层软件包可能不兼容。

该错误表示您已安装的六个软件包不包含parse_http_list。尝试升级六个软件包:

pip install six==1.14.0

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

© www.soinside.com 2019 - 2024. All rights reserved.