问题描述
我正在为 Connexion 框架.org/" rel="noreferrer">Flask 来构建微服务.我想使用 py.test 为我的应用程序编写测试.
I'm using the Connexion framework for Flask to build a microservice. I would like to write tests for my application using py.test.
在 pytest-flask 文档中,它说要在 conftest.py 中创建一个固定装置,这样可以创建应用程序:
In the pytest-flask doc it says to create a fixture in conftest.py that creates the app like so:
import pytest
from api.main import create_app
@pytest.fixture
def app():
    app = create_app()
    return app
在我的测试中,我正在使用 client 夹具,如下所示:
In my test I'm using the client fixture like this:
def test_api_ping(client):
    res = client.get('/status')
    assert res.status == 200
但是,当我运行 py.test 时,我收到以下错误消息:
However when I run py.test I get the following error message:
==================================== ERRORS ====================================
_______________________ ERROR at setup of test_api_ping ________________________
request = <SubRequest '_monkeypatch_response_class' for <Function 'test_api_ping'>>
monkeypatch = <_pytest.monkeypatch.MonkeyPatch instance at 0x7f9f76b76518>
    @pytest.fixture(autouse=True)
    def _monkeypatch_response_class(request, monkeypatch):
        """Set custom response class before test suite and restore the original
        after. Custom response has `json` property to easily test JSON responses::
    
            @app.route('/ping')
            def ping():
                return jsonify(ping='pong')
    
            def test_json(client):
                res = client.get(url_for('ping'))
                assert res.json == {'ping': 'pong'}
    
        """
        if 'app' not in request.fixturenames:
            return
    
        app = request.getfuncargvalue('app')
        monkeypatch.setattr(app, 'response_class',
>                           _make_test_response_class(app.response_class))
E       AttributeError: 'App' object has no attribute 'response_class'
我怎样才能使 py.test 工作?这是我的 create_app 函数:
How can I make py.test work? Here is my create_app function:
import connexion
def create_app():
    app = connexion.App(__name__, port=8002,)
    app.add_api('swagger.yaml')
    return app
if __name__ == "__main__":
    create_app().run()
推荐答案
使用夹具
test_api.py
import pytest
import connexion
flask_app = connexion.FlaskApp(__name__)
flask_app.add_api('swagger.yml')
@pytest.fixture(scope='module')
def client():
    with flask_app.app.test_client() as c:
        yield c
def test_health(client):
    response = client.get('/health')
    assert response.status_code == 200
swagger.yml
swagger: '2.0'
info:
  title: My API
  version: '1.0'
consumes:
  - application/json
produces:
  - application/json
schemes:
  - https
paths:
  /health:
    get:
      tags: [Health]
      operationId: api.health
      summary: Health Check
      responses:
        '200':
          description: Status message from server describing current health
api.py
def health():
    return {'msg': 'ok'}, 200
使用 Swagger 测试器
使用 swagger-tester 的另一种解决方案:
test_api.py
from swagger_tester import swagger_test
authorize_error = {
    'get': {
        '/health': [200],
    }
}
def test_swagger():
    swagger_test('swagger.yml', authorize_error=authorize_error)
这个库很酷的地方在于您可以使用规范中提供的示例.但我认为 connexion.RestyResolver 不能开箱即用:您必须在每个端点指定 OperationId.
Cool thing about this library is that you can use the examples provided in your spec. But I don't think it works out of the box with connexion.RestyResolver: you'll have to specify the OperationId at each endpoint.
这篇关于如何测试 Connexion/Flask 应用程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!


 大气响应式网络建站服务公司织梦模板
大气响应式网络建站服务公司织梦模板 高端大气html5设计公司网站源码
高端大气html5设计公司网站源码 织梦dede网页模板下载素材销售下载站平台(带会员中心带筛选)
织梦dede网页模板下载素材销售下载站平台(带会员中心带筛选) 财税代理公司注册代理记账网站织梦模板(带手机端)
财税代理公司注册代理记账网站织梦模板(带手机端) 成人高考自考在职研究生教育机构网站源码(带手机端)
成人高考自考在职研究生教育机构网站源码(带手机端) 高端HTML5响应式企业集团通用类网站织梦模板(自适应手机端)
高端HTML5响应式企业集团通用类网站织梦模板(自适应手机端)