Используйте запросы - html для тестирования Flask приложения без запуска сервера - PullRequest
3 голосов
/ 06 апреля 2020

Я использовал объект Flask test_client для тестирования своих веб-приложений. Я использовал BeautifulSoup для анализа вывода HTML некоторых из этих вызовов.

Теперь я хотел попробовать запросы- html, но не могу понять, как заставить его работать с тестовым клиентом Flask. Все примеры используют пакет запроса для получения ответа, но тестовый клиент Werkzeug не выполняет фактический HTTP-вызов. Из того, что я могу сказать, он устанавливает среду и просто вызывает метод-обработчик.

Есть ли способ заставить эту работу работать без фактического запуска службы?

1 Ответ

5 голосов
/ 06 апреля 2020

request-wsgi-adapter предоставляет адаптер для монтирования вызываемого WSGI по URL-адресу. Вы используете session.mount() для монтирования адаптеров, поэтому для запросов - html вместо этого вы используете HTMLSession и монтируете его.

$ pip install flask requests-wsgi-adapter requests-html
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "<p>Hello, World!</p>"
from requests_html import HTMLSession
from wsgiadapter import WSGIAdapter

s = HTMLSession()
s.mount("http://test", WSGIAdapter(app))
r = s.get("http://test/")
assert r.html.find("p")[0].text == "Hello, World!"

Недостатком использования запросов является то, что вам необходимо добавить "http://test/" перед каждым URL, к которому вы хотите сделать запрос. Тестовый клиент Flask не требует этого.


Вместо использования запросов и запросов - html, вы также можете указать тестовому клиенту Flask вернуть Response, который выполняет BeautifulSoup разбор для тебя. После быстрого просмотра запросов - html, я все же предпочитаю прямой Flask тестовый клиент и API BeautifulSoup.

$ pip install flask beautifulsoup4 lxml
from flask.wrappers import Response
from werkzeug.utils import cached_property

class HTMLResponse(Response):
    @cached_property
    def html(self):
        return BeautifulSoup(self.get_data(), "lxml")

app.response_class = HTMLResponse
c = app.test_client()
r = c.get("/")
assert r.html.p.text == "Hello, World!"

Вам также следует рассмотреть возможность использования HTTPX вместо запросов. Это современная, хорошо поддерживаемая клиентская библиотека HTTP, которая разделяет многие сходства API с запросами. Он также имеет замечательные функции, такие как asyn c, HTTP / 2 и встроенную возможность прямого вызова приложений WSGI .

$ pip install flask httpx
c = httpx.Client(app=app, base_url="http://test")
with c:
    r = c.get("/")
    html = BeautifulSoup(r.text)
    assert html.p.text == "Hello, World!"
...