Глава 22 · Веб-разработка с Python

Автоматическое тестирование Flask-приложения

Тестовый клиент проверяет логику приложения быстро и без обращения к сети.

Проверять каждое изменение вручную через браузер медленно и легко забыть повторить после следующей правки. У Flask есть встроенный тестовый клиент — он позволяет отправлять запросы приложению из кода теста и проверять ответ.

Тестовый клиент не открывает сетевой порт
app.test_client() не создаёт сетевое HTTP-соединение. Он формирует запрос внутри процесса и передаёт его напрямую обработчику Flask через тестовый интерфейс библиотеки Werkzeug, на которой построен Flask, — быстро и без сети, но с той же логикой обработки запроса. Полный путь запроса через браузер и сеть показывал раздел 22.7 — тестовый клиент сознательно пропускает именно эту часть.
test_app.py
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-ответа

test_api.py
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, но короче.

Отдельная база данных для тестов

Тесты не должны трогать ту же базу данных, с которой вы работаете вручную, — иначе прогон тестов может стереть или испортить сохранённые в ней задачи. Перед каждым тестом создаётся временная база данных, а после — удаляется:

conftest.py
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.

Практика: тесты для Flask-приложения
Модуль flask не установлен в браузерном окружении Pyodide — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →