Examples¶
Testing scenario map¶
Test objective |
Primary decorators |
Suggested script |
|---|---|---|
HTTP client resilience |
|
|
Async HTTP client |
|
|
TCP protocol client |
|
|
UDP protocol client |
|
|
Throughput testing |
|
|
End-to-end test run |
|
|
Pattern: deterministic baseline first¶
Start with fixed latency or timeout before adding randomness:
import faultcore
def test_deterministic_latency_baseline() -> None:
@faultcore.latency("50ms")
def baseline() -> str:
return "ok"
assert baseline() == "ok"
Then add jitter/loss in a second scenario to isolate the source of failures.
Pattern: one fault family per test¶
Avoid mixing many fault types in a single test initially. Build confidence in layers:
Timeout-only behavior
Throughput-only behavior
Loss/reorder behavior
Combined scenario
Pattern: reusable policy profiles¶
import faultcore
def test_reusable_mobile_3g_profile_registration() -> None:
faultcore.register_policy(name="mobile_3g", latency="150ms", jitter="40ms", packet_loss="1%", rate="2mbps")
assert "mobile_3g" in faultcore.list_policies()
Use faultcore.fault("mobile_3g") in multiple tests to maintain consistency.
Pattern: explicit assertions¶
For each testing scenario, assert one primary behavior:
timeout raised
retry path executed
fallback endpoint used
total duration within expected budget
Example: HTTP client test¶
import faultcore
def test_http_client_profile_stack() -> None:
@faultcore.timeout(connect="250ms", recv="800ms")
@faultcore.packet_loss("1%")
def call_http_api() -> dict[str, str]:
return {"status": "ok"}
assert call_http_api()["status"] == "ok"
Example: TCP protocol client test¶
import faultcore
def test_tcp_ordering_and_partial_transfer_profile() -> None:
@faultcore.packet_reorder(prob="20%", max_delay="25ms", window=3)
@faultcore.half_open(after="16kb", error="reset")
def exchange_tcp_frames() -> str:
return "ok"
assert exchange_tcp_frames() == "ok"
Example: UDP protocol client test¶
import faultcore
def test_udp_loss_and_burst_profile() -> None:
@faultcore.packet_loss("3%")
@faultcore.burst_loss("4")
def send_udp_datagrams() -> str:
return "ok"
assert send_udp_datagrams() == "ok"