python - How am I getting 'InternalError: table "dev~guestbook!!Entities" already exists' when I just created datastore? -
i'm trying figure out how setup test driven development gae.
i start tests with:
nosetests -v --with-gae i keep getting error:
internalerror: table "dev~guestbook!!entities" exists the datastore doesn't exist until create in setup(), i'm still getting error entities exists?
i'm using code gae tutorial.
here testing code in functional_tests.py:
import sys, os, subprocess, time, unittest, shlex sys.path.append("/usr/local/google_appengine") sys.path.append("/usr/local/google_appengine/lib/yaml/lib") sys.path.append("/usr/local/google_appengine/lib/webapp2-2.5.2") sys.path.append("/usr/local/google_appengine/lib/django-1.5") sys.path.append("/usr/local/google_appengine/lib/cherrypy") sys.path.append("/usr/local/google_appengine/lib/concurrent") sys.path.append("/usr/local/google_appengine/lib/docker") sys.path.append("/usr/local/google_appengine/lib/requests") sys.path.append("/usr/local/google_appengine/lib/websocket") sys.path.append("/usr/local/google_appengine/lib/fancy_urllib") sys.path.append("/usr/local/google_appengine/lib/antlr3") selenium import webdriver google.appengine.api import memcache, apiproxy_stub, apiproxy_stub_map google.appengine.ext import db google.appengine.ext import testbed google.appengine.datastore import datastore_stub_util google.appengine.tools.devappserver2 import devappserver2 class newvisitortest(unittest.testcase): def setup(self): # start dev server cmd = "/usr/local/bin/dev_appserver.py /users/bryan/work/googleappengine/guestbook/app.yaml --port 8080 --storage_path /tmp/datastore --clear_datastore --skip_sdk_update_check" self.dev_appserver = subprocess.popen(shlex.split(cmd), stdout=subprocess.pipe) time.sleep(2) # important, let dev_appserver start self.testbed = testbed.testbed() self.testbed.setup_env(app_id='dermal') self.testbed.activate() self.testbed.init_user_stub() # create consistency policy simulate high replication consistency model. # probability of 1, datastore should available. self.policy = datastore_stub_util.pseudorandomhrconsistencypolicy(probability=1) # initialize datastore stub policy. self.testbed.init_datastore_v3_stub(datastore_file="/tmp/datastore/datastore.db", use_sqlite=true, consistency_policy=self.policy) self.testbed.init_memcache_stub() self.datastore_stub = apiproxy_stub_map.apiproxy.getstub('datastore_v3') # setup dev_appserver app_configs = ['app.yaml'] # setup client make sure guestbook import author, greeting if not ( author.query( author.email == "bryan@mail.com").get()): logging.info("create admin") client = author( email = "bryan@mail.com", ).put() assert( author.query( author.email == "bryan@mail.com").get() ) self.browser = webdriver.firefox() self.browser.implicitly_wait(3) def teardown(self): self.browser.quit() self.testbed.deactivate() self.dev_appserver.terminate() def test_submit_anon_greeting(self): self.browser.get('http://localhost:8080') self.browser.find_element_by_name('content').send_keys('anonymous test post') self.browser.find_element_by_name('submit').submit() assert.assertequals(driver.getpagesource().contains('anonymous test post')) here traceback:
test_submit_anon_greeting (functional_tests.newvisitortest) ... info 2015-05-11 14:41:40,516 devappserver2.py:745] skipping sdk update check. info 2015-05-11 14:41:40,594 api_server.py:190] starting api server at: http://localhost:59656 info 2015-05-11 14:41:40,598 dispatcher.py:192] starting module "default" running at: http://localhost:8080 info 2015-05-11 14:41:40,600 admin_server.py:118] starting admin server at: http://localhost:8000 warning 2015-05-11 14:41:45,008 tasklets.py:409] suspended generator _run_to_list(query.py:964) raised internalerror(table "dev~guestbook!!entities" exists) error 2015-05-11 14:41:45,009 webapp2.py:1552] table "dev~guestbook!!entities" exists traceback (most recent call last): file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1535, in __call__ rv = self.handle_exception(request, response, e) file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1529, in __call__ rv = self.router.dispatch(request, response) file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher return route.handler_adapter(request, response) file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1102, in __call__ return handler.dispatch() file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 572, in dispatch return self.handle_exception(e, self.app.debug) file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 570, in dispatch return method(*args, **kwargs) file "/users/bryan/work/googleappengine/guestbook/guestbook.py", line 50, in greetings = greetings_query.fetch(10) file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/google/appengine/ext/ndb/utils.py", line 142, in positional_wrapper return wrapped(*args, **kwds) file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/google/appengine/ext/ndb/query.py", line 1187, in fetch return self.fetch_async(limit, **q_options).get_result() file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/google/appengine/ext/ndb/tasklets.py", line 325, in get_result self.check_success() file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/google/appengine/ext/ndb/tasklets.py", line 368, in _help_tasklet_along value = gen.throw(exc.__class__, exc, tb) file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/google/appengine/ext/ndb/query.py", line 964, in _run_to_list batch = yield rpc file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/google/appengine/ext/ndb/tasklets.py", line 454, in _on_rpc_completion result = rpc.get_result() file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result return self.__get_result_hook(self) file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/google/appengine/datastore/datastore_query.py", line 2870, in __query_result_hook self._batch_shared.conn.check_rpc_success(rpc) file "/users/bryan/desktop/googleappenginelauncher.app/contents/resources/googleappengine-default.bundle/contents/resources/google_appengine/google/appengine/datastore/datastore_rpc.py", line 1342, in check_rpc_success raise _todatastoreerror(err) internalerror: table "dev~guestbook!!entities" exists
it looks there couple of things happening here.
first, looks using nosegae --with-gae. plugin handles setting , tearing down testbed don't have to. means not need of self.testbed code , can cause conflicts internally. either switch doing nosegae way, or don't use --with-gae flag. if stick nosegae, has option --gae-datastore lets set path datastore use tests. inside test class, set property nosegae_datastore_v3 = true have set you:
class newvisitortest(unittest.testcase): # enable datastore stub nosegae_datastore_v3 = true second, way dev_appserver / sqlite work together, appserver loads sqlite db file memory , works there. when app server exits, flushes database contents disk. since using same datastore tests dev_appserver.py process opening selenium, may or may not see fixture data set inside test.
here example https://github.com/trii/nosegae/blob/master/nosegae.py#l124-l140
class mytest(unittest.testcase): nosegae_datastore_v3 = true nosegae_datastore_v3_kwargs = { 'datastore_file': '/tmp/nosegae.sqlite3', 'use_sqlite': true } def test_something(self): entity = mymodel(name='nosegae') entity.put() self.assertnotnone(entity.key.id())
Comments
Post a Comment