So führen Sie die echten Datenbankintegrationstests aus
Das Standard-uv run pytest läuft nur gegen SQLite / In-Memory — schnell und abhängigkeitsfrei. Eine separate Suite unter tests/integration/ testet die Repository-Schicht gegen echte PostgreSQL- und MySQL-Server, die Dialekte, die das Framework zu unterstützen behauptet. Diese Tests überspringen, wenn die entsprechende URL-Umgebungsvariable nicht gesetzt ist, sodass sie den Standard-Lauf nie verlangsamen.
Lokal mit Docker ausführen
Wegwerfbare Datenbanken starten:
bash
docker run -d --name nene2-pg -e POSTGRES_PASSWORD=nene2 -e POSTGRES_DB=nene2_test \
-p 5432:5432 postgres:16-alpine
docker run -d --name nene2-mysql -e MYSQL_ROOT_PASSWORD=nene2 -e MYSQL_DATABASE=nene2_test \
-p 3306:3306 mysql:8Die Suite auf sie zeigen und ausführen:
bash
export NENE2_TEST_POSTGRES_URL="postgresql+psycopg2://postgres:nene2@127.0.0.1:5432/nene2_test"
export NENE2_TEST_MYSQL_URL="mysql+pymysql://root:nene2@127.0.0.1:3306/nene2_test"
uv run pytest tests/integration/ -v --no-covSetzen Sie nur eine Variable, um ein einzelnes Backend zu testen. Wenn keine gesetzt ist, wird die Suite übersprungen.
Bereinigen Sie, wenn Sie fertig sind:
bash
docker rm -f nene2-pg nene2-mysqlIn CI
Der integration-db-Job in .github/workflows/ci.yml stellt PostgreSQL und MySQL als Service-Container bereit und führt diese Suite bei jedem Push und PR aus — sodass dialektspezifische Regressionen (z. B. PostgreSQLs fehlender lastrowid, der einst save() dazu brachte, den falschen Primärschlüssel zurückzugeben, #747) automatisch erkannt werden.
Wie das Schema erstellt wird
Das Fixture erstellt das Schema aus einer SQLAlchemy-Table-Definition (tests/integration/conftest.py), sodass derselbe Integer-Autoincrement-Primärschlüssel auf PostgreSQL zu SERIAL, auf MySQL zu AUTO_INCREMENT und auf SQLite zu AUTOINCREMENT wird — kein handgeschriebenes DDL pro Dialekt. Jeder Test erhält eine frisch erstellte und gelöschte Tabelle.