加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python中的Flask测试 – 在repo中构建一个API,其中有许多用于通

发布时间:2020-12-20 13:46:33 所属栏目:Python 来源:网络整理
导读:我们有一个ETL数据API仓库.我们在其中进行所有etl处理,然后在API中吐出数据.这些API一次运行一个命令,从一个命令传递资源类到服务器以构建API.资源类位于__init__.py中的Web目录中. 这是一个很好的约定,使用起来非常简单,但我遇到的问题来自于试图获得3个API
我们有一个ETL数据API仓库.我们在其中进行所有etl处理,然后在API中吐出数据.这些API一次运行一个命令,从一个命令传递资源类到服务器以构建API.资源类位于__init__.py中的Web目录中.

这是一个很好的约定,使用起来非常简单,但我遇到的问题来自于试图获得3个API中的一个可用于测试.我们的目录结构是这样的(调用项目’番茄’)

tomato

- category_api
    - web
    - etl
    - test
        - here is where we are writing some tests (test_category_api.py)
    - data
- article_api
    - web
    - etl
    - test
    - data
- recommendation_api
    - web
    - etl
    - test
    - data
- common
    - common shit

在这个测试中,我有以下测试类.在从底部向上的第七行,
你会看到它在哪里打破的评论.它是import_module方法.

import unittest
    import sys
    import os
    import sys
    import json

    from importlib import import_module
    from flask import Flask
    from flask_restful import Api,abort,wraps
    from flask_restful.utils import cors
    from flask.ext.testing import TestCase

    #dir_above_top_level = os.path.join(os.path.abspath(__file__),'../../..    /')
    #sys.path.append(os.path.abspath(dir_above_top_level))

    _CATEGORY_ENDPOINT = '/v1/category/'
    _PACKAGE_NAME = os.environ['RECO_API_PACKAGE_NAME']
    _CORS = cors.crossdomain(origin='*',headers=['Origin','X-Requested-With','Content-Type','Accept'],methods=['GET','HEAD','OPTIONS'],max_age=3600)

    class CategoryTests(TestCase):
        def __init__(self):
            self.app = Flask(__name__)
            self._configure_app()
            for resource in self.resource_classes:
                self.api.add_resource(self.resource,self.resource.URI_TEMPLATE)
        def test_status_code(self):
            self.response = self.client.post(_CATEGORY_ENDPOINT,data=json.dumps(
                                         {'title': 'Enjoy this delicious food'}),headers=json.dumps(
                                         {'content-type':'application/json'}))
            self.assertEqual(self.response.status_code,200)

        def test_version(self):
            self.response = self.client.post(_CATEGORY_ENDPOINT,data=json.dumps(
                                             {"title": "eat some delicious stuff"}),headers=json.dumps(
                                             {'content-type':'application/json'}))
            self.assertEqual(json.dumps(self.response['version']),'1')

        def _configure_app(self):
            self.app = Flask(__name__)
            self.app.config['TESTING'] = True
            self.app.debug = True
            self.decorators = [_CORS]
            self.app.Threaded = True
            self.web_package = 'tomato.category.web'
            self.package = import_module('.__init__',self.web_package) # WE BREAK HERE
            self.resources = package.RESOURCE_NAMES
            self.resource_classes = [ getattr(package,resource) for resource in resources ]
            self.api = Api(self.app,catch_all_404s=True,decorators=self.decorators)

    if __name__ == '__main__':
        unittest.main()

运行这些测试时,我们会遇到异常:

ImportError:没有名为tomato.category.web .__ init__的模块

然后进入主要的顶级目录,并且ls tomato / category / web将我们__init__.py和它的资源类放在那里.

如何导入此类以便我可以实例化API以在此类中运行测试?
或者如果我完全走错了轨道我应该做什么呢?

解决方法

你不需要导入__init__,就像你可能不会从tomato.category.web import __init__那样.您应该能够直接导入Web包.

self.web_package = 'tomato.category.web'
self.package = import_module(self.web_package)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读