2016-03-04 72 views
2

我在我的django应用上使用Google云端点来提供RESTful服务。所有的API服务都运行良好。现在是编写测试用例的时候了。所以我写了这个。编写Google云端点的测试用例写在django之上的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='[email protected]' 
                 ) 

     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:

我也尝试过使用运行Django的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路径。

+0

您是否有单独的测试设置文件?而且,这个文件有这些测试的名称是什么? – AKS

+0

不,只有一个settings.py文件。 –

+0

Django默认使用'DiscoverRunner'来运行测试套件,它遵循'test * .py'模式来获取包含单元测试的文件。你可以相应地更改文件名并再次测试吗? – AKS

回答

1

我已经设法通过将项目的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') 
3

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

+0

现在我得到了不同的traceback.pls检查我的更新。 –

+0

这与我的猜测有关。我的帖子中没有看到任何会触发它的代码。 –

+0

我很接近,检查我的更新。 –