How to unit test Google Cloud Endpoints

后端 未结 6 1408
盖世英雄少女心
盖世英雄少女心 2020-12-23 00:12

I\'m needing some help setting up unittests for Google Cloud Endpoints. Using WebTest all requests answer with AppError: Bad response: 404 Not Found. I\'m not really sure if

6条回答
  •  南方客
    南方客 (楼主)
    2020-12-23 00:35

    My solution uses one dev_appserver instance for the entire test module, which is faster than restarting the dev_appserver for each test method.

    By using Google's Python API client library, I also get the simplest and at the same time most powerful way of interacting with my API.

    import unittest
    import sys
    import os
    
    from apiclient.discovery import build
    import dev_appserver
    
    
    sys.path[1:1] = dev_appserver.EXTRA_PATHS
    
    from google.appengine.tools.devappserver2 import devappserver2
    from google.appengine.tools.devappserver2 import python_runtime
    
    server = None
    
    
    def setUpModule():
        # starting a dev_appserver instance for testing
        path_to_app_yaml = os.path.normpath('path_to_app_yaml')
        app_configs = [path_to_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(['--port', '8080',
                                               '--datastore_path', ':memory:',
                                               '--logs_path', ':memory:',
                                               '--skip_sdk_update_check',
                                               '--',
                                               ] + app_configs)
        global server
        server = devappserver2.DevelopmentServer()
        server.start(options)
    
    
    def tearDownModule():
        # shutting down dev_appserver instance after testing
        server.stop()
    
    
    class MyTest(unittest.TestCase):
        @classmethod
        def setUpClass(cls):
            # build a service object for interacting with the api
            # dev_appserver must be running and listening on port 8080
            api_root = 'http://127.0.0.1:8080/_ah/api'
            api = 'my_api'
            version = 'v0.1'
            discovery_url = '%s/discovery/v1/apis/%s/%s/rest' % (api_root, api,                     
                                                                 version)
            cls.service = build(api, version, discoveryServiceUrl=discovery_url)
    
        def setUp(self):
            # create a parent entity and store its key for each test run
            body = {'name': 'test  parent'}
            response = self.service.parent().post(body=body).execute()   
            self.parent_key = response['parent_key']
    
        def test_post(self):
            # test my post method 
            # the tested method also requires a path argument "parent_key" 
            # .../_ah/api/my_api/sub_api/post/{parent_key}
            body = {'SomeProjectEntity': {'SomeId': 'abcdefgh'}}
            parent_key = self.parent_key
            req = self.service.sub_api().post(body=body,parent_key=parent_key)
            response = req.execute()
            etc..
    

提交回复
热议问题