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ź.
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ęść.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-
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:
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.