This test example is based on the Google App Engine docs and Flask docs.
To run test:
python tests/test.py ~/google-cloud-sdk/platform/google_appengine/
~/google-cloud-sdk/platform/google_appengine/ is the path to the App Engine SDK.
| # handlers/api.py | |
| # Import the Flask Framework | |
| from flask import Flask, jsonify | |
| app = Flask(__name__) | |
| # Note: We don't need to call run() since our application is embedded within | |
| # the App Engine WSGI application server. | |
| @app.route('/api/v1.0/ping', methods = ['GET']) | |
| def ping(): | |
| return jsonify({ | |
| 'ping': 'pong' | |
| }) | |
| @app.errorhandler(404) | |
| def page_not_found(e): | |
| """Return a custom 404 error.""" | |
| return 'Sorry, Nothing at this URL.', 404 | |
| @app.errorhandler(500) | |
| def application_error(e): | |
| """Return a custom 500 error.""" | |
| return 'Sorry, unexpected error: {}'.format(e), 500 |
| # This file specifies your Python application's runtime configuration | |
| # including URL routing, versions, static file uploads, etc. See | |
| # https://developers.google.com/appengine/docs/python/config/appconfig | |
| # for details. | |
| version: sample | |
| application: appengine-sample | |
| runtime: python27 | |
| api_version: 1 | |
| threadsafe: yes | |
| # Handlers define how to route requests to your application. | |
| # The script value is in the format <path.to.module>.<wsgi_application> | |
| # where <wsgi_application> is a WSGI application object. | |
| handlers: | |
| # | |
| # Task/Job Endpoints | |
| # Restrict to admin | |
| # | |
| - url: /backend/.* | |
| script: handlers.backend.app | |
| login: admin | |
| # | |
| # Default | |
| # | |
| - url: .* | |
| script: handlers.api.app | |
| # Third party libraries that are included in the App Engine SDK must be listed | |
| # here if you want to use them. See | |
| # https://developers.google.com/appengine/docs/python/tools/libraries27 for | |
| # a list of libraries included in the SDK. | |
| libraries: | |
| - name: jinja2 | |
| version: latest |
This test example is based on the Google App Engine docs and Flask docs.
To run test:
python tests/test.py ~/google-cloud-sdk/platform/google_appengine/
~/google-cloud-sdk/platform/google_appengine/ is the path to the App Engine SDK.
| # tests/test.py | |
| # | |
| # Test Runner | |
| # https://github.com/davide-ceretti/googleappengine-python-flask-skeleton/blob/master/application/test.py | |
| # | |
| # USAGE | |
| # python tests/test.py ~/google-cloud-sdk/platform/google_appengine/ | |
| # | |
| import optparse | |
| import sys | |
| import unittest | |
| import site | |
| import os | |
| TEST_PATH = './tests' | |
| USAGE = """python test.py SDK_PATH | |
| Run unit tests for App Engine apps. | |
| SDK_PATH Path to the SDK installation""" | |
| def main(sdk_path, test_path): | |
| sys.path.insert(0, sdk_path) | |
| site.addsitedir(os.path.join(os.getcwd(), 'lib')) | |
| import dev_appserver | |
| dev_appserver.fix_sys_path() | |
| suite = unittest.loader.TestLoader().discover(test_path, top_level_dir='.') | |
| unittest.TextTestRunner(verbosity=2).run(suite) | |
| if __name__ == '__main__': | |
| parser = optparse.OptionParser(USAGE) | |
| options, args = parser.parse_args() | |
| if len(args) != 1: | |
| print 'Require Google App Engine SDK path.' | |
| parser.print_help() | |
| sys.exit(1) | |
| SDK_PATH = args[0] | |
| main(SDK_PATH, TEST_PATH) |
| # tests/handlers/test_api.py | |
| import unittest | |
| import json | |
| from google.appengine.api import memcache | |
| from google.appengine.ext import ndb | |
| from google.appengine.ext import testbed | |
| from handlers import api | |
| class ApiHandlerTest(unittest.TestCase): | |
| def setUp(self): | |
| self.testbed = testbed.Testbed() | |
| self.testbed.activate() | |
| self.testbed.init_datastore_v3_stub() | |
| self.testbed.init_memcache_stub() | |
| self.app = api.app.test_client() | |
| ndb.get_context().clear_cache() | |
| def tearDown(self): | |
| self.testbed.deactivate() | |
| def testPing(self): | |
| response = self.app.get('/api/v1.0/ping') | |
| self.assertEqual(response.status_code, 200) | |
| json_data = json.loads(response.data) | |
| self.assertEqual(json_data['ping'], 'pong') |