Stressz tesztelés
Stressz suite. Kalapálja az alkalmazás azon részeit, amelyeknek a meghibásodása felhasználók pénzébe kerül — főként a copy trading — ellenséges, randomizált, fault-injektált munkaterhelésekkel. Azt állítja, hogy a rendszer helyes marad. A tests/StressTests-ben él, a normál dotnet test green gate-ben fut.
Megközelítés — Determinisztikus Szimulációs Tesztelés (DST)
A legjobb mód a persely pénzügyi rendszerek stresszelésére = determinisztikus szimulációs tesztelés, per TigerBeetle, FoundationDB, Antithesis: valódi logikát futtatni egy szimulált világ ellen, meghajtva seedelt random munkaterheléssel + injektált hibákkal, invariánsokat assert-elni quiescence-kor. Minden seedelt + determinisztikus → bármely hiba reprodukálható a seed-ből. Kombinálva:
- Chaos-engineering fault injection (Netflix Chaos Monkey stílus) — kapcsolat drop-ok, order elutasítások, token rotáció, node halál.
- Property-based invariánsok — nem exact hívási sorozatokat assert; olyan propertyket állít, amelyeknek fenn kell maradniuk, bármennyire is előre nem láthatóan interszekálódnak az események (konvergencia, nincs orphan, legfeljebb egy lease holder).
Az alkalmazás már tökéletes DST világmodellt szállít: FakeTradingSession, cTrader-hű in-memory Open API session. A stressz suite újrafelhasználja (linked, single source of truth) nem mock, így a szimulált broker úgy viselkedik, mint a valódi.
Mit fedez fel
Copy trading (elsődleges fókusz)
Meghajtva a CopyDstWorld-ön keresztül (tests/StressTests/CopyTrading/), valódi CopyEngineHost-ot futtat fake session ellen, konzisztens forrás munkaterhelést bocsát ki:
| Scenario | Stresses |
|---|---|
Mass_fan_out… | 1 forrás → 80 cél, 150 nyitás majd zárás; teljes fan-out + drain |
High_frequency_open_close… | 300 gyors interleaved open/close; nincs kiszivárgott pozíció |
Partial_close_and_scale_in_storm… | partial-close + scale-in churn; label-set stabilitás |
Connection_flap_storm… | ismételt socket disconnect/reconnect + mid-flight desync; resync konvergencia |
Order_rejection_cascade… | egy részhalmaz minden ordert elutasít; az egészséges célok érintetlenek, majd öngyógyítanak resync-en át |
Token_rotation_storm… | gyors in-place token swap-ek egy order storm alatt |
Randomized_chaos_workload… (10 seeds) | a DST mag — minden esemény típus + minden fault előre nem láthatóan interleaving-elve |
CopyLeaseReclaimStressTests | node halál + lease reclaim egy skálázott klaszteren (tiszta domain, FakeTimeProvider) |
Konvergencia invariáns. Nyugalomban minden egészséges cél pontosan tükrözi a még-nyitott forrás pozíciók halmazát — nincs orphan, semmi nem hiányzik. Assert-elve a label halmazán (a scale-in legitim módon megnyit egy második cél pozíciót ugyanazon forrás label alatt, így a duplikált labelek vártak). Az aktuálisan elutasító célok megengedhetik a lag-et, egyeztetve, amint meggyógyult.
Lease invariáns. Egy klaszterben, ahol node-ok meghalnak + felelevenednek egy seedelt ütemterven, legfeljebb egy node valaha birtokol érvényes lease-t egy profilon; a halott node lease-je pontosan a lejáratkor lakul el, reclaim-elt; az egészséges klaszter minden profil minden profilja pontosan egy node által birtokolt állapotban settles. Tükrözi a CopyEngineSupervisor's claim predikátumát a CopyProfile domain lease metódusai ellen.
A harness thread-safety-ja
FakeTradingSession single-threaded; a stressz munkaterhelés őt módosítja a teszt szálról, miközben a host olvas/ír a saját loop-jából. A SyncTradingSession wrap-eli, atomi működést végez minden session műveleten egy kapun (anélkül, hogy a kaput tartaná a reconnect callback-en át — invertálná a lock sorrendet a host _stateGate-jével és deadlock-olna). A szimulátor maga érintetlen marad.
Megtalált hibák
CopyEngineHost-ban az indítási resync verseny. AzOnReconnectedaz első referencia-betöltés + első resync előtt volt huzalozva, amely a_stateGatenélkül futott. Socket flap az indítás alatt második resync-et futtatott konkurrensen, korruptálva a host nem-konkurrens state dict-jeit (_symbolDetails,_sourceVolumes). Javítva: az indítási betöltés + első resync a kapun alatt fut. Produkciós versenyhelyzet, nem teszt artifakt — a DST chaos munkaterhelés a felszínre hozta.
Futtatás
dotnet test tests/StressTests/StressTests.csproj
A suite serializált ([assembly: CollectionBehavior(DisableTestParallelization = true)]): minden teszt elforgat egy élő host background loop-ot, hajt a quiescence-ig wall clock alatt, így a párhuzamos futtatás megéhezteti a host task-okat és a konvergencia timeout-okat flaksyává teszi. A munkaterhelések másodpercek alatt befejeződnek, így a suite a default green gate-ben marad. A hiba kiprinteli a seed-jét; futtasd újra azt a seed-et a pontos interleaving reprodukálásához.
Bővítés
- Új másolási viselkedés → add hozzá a forrás op-et a
CopyDstWorld-höz (tartsd a forrás könyv tagságát konzisztensen az event stream-mel) + súlyozott eset aCopyChaosDstTests-ben. Ha létrehozhat vagy nyugdíjazhat egy cél pozíciót, győződj meg, hogy a konvergencia invariáns még mindig fennáll. - Új hiba → add hozzá az injectort a
CopyDstWorld-höz (delegate toFakeTradingSession's control surface viaSyncTradingSession) + gyakorold egy named scenario-ban plusz a chaos mix-ben. - Tartsd a szimulátort cTrader-hűnek (lásd root
CLAUDE.mdmandátum); soha ne gyengítsd, hogy egy stressz teszt átmenjen.