Tests von 55 auf 12 Sekunden, Abhängigkeiten nur noch einmal installieren
Docker-Image bauen / build (push) Successful in 1m7s

Der Testlauf war zu langsam. Gemessen statt geraten: 0,68 s Vorbereitung
pro Test, bei 81 Tests praktisch die ganze Laufzeit.

Ursache war bcrypt. Pro Test wird ein Hash gebildet und geprüft, und das
ist absichtlich langsam - genau das soll es im Betrieb sein. Der Aufwand
ist jetzt über BCRYPT_ROUNDS einstellbar (Standard bleibt 12) und in den
Tests auf 4 gesetzt: dort geht es um die Ablauflogik, nicht um die Stärke
des Hashes.

Der Dekompressionsbomben-Test erzeugte ein Bild mit 400 Megapixeln, allein
dafür 4,8 s. Jetzt wird stattdessen die Grenze heruntergesetzt und ein
kleines Bild verwendet - dieselbe Codestelle, ohne die Wartezeit.

Ausserdem installierten Test- und Anwendungs-Image dieselben
Abhängigkeiten zweimal. Dockerfile.test setzt nun auf dem gebauten
Anwendungs-Image auf, der Testschritt kommt entsprechend danach.

Dabei zwei Fallen, die beide auffielen, weil die Tests plötzlich wieder
langsam waren:
- Das Basis-Image bringt seinen eigenen Stand von app/ mit. Ohne erneutes
  Kopieren prüfen die Tests den Code des Basis-Images - ist es veraltet,
  läuft alles gegen alten Code und meldet Erfolg.
- Der ENTRYPOINT des Anwendungs-Images startet eine Datenbank-Migration.
  Für Tests weder nötig noch erwünscht, darum geleert.

Ganze Kette lokal durchgespielt: bauen, testen, Image prüfen - 22 s.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GR4bNaj9GtRu57J4Niii8o
This commit is contained in:
2026-08-30 14:45:24 +02:00
co-authored by Claude Opus 5
parent 2a55dcf1ce
commit e0212cfa2c
6 changed files with 56 additions and 24 deletions
+13 -7
View File
@@ -127,21 +127,27 @@ def test_zu_grosse_datei_wird_abgewiesen(client, item_id, monkeypatch):
einstellungen.cache_clear()
def test_dekompressionsbombe_wird_abgewiesen(client, item_id):
"""Ein paar hundert Kilobyte, die beim Entpacken den Speicher füllen.
def test_dekompressionsbombe_wird_abgewiesen(client, item_id, monkeypatch):
"""Ein paar Kilobyte, die beim Entpacken den Speicher füllen.
Pillow allein würde hier nur warnen - der Fehler kommt erst bei der
doppelten Pixelzahl. Darum die ausdrückliche Prüfung in images.py.
Statt wirklich 400 Megapixel zu erzeugen (was den Test um Sekunden
verlängerte) wird die Grenze heruntergesetzt: geprüft wird dieselbe
Codestelle, nur eben mit einem kleinen Bild.
"""
from app import images
monkeypatch.setattr(images, "MAX_PIXEL", 100_000)
puffer = io.BytesIO()
# 20000 x 20000 = 400 Megapixel, als einfarbiges PNG winzig komprimiert
Image.new("RGB", (20000, 20000), (0, 0, 0)).save(puffer, "PNG", compress_level=9)
roh = puffer.getvalue()
assert len(roh) < 2 * 1024 * 1024, "Testbild sollte klein sein"
# 600 x 600 = 360'000 Bildpunkte, also über der gesetzten Grenze
Image.new("RGB", (600, 600), (0, 0, 0)).save(puffer, "PNG", compress_level=9)
antwort = client.post(
f"/api/v1/items/{item_id}/images",
files={"dateien": ("bombe.png", roh, "image/png")},
files={"dateien": ("bombe.png", puffer.getvalue(), "image/png")},
)
assert antwort.status_code == 422
assert "Bildpunkte" in antwort.json()["detail"]