Как проверить приложение Connexion / Flask?

5

Я использую Connexion для Flask для создания микросервиса. Я хотел бы написать тесты для своего приложения, используя py.test.

В документе pytest-flask говорится, чтобы создать прибор в conftest.py, который создает приложение следующим образом:

conftest.py

import pytest

from api.main import create_app


@pytest.fixture
def app():
    app = create_app()
    return app

В моем тесте я использую приспособление client следующим образом:

test_api.py

def test_api_ping(client):
    res = client.get('/status')
    assert res.status == 200

Однако при запуске py.test появляется следующее сообщение об ошибке:

==================================== 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:

main.py

import connexion


def create_app():
    app = connexion.App(__name__, port=8002,)
    app.add_api('swagger.yaml')
    return app


if __name__ == "__main__":
    create_app().run()
Теги:
flask
testing
swagger
py.test

1 ответ

3
Лучший ответ

Использование светильников

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 на каждой конечной точке.

  • 1
    Это действительно сработало для меня один раз. Однако теперь он снова начал E AttributeError: 'FlaskClient' object has no attribute 'response_class' сбой, не знаю почему: E AttributeError: 'FlaskClient' object has no attribute 'response_class'
  • 1
    У меня было на самом деле название приспособления что-то еще, кроме app
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню