我在我的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
可以找到测试用例,但它无法导入与应用程序引擎相关的模块。并导致了许多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路径。
发布于 2016-03-14 04:39:29
通过将项目的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')
发布于 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
。
https://stackoverflow.com/questions/35797569
复制相似问题