python - 为在 Django 之上编写的谷歌云端点 API 编写测试用例

标签 python django google-app-engine google-cloud-endpoints

我在我的 Django 应用程序上使用谷歌云端点来提供 RESTful 服务。所有 API 服务都运行良好。现在,是时候编写测试用例了。所以我写了这个。

TestPOIList.py

import unittest
from django.test import TestCase
import endpoints
import webtest
from google.appengine.ext import testbed
from .queries import CategoryQuery
from .queries import PointOfInterestQuery
from .models import PointOfInterest
from .api.internal.point_of_interest import PointOfInterests


class Test(TestCase):

    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.setup_env(current_version_id='testbed.version')
        self.testbed.activate()
        self.testbed.init_all_stubs()

        self.category_a = CategoryQuery.create_category_by_name('Museums')
        self.poi = PointOfInterestQuery.create_new_poi(name='bhavan', category=self.category_a,
                                                       place='hdgf', phone='3454545', email='dsg@jhgs.com'
                                                       )

        app = endpoints.api_server([PointOfInterests], restricted=False)
        self.testapp = webtest.TestApp(app)

    def tearDown(self):
        self.testbed.deactivate()

    # Test the handler.
    def test_should_return_list_of_pois(self):
        msg = {}
        resp = self.testapp.post_json('/_ah/spi/PointOfInterests.get_list', msg, status='*')
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(resp.json['pois']['name'], 'Saravan bhavan')

我尝试使用 python manage.py testpython manage.py test appname 运行上面的代码。但它不会起作用。

我也试过django-nose .它甚至无法测试单个测试用例。运行 python manage.py test 后显示的输出是,

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK
Destroying test database for alias 'default'...

所以它无法运行我的第一个测试用例。请给出一些建议。

编辑:

将文件名更改为testpoilist 可以找到测试用例,但无法导入appengine 相关模块。并导致许多 import 错误。所以我尝试运行 nosetests 但它显示,

$ nosetests -q -w src/ --with-gae
Traceback (most recent call last):
  File "/home/gemini/.virtualenvs/sample/bin/nosetests", line 11, in <module>
    sys.exit(run_exit())
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/core.py", line 121, in __init__
    **extra_args)
  File "/usr/lib/python2.7/unittest/main.py", line 94, in __init__
    self.parseArgs(argv)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/core.py", line 145, in parseArgs
    self.config.configure(argv, doc=self.usage())
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/config.py", line 346, in configure
    self.plugins.configure(options, self)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/plugins/manager.py", line 284, in configure
    cfg(options, config)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/plugins/manager.py", line 99, in __call__
    return self.call(*arg, **kw)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/plugins/manager.py", line 167, in simple
    result = meth(*arg, **kw)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nosegae.py", line 85, in configure
    import appengine_config
  File "/home/gemini/projects/sample-backend/src/appengine_config.py", line 22, in <module>
    vendor.add('lib')
  File "/home/gemini/softwares/google_appengine/google/appengine/ext/vendor/__init__.py", line 44, in add
    'No such virtualenv or site directory' % path)
ValueError: virtualenv: cannot access lib: No such virtualenv or site directory

编辑 2:vendor.add('lib') 更改为以下答案中指定的内容后,出现此错误。

$ nosetests -q -w src/ --with-gae
Traceback (most recent call last):
  File "/home/gemini/.virtualenvs/sample/bin/nosetests", line 11, in <module>
    sys.exit(run_exit())
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/core.py", line 121, in __init__
    **extra_args)
  File "/usr/lib/python2.7/unittest/main.py", line 95, in __init__
    self.runTests()
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/core.py", line 207, in runTests
    result = self.testRunner.run(self.test)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/core.py", line 62, in run
    test(result)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/suite.py", line 177, in __call__
    return self.run(*arg, **kw)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/suite.py", line 224, in run
    test(orig)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/suite.py", line 177, in __call__
    return self.run(*arg, **kw)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/suite.py", line 224, in run
    test(orig)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/suite.py", line 177, in __call__
    return self.run(*arg, **kw)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/suite.py", line 217, in run
    for test in self._tests:
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/suite.py", line 372, in _get_wrapped_tests
    for test in self._get_tests():
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/suite.py", line 99, in _get_tests
    for test in self.test_generator:
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/loader.py", line 191, in loadTestsFromDir
    entry_path, discovered=True)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/loader.py", line 433, in loadTestsFromName
    discovered=discovered)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/loader.py", line 354, in loadTestsFromModule
    tests.extend(self.loadTestsFromDir(module_path))
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/loader.py", line 191, in loadTestsFromDir
    entry_path, discovered=True)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/loader.py", line 433, in loadTestsFromName
    discovered=discovered)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/loader.py", line 354, in loadTestsFromModule
    tests.extend(self.loadTestsFromDir(module_path))
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/loader.py", line 183, in loadTestsFromDir
    entry_path, discovered=True)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/loader.py", line 427, in loadTestsFromName
    address=addr.totuple())])
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/suite.py", line 427, in __call__
    return self.makeSuite(tests, context, **kw)
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/suite.py", line 482, in makeSuite
    for ancestor in self.ancestry(context):
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/suite.py", line 453, in ancestry
    yield resolve_name('.'.join(ancestors))
  File "/home/gemini/.virtualenvs/sample/local/lib/python2.7/site-packages/nose/util.py", line 322, in resolve_name
    obj = getattr(obj, part)
AttributeError: 'module' object has no attribute 'failure'

编辑 3:

我还尝试使用 python manage.py test 运行 django 测试。但它表明,

ERROR: src.tests.api.internal.test_poi_list (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
ImportError: Failed to import test module: src.tests.api.internal.test_poi_list
Traceback (most recent call last):
  File "/usr/lib/python2.7/unittest/loader.py", line 254, in _find_tests
    module = self._get_module_from_name(name)
  File "/usr/lib/python2.7/unittest/loader.py", line 232, in _get_module_from_name
    __import__(name)
  File "/home/gemini/projects/backend/src/tests/api/internal/test_poi_list.py", line 9, in <module>
    from guide.api.internal.point_of_interest import PointOfInterests
  File "/home/gemini/projects/backend/src/cityguide/api/internal/point_of_interest.py", line 12, in <module>
    from guide.api.common import GuideInternalAPI
  File "/home/gemini/projects/backend/src/guide/api/common.py", line 9, in <module>
    GuideInternalAPI = endpoints.api(name='GuideInternalAPI',
AttributeError: 'module' object has no attribute 'api'


----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)

看来我快接近那个了。 PYTHONPATH 变量显示 google_appengine sdk 路径。

最佳答案

appengine_config.py 中将 vendor.add('lib') 更改为 vendor.add(os.path.join(os.path.dirname( os.path.realpath(__file__)), 'lib')).执行测试的路径与 lib 无关,因此您会看到该错误。不要忘记导入 os

关于python - 为在 Django 之上编写的谷歌云端点 API 编写测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35797569/

相关文章:

google-app-engine - 字符串包含对 Cloud Datastore 列的操作

java - Siena/Play/GAE 解析 boolean 字段错误 : 0 = true

python - 使用 openweathermap api 解析字典(json)中的数据

python - 创建一列并随机赋值

django - django 中的 "output_field"是什么

Java + Spring + Hibernate : "order by" slow on production

python - 这个梯度下降算法有什么问题呢?

python - 在 python 类上覆盖 __dict__()

django 表单 - 从 clean() 引发特定的字段验证错误

python - celery 任务中缺少 Django 相关对象(竞争条件?)