From 40587ebe98eca1be22c96a2efe348f7d53b2a684 Mon Sep 17 00:00:00 2001 From: Roland Date: Thu, 30 Jul 2026 17:43:58 -0600 Subject: [PATCH] build: require pytest-timeout, so a hung test fails instead of hanging CI pytest.ini has carried `timeout = 30` and `timeout_method = signal` with a comment asking that it not be removed, but pytest-timeout was never declared in requirements.txt. CI installs only that file, so the options were unknown there, pytest warned and carried on, and the timeout has never once applied in CI. A hung test ran until CircleCI killed the job, which reports no test name at all -- and when the hang took an xdist worker with it, the rest of that worker's tests came back as a wall of EOFError, burying the actual cause. It goes in requirements.txt rather than a dev-only file because this project has no testing-only dependencies: a WROLPi is expected to run, test, and develop on the device, so the four Dockerfiles that install this file get it too. Verified: the unknown-option warnings are gone, a deliberately hung test now fails with "Timeout (>30.0s) from pytest-timeout" naming the test, and the full suite passes with the timeout in force -- 1709 passed under -nauto, so no legitimate test is near the limit locally. Worth watching: this is a behaviour change for CI, which has never enforced it. CircleCI runs on 4 vCPU with -nauto, so a test that takes ten seconds here could take longer there. If timeouts appear in CI the number is the thing to raise, not the plugin to drop. Co-Authored-By: Claude Opus 5 (1M context) --- requirements.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/requirements.txt b/requirements.txt index 8537321d..bbbfff82 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,6 +15,11 @@ psutil==7.2.2 pydantic>=2.0.0 PyMuPDF>=1.27.2.3 pytest-asyncio==1.4.0 +# pytest.ini sets `timeout = 30` and asks that it not be removed, but this was never declared +# here -- so on any machine without it, and in CI, which installs only this file, the option was +# unknown and the timeout never applied. A hung test then runs until the CI job itself is +# killed, with no indication of which test hung. +pytest-timeout==2.4.0 pytest-xdist==3.8.0 pytest==9.0.3 py7zr>=1.1.3