| """A/B traffic Splitter.""" | |
| from __future__ import annotations | |
| from mindxtrain.deploy.ab_test import AbConfig, Splitter | |
| def test_zero_canary_pct_always_live(): | |
| s = Splitter(AbConfig(canary_pct=0.0)) | |
| for i in range(100): | |
| assert s.pick(f"r-{i}") == "live" | |
| def test_full_canary_pct_always_canary(): | |
| s = Splitter(AbConfig(canary_pct=1.0)) | |
| for i in range(100): | |
| assert s.pick(f"r-{i}") == "canary" | |
| def test_deterministic_per_request_id(): | |
| s = Splitter(AbConfig(canary_pct=0.5)) | |
| a = s.pick("request-42") | |
| b = s.pick("request-42") | |
| assert a == b | |
| def test_split_distribution_roughly_canary_pct(): | |
| s = Splitter(AbConfig(canary_pct=0.2)) | |
| n = 2000 | |
| canary = sum(1 for i in range(n) if s.pick(f"req-{i}") == "canary") | |
| # 20% +/- a generous band. | |
| assert 0.10 * n <= canary <= 0.30 * n | |