Skip to content

Der oxfmt-Test bekommt eine eigene, begründete Zeitgrenze - #281

Merged
JumpLink merged 1 commit into
mainfrom
b-a-slow-import-gets-its-own-timeout
Sep 24, 2026
Merged

JumpLink merged 1 commit into
mainfrom
b-a-slow-import-gets-its-own-timeout

Conversation

@JumpLink

Copy link
Copy Markdown
Collaborator

Worum es geht

apps/workbench/test/preview/home-document.test.ts scheiterte manchmal an Vitests 5-Sekunden-Grenze, obwohl nichts kaputt war, nämlich wenn der Rechner gerade stark ausgelastet war. Am 24.09.2026 hat das einmal das Hochladen von Code blockiert.

Was sich ändert

Gemessen statt geraten: Ein einzelner Test, „prints what oxfmt would print, for an edit of every kind“, startet für jeden seiner 21 Testfälle den Formatierer oxfmt als eigenen Prozess, nacheinander. Auf einem ruhigen Rechner dauert das 2,3 Sekunden. Unter einer Last von 18 Dauerschleifen auf einer Maschine mit 20 Kernen dauerte derselbe Test 14,4 Sekunden, deutlich über den 5 Sekunden, die Vitest einem einzelnen Test standardmäßig gibt, und genau die Art von Last, unter der #275 auch tatsächlich auftrat.

Das Starten der 21 Prozesse zieht jetzt in ein beforeAll um, das seine eigene, im Code begründete Zeitgrenze von 30 Sekunden bekommt, das Doppelte der gemessenen, belasteten Zeit. Der eigentliche Test prüft danach nur noch die vorbereiteten Ergebnisse und ist damit selbst in unter einer Millisekunde fertig. Die globale Zeitgrenze bleibt unverändert.

Vorher/nachher, derselbe Testlauf unter derselben Last (18 Dauerschleifen, 20 Kerne):

vorher nachher
ruhige Maschine 2,3 s (bestanden) < 1 ms für den Test selbst
unter Last 14,4 s (scheitert an der 5-s-Grenze) bestanden, innerhalb der neuen 30-s-Grenze für die Vorbereitung
Technische Details

Die Vermutung im Issue war ein langsamer erster Import; gemessen war die Ursache stattdessen execFileSync für den oxfmt-Binary, 21-mal hintereinander in einem it(). Ein beforeAll mit explizitem, im Kommentar begründetem drittem Argument (30_000) übernimmt das Spawnen und füllt oxfmtCases: { printed, formatted }[]; der it()-Block iteriert nur noch darüber. Kein anderer Test in der Datei ändert sich, und testTimeout bleibt überall auf seinem Standardwert.

Gemessen mit 18 while true; do :; done-Hintergrundprozessen (timeout 40s) auf einer Maschine mit 20 Kernen, mit npx vitest run test/preview/home-document.test.ts --reporter=verbose, vor und nach der Änderung, jeweils aus apps/workbench heraus. npm run check lief einmal vollständig grün.

Closes #275

🤖 Generated with Claude Code

…All (#275)

'prints what oxfmt would print, for an edit of every kind' spawns oxfmt once
per case, 21 spawns in a row. Measured 2026-09-24: 2.3s on an otherwise idle
machine, 14.4s against 18 busy loops on a 20-core box, timing out against
Vitest's 5s default testTimeout under exactly that kind of load, which is what
#275 hit against a parallel npm run check.

The spawning moves into a beforeAll that states its own explicit timeout, 30s,
twice the loaded measurement rather than a guess. The it() itself now only
asserts the precomputed pairs, which is why it was possible to give it none of
that headroom: the assertions were never what was slow. testTimeout stays at
its default everywhere else.

Closes #275
@JumpLink
JumpLink merged commit 4f45d99 into main Sep 24, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Ein Test scheitert, wenn der Rechner ausgelastet ist

1 participant