我在我的 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 test
、python 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/