Tests: kein db.close() vor process.exit()

Auf dem Server brach test-personendaten.mjs ab:

  node::RemoveEnvironmentCleanupHook … Assertion failed: (env) != nullptr
  Statement::~Statement() … better_sqlite3.node
  Abgebrochen

better-sqlite3 raeumt seine Statements ueber einen Aufraeumhaken ab.
Wird die Verbindung unmittelbar vor dem Prozessende geschlossen, laeuft
dieser Haken ins Leere.

DIE FOLGE WAR SCHLIMMER ALS DER ABSTURZ

Der Absturz kam NACH allen Pruefungen, aber VOR der Zusammenfassung.
Der Test lieferte also einen Fehlercode, obwohl inhaltlich alles
bestanden war. In der mit && verketteten Befehlsfolge blieb deshalb der
anschliessende Dienst-Neustart aus -- und die neuen Endpunkte
antworteten weiter mit 404.

Man sucht dann den Fehler bei den Endpunkten, beim Deploy, an der
Zugangswand. Die Ursache lag beim Aufraeumen einer Testdatenbank.

Node schliesst die Verbindung beim Beenden ohnehin. Zusaetzlich faengt
das Loeschen der Testdateien jetzt Fehler ab: Ohne db.close() haelt der
Prozess sie noch offen, unter Windows scheitert das Loeschen dann mit
EBUSY -- und "force" hilft dagegen nicht, es unterdrueckt nur "Datei
nicht gefunden". Ein Test, der an seinem eigenen Aufraeumen scheitert,
meldet einen Fehler, den es fachlich nicht gibt.

Beide betroffenen Tests geprueft: Rueckgabewert 0, Zusammenfassung
vollstaendig.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-27 00:10:36 +02:00
co-authored by Claude Opus 5
parent e6e7ab033e
commit 76b88c6b71
2 changed files with 70 additions and 6 deletions
+35 -4
View File
@@ -178,10 +178,41 @@ P.geraetAbmelden(ENDPUNKT);
pruefe("ohne Geraet wirkt keine Meldung mehr", P.stand().wirktMeldung === false);
dienst.close();
db.close();
fs.rmSync(TEST_DB, { force: true });
fs.rmSync(TEST_DB + "-wal", { force: true });
fs.rmSync(TEST_DB + "-shm", { force: true });
/* ⚠️ KEIN db.close() vor process.exit() (geaendert 26.08.2026).
Auf dem Server brach dieser Test genau hier ab:
node::RemoveEnvironmentCleanupHook … Assertion failed: (env) != nullptr
Statement::~Statement() … better_sqlite3.node
Abgebrochen
better-sqlite3 raeumt seine Statements ueber einen Aufraeumhaken ab.
Wird die Verbindung unmittelbar vor dem Prozessende geschlossen,
laeuft dieser Haken ins Leere -- Node bricht mit einer Assertion ab,
und zwar NACH allen Pruefungen, aber VOR der Zusammenfassung.
Die Folge war schlimmer als der Absturz selbst: Der Test lieferte
einen Fehlercode, obwohl inhaltlich alles bestanden war. In einer
mit && verketteten Befehlsfolge blieb deshalb der anschliessende
Dienst-Neustart aus, und die neuen Endpunkte antworteten weiter mit
404. Man sucht dann den Fehler bei den Endpunkten statt beim
Aufraeumen einer Testdatenbank.
Node schliesst die Verbindung beim Beenden ohnehin. Die Testdateien
werden vorher entfernt; bleibt unter Windows eine gesperrte Datei
zurueck, faengt das rmSync mit force ab. */
// (db.close() entfernt)
/* Aufraeumen darf nicht ueber den Testausgang entscheiden.
Ohne db.close() (siehe oben) haelt der Prozess die Datei noch offen.
Unter Windows scheitert das Loeschen dann mit EBUSY -- und "force"
hilft dagegen nicht, es unterdrueckt nur "Datei nicht gefunden".
Ein Test, der an seinem eigenen Aufraeumen scheitert, meldet einen
Fehler, den es fachlich nicht gibt. Beim naechsten Start wird die
Datei ohnehin neu angelegt. */
for (const e of ["", "-wal", "-shm"]) {
try { fs.rmSync(TEST_DB + e, { force: true }); } catch { /* beim naechsten Lauf */ }
}
console.log(`\n===== ${ok} bestanden, ${fehl} fehlgeschlagen =====`);
process.exit(fehl ? 1 : 0);