Large projects
- Search in cases is full-text (SQLite FTS5): title, preconditions, steps, expected results and tags; each
word matches by its beginning (“pay” finds “payment”, “payments”), case and ё/е do not matter. The best
matches come first, matches are highlighted, and for matches in steps a piece of the text is shown. A key
(
SHOP-12) or a number puts its case first. - Lists of cases and runs come in pages (
?limit=&offset=, the total in theX-Total-Countheader; withoutlimit— the whole list, as before). A long case list loads more while scrolling, and only the visible rows are drawn. - Load test set:
pnpm --filter @tsmc/server benchcreates (once, indata/bench.db, about 30 s) a project with 20,000 cases and 500 runs (86,000 results) and measures key pages and operations; in CI it is a separate check. Median after warm-up on an ordinary laptop:
| Page or operation | Time |
|---|---|
| case list (a page), search, filters | 1–36 ms |
| a run of 300 cases, run report, run list | 3–42 ms |
| six-month dashboard, hygiene, pick by changes | 190–230 ms |
CSV export, tsmc pull of the whole project |
0.7 s |
tsmc push --dry-run of the whole project |
2.3 s |
| import preview of 1,000 rows | 0.4 s |
The duplicate search of “Hygiene” compares the texts of all cases (about a second for 20,000); the result is kept in memory until cases change and is computed right after the server starts.