python / expert
Snippet
Dynamischer Kontext-Manager zur Validierung der Abfrageanzahl für Unit-Tests
Dieses fortgeschrittene Testmuster nutzt Djangos CaptureQueriesContext zusammen mit Pythons @contextmanager-Generatorstandard, um dynamische SQL-Abfrageprüfungen bei Unit-Tests zu erstellen. Im Gegensatz zum Standard-assertNumQueries ermöglicht dieser Wrapper flexible Obergrenzen für Datenbankinteraktionen in komplexen Testszenarien.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
from contextlib import contextmanagerfrom django.db import connectionfrom django.test.utils import CaptureQueriesContext@contextmanagerdef assert_max_queries(max_queries: int):with CaptureQueriesContext(connection) as ctx:yield ctxquery_count = len(ctx.captured_queries)assert query_count <= max_queries, f"Expected <={max_queries} queries, got {query_count}"
django
Erklärung
1
from contextlib import contextmanager
Importiert den contextmanager-Dekorator zum Erstellen generatorbasierter Kontext-Manager.
2
from django.db import connection
Ruft die aktive Standard-Datenbankverbindung von Django ab.
3
from django.test.utils import CaptureQueriesContext
Importiert das Django-Testprogramm zum Erfassen von rohen SQL-Abfragen innerhalb eines Ausführungsblocks.
4
@contextmanager
Dekoriert eine Generatorfunktion zur Implementierung von Kontextverwaltungs-Protokollen.
5
def assert_max_queries(max_queries: int):
Definiert eine Hilfsfunktion, die eine maximale Anzahl erlaubter SQL-Abfragen akzeptiert.
6
with CaptureQueriesContext(connection) as ctx:
Instanziiert den Erfassungskontext-Listener um den auszuführenden Bereich.
7
yield ctx
Pausiert die Ausführung und übergibt das Kontextobjekt zur inneren Auswertung.
8
query_count = len(ctx.captured_queries)
Berechnet die Gesamtzahl der aufgezeichneten SQL-Anweisungen.
9
assert query_count <= max_queries, f"Expected <={max_queries} queries, got {query_count}"
Prüft per Assertion, ob die Anzahl der Ausführungen die Obergrenze nicht überschreitet.