v3.37.0: load testing for test scripts and suites

POST /api/test/run takes an optional iterations count (the PWA's
Iterations field): the run repeats, successful iterations are discarded
(steps/log cleared, only load.done and the timing grow), the first error
stops the loop and keeps that iteration's report, a stop ends it after
the current iteration, and a card session change between iterations is
an error.  The SCP80 counter state is shared across iterations, so
packets continue from what the previous run consumed.

The status gains a load block (iteration/done/failed_iteration/
elapsed_ms/avg_ms; disabled for a normal run).  The suite runner was
split into a per-iteration body (_test_suite_execute_once) + the
single-run finaliser, and two load workers own the loops.

Review fixes: a raised runner error finalises as error (no stuck
running state), a suite-internal session change is an error, a stopped
member ends the suite loop, the final status keeps a warning from any
iteration, avg_ms covers the attempted iterations, and each suite
iteration's counters_before is read fresh.

1041 Python + 1069 frontend; simple-v475.
This commit is contained in:
2026-10-23 23:44:42 +03:00
parent 851ff65af6
commit 2181ef6bbf
13 changed files with 937 additions and 64 deletions
+25
View File
@@ -9,6 +9,31 @@ every change carries a descriptive commit message.
## [Unreleased]
## [3.37.0] — 2026-10-23
### Added
- **Load testing** for test scripts and suites. `POST /api/test/run` takes an optional
`iterations` count (the PWA's **Iterations** field next to *Start* / *Run suite*): the
run repeats N times, successful iterations are discarded (only the iteration counter and
the timing are kept; the per-step log is not rendered or retained), and the first
iteration that ends in an **error** stops the loop and keeps that iteration's full
report. A manual stop ends it after the current iteration, and a card session change
between iterations is an error (a swapped card is never run against another card's
script). The SCP80 counter state is shared across iterations, so packets continue from
what the previous run consumed. The run status gains a `load` block (`iteration`,
`done`, `failed_iteration`, `elapsed_ms`, `avg_ms`); the count is a run parameter, not
part of the stored script or suite.
### Fixed
- The load-test loop closes properly on a raised runner error (it used to leave the run
`running` forever - the PWA polled a dead run and *Clear report* stayed refused), on a
card session change inside a suite iteration, and on a member that was stopped; a
warning in any iteration is reflected in the final status, `avg_ms` covers the attempted
iterations (the failing one included), and each suite iteration's `counters_before` is
read fresh from the preset store.
## [3.36.0] — 2026-10-23
### Added