首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在django之上为google云端点API编写测试用例

在django之上为google云端点API编写测试用例
EN

Stack Overflow用户
提问于 2016-03-04 13:41:11
回答 2查看 340关注 0票数 3

我在我的django应用程序上使用来提供RESTful服务。所有的API服务都运行得很好。现在是写测试用例的时候了。所以我写了这个。

TestPOIList.py

代码语言:javascript
复制
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后显示的输出是,

代码语言:javascript
复制
----------------------------------------------------------------------
Ran 0 tests in 0.000s

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

所以它没能运行我的第一个测试案例。请给我一些建议。

编辑:

将文件名更改为testpoilist可以找到测试用例,但它无法导入与应用程序引擎相关的模块。并导致了许多import错误。所以我试着运行nosetests,但是它显示,

代码语言:javascript
复制
$ 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')更改为下面的答案中指定的内容后,我得到了这个错误。

代码语言:javascript
复制
$ 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测试。但这表明,

代码语言:javascript
复制
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路径。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-14 04:39:29

通过将项目的lib文件夹附加到系统路径变量中,我设法解决了这个问题。

所以manage.py文件的一部分应该是,

代码语言:javascript
复制
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
    sys.path.append(sys.path[0] + os.path.sep + 'lib')

然后通过django运行测试。不要做nosetest

代码语言:javascript
复制
python manage.py test

注意,您的测试文件应该有一个以test开头的名称,这样django就会把它当作一个测试文件。我的一个测试文件看起来像,

代码语言:javascript
复制
import unittest
from django.test import TestCase
import endpoints
import webtest
from google.appengine.ext import testbed
from project.queries import CategoryQuery
from project.api.internal.categories import Categories


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')

        app = endpoints.api_server([Categories], 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/Categories.get_list', msg, status='*')
        self.assertEqual(resp.status_code, 200)
        self.assertEqual(resp.json['categories'][0]['name'], 'Museums')
票数 1
EN

Stack Overflow用户

发布于 2016-03-07 18:58:01

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35797569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档