Автоматическое тестирование Flask-приложения
Тестовый клиент проверяет логику приложения быстро и без обращения к сети.
Проверять каждое изменение вручную через браузер медленно и легко забыть повторить после следующей правки. У Flask есть встроенный тестовый клиент — он позволяет отправлять запросы приложению из кода теста и проверять ответ.
app.test_client() не создаёт сетевое HTTP-соединение. Он формирует запрос внутри процесса и передаёт его напрямую обработчику Flask через тестовый интерфейс библиотеки Werkzeug, на которой построен Flask, — быстро и без сети, но с той же логикой обработки запроса. Полный путь запроса через браузер и сеть показывал раздел 22.7 — тестовый клиент сознательно пропускает именно эту часть.import app as todoapp
def test_glavnaya_pustoj_spisok(baza_dannyh):
client = todoapp.app.test_client()
otvet = client.get("/")
assert otvet.status_code == 200
assert "Задач пока нет" in otvet.get_data(as_text=True)
Проверка JSON-ответа
def test_api_tasks_vozvrashchaet_json(baza_dannyh):
client = todoapp.app.test_client()
otvet = client.get("/api/tasks")
assert otvet.status_code == 200
assert otvet.content_type == "application/json"
dannye = otvet.get_json()
assert isinstance(dannye, list)
otvet.get_json() сам разбирает тело ответа как JSON —
это то же самое, что json.loads(otvet.get_data()) из раздела
22.15, но короче.
Отдельная база данных для тестов
Тесты не должны трогать ту же базу данных, с которой вы работаете вручную, — иначе прогон тестов может стереть или испортить сохранённые в ней задачи. Перед каждым тестом создаётся временная база данных, а после — удаляется:
import tempfile
import os
import pytest
import app as todoapp
@pytest.fixture
def baza_dannyh():
fd, put = tempfile.mkstemp()
todoapp.app.config["DATABASE"] = put
with todoapp.app.app_context():
todoapp.init_db()
yield put
os.close(fd)
os.unlink(put)
Полный набор тестов проекта — в tests/test_chapter22_todo_app.py
в репозитории книги; он проверяет маршруты, сохранение в базе, валидацию, JSON API и
защиту от SQL-инъекции и XSS из разделов 22.31-22.32.