Rozdział 22 · Tworzenie stron internetowych z Python

Automatyczne testowanie Flask- aplikacji

Klient testowy sprawdza logikę aplikacji szybko i bez odwoływania się do sieci.

Każdą zmianę ręcznie sprawdzam w przeglądarce, powoli i łatwo zapominam powtórzyć po następnej edycji. Flask ma wbudowany klient testowy — on Pozwala wysyłać żądania do aplikacji z kodu testowego i weryfikować odpowiedź.

Klient testowy nie otwiera portu sieciowego
app.test_client() nie tworzy połączenia sieciowego HTTP-. Tworzy zapytanie wewnątrz procesu i przekazuje je bezpośrednio do obsługującego Flask przez testowy interfejs biblioteki Werkzeug, na której zbudowany jest Flask — szybko i bez sieci, ale z tą samą logiką przetwarzania zapytania. Pełna ścieżka zapytania przez przeglądarkę i sieć była pokazana w rozdziale 22.7 — testowy klient celowo pomija właśnie tę część.
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 „Jeszcze żadnych zadań” in otvet.get_data(as_text=True)

Sprawdzanie odpowiedzi 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() sam analizuje ciało odpowiedzi jako JSON — to to samo, co json.loads(otvet.get_data()) z sekcji 22,15, ale krócej.

Oddzielna baza danych do testów

Testy nie powinny ingerować w tę samą bazę danych, na której pracujesz ręcznie, — w przeciwnym razie przebieg testów może usunąć lub uszkodzić zapisane w niej zadania. Przed każdym testem tworzona jest tymczasowa baza danych, a po nim — usuwana:

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)

Pełny zestaw testów projektu — w tests/test_chapter22_todo_app.py w repozytorium książek; sprawdza trasy, zapisuje je do bazy danych, waliduje JSON API oraz ochrona przed zastrzykami SQL- i XSS z sekcji 22.31-22.32.

Praktyka: Testy dla aplikacji Flask-a.
Moduł flask nie jest zainstalowany w środowisku przeglądarki Pyodide – działa lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →