为 google 云端点编写测试用例 API 编写在 django 之上
Writing Testcases for google cloud endpoints API written on top of django
我在我的 Django 应用程序上使用 google 云端点来提供 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
。它甚至无法测试单个测试用例。在 运行ning python manage.py test
之后显示的输出是,
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Destroying test database for alias 'default'...
所以它未能 运行 我的第一个测试用例。请给些建议。
编辑:
将文件名更改为testpoilist
找到测试用例,但无法导入appengine 相关模块。并导致许多 import
错误。所以我尝试了 运行ning 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:
我还尝试了 运行ning django test using python manage.py test
。但它显示,
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
.
我已通过将项目的 lib
文件夹附加到系统路径变量来解决此问题。
所以您的 manage.py
文件的一部分应该类似于
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
sys.path.append(sys.path[0] + os.path.sep + 'lib')
然后运行通过django测试。不要做 nosetest
.
python manage.py test
请注意,您的测试文件的名称应以 test
开头,以便 django 将其视为测试文件。我的一个测试文件看起来像,
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')
我在我的 Django 应用程序上使用 google 云端点来提供 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
。它甚至无法测试单个测试用例。在 运行ning python manage.py test
之后显示的输出是,
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Destroying test database for alias 'default'...
所以它未能 运行 我的第一个测试用例。请给些建议。
编辑:
将文件名更改为testpoilist
找到测试用例,但无法导入appengine 相关模块。并导致许多 import
错误。所以我尝试了 运行ning 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:
我还尝试了 运行ning django test using python manage.py test
。但它显示,
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
.
我已通过将项目的 lib
文件夹附加到系统路径变量来解决此问题。
所以您的 manage.py
文件的一部分应该类似于
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
sys.path.append(sys.path[0] + os.path.sep + 'lib')
然后运行通过django测试。不要做 nosetest
.
python manage.py test
请注意,您的测试文件的名称应以 test
开头,以便 django 将其视为测试文件。我的一个测试文件看起来像,
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')