Your specific problem is that you are not importing the app engine SDK to your sys path. sys.path.append("/usr/local/google_appengine")
solves the ImportError.
But to solve your TDD challenge completely you have to use dev_appserver and testbed together with selenium. I took the solution proposed in https://stackoverflow.com/a/20986246/710851 and configured for your use case.
- Before you call app engine libraries import the SDK and other libraries needed to your sys path:
import sys
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")
- Start dev_appserver, selenium and setup the testbed in your setUp method:
def setUp(self):
# setup dev_appserver
APP_CONFIGS = ['app.yaml']
python_runtime._RUNTIME_ARGS = [
sys.executable,
os.path.join(os.path.dirname(dev_appserver.__file__),
'_python_runtime.py')
]
options = devappserver2.PARSER.parse_args([
'--admin_port', '0',
'--port', '9080',
'--datastore_path', ':memory:',
'--logs_path', ':memory:',
'--skip_sdk_update_check',
'--',
] + APP_CONFIGS)
server = devappserver2.DevelopmentServer()
server.start(options)
self.server = server
# setup selenium
self.browser = webdriver.Firefox()
self.browser.implicitly_wait(3)
# setup the testbed
self.tb = testbed.Testbed()
self.tb.setup_env(current_version_id='testbed.version')
self.tb.activate()
self.tb.init_user_stub()
self.tb.init_datastore_v3_stub()
self.tb.init_memcache_stub()
- Deactivate everything in the tearDown method:
def tearDown(self):
self.browser.quit()
self.tb.deactivate()
self.server.stop()
Complete example:
import os
import sys
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")
import dev_appserver
from google.appengine.tools.devappserver2 import devappserver2
from google.appengine.tools.devappserver2 import python_runtime
from google.appengine.ext import testbed
from selenium import webdriver
import unittest
from models import Customer
class NewVisitorTest(unittest.TestCase):
def setUp(self):
# setup the dev_appserver
APP_CONFIGS = ['app.yaml']
python_runtime._RUNTIME_ARGS = [
sys.executable,
os.path.join(os.path.dirname(dev_appserver.__file__),
'_python_runtime.py')
]
options = devappserver2.PARSER.parse_args([
'--admin_port', '0',
'--port', '9080',
'--datastore_path', ':memory:',
'--logs_path', ':memory:',
'--skip_sdk_update_check',
'--',
] + APP_CONFIGS)
server = devappserver2.DevelopmentServer()
server.start(options)
self.server = server
# setup selenium
self.browser = webdriver.Firefox()
self.browser.implicitly_wait(3)
# setup the testbed
self.tb = testbed.Testbed()
self.tb.setup_env(current_version_id='testbed.version')
self.tb.activate()
self.tb.init_user_stub()
self.tb.init_datastore_v3_stub()
self.tb.init_memcache_stub()
def tearDown(self):
self.browser.quit()
self.tb.deactivate()
self.server.stop()
def test_quest_can_submit_contact_info(self):
self.browser.get('http://localhost:9080')
self.browser.find_element_by_name('id_name').send_keys("Kallie Wheelock")
self.browser.find_element_by_name('id_email').send_keys("kallie@gmail.com")
self.browser.find_element_by_name('submit').submit()
Customer.query(Customer.name("Kallie Wheelock")).delete()