用途:把代码中的非确定性输入视为依赖并加以注入,使测试与失败可复现。资料指出需要注入的来源共七类:时间、睡眠/超时、随机性、ID 生成、迭代顺序、并发调度,以及环境(locale、时区、环境变量、工作目录)。各注入点的形态与测试写法见 references/seams.md。
系统级约束:确定性取决于最不确定的组件,每个随机与时间来源都必须经过注入点,否则某个库自带的 RNG 流会重新引入不可控输入并破坏整次运行的重放。该约束会随时间衰减,需用检查来守门。
检查工具:scripts/unseamed_calls.py 可扫描 Python、JS/TS、Go、Rust、Java 中直接的时钟、睡眠、随机、UUID 与环境调用,忽略注释、文档字符串、测试及标记 allow-unseamed 的行,并将声明注入点内的命中单独报告。用法示例:
python3 scripts/unseamed_calls.py --seam src/pkg/time_source.py python3 scripts/unseamed_calls.py --seam src/pkg/time_source.py --strict
默认只警告不失败,需加 --strict 才在 CI 中拦截;建议先调整 --seam/--allow 使结果准确,再开启门禁。
例外与边界:安全随机数是唯一不经注入的例外,密钥、令牌和 nonce 必须直接读取操作系统熵池,走 os.urandom 与 secrets 模块(token_bytes、token_hex、token_urlsafe、choice)或平台等价物,脚本对这二者豁免。诚实边界包括:注入点是视野边界,模拟替换的抽象层之下(真实数据库触发器与约束、真实 broker 重平衡、内核调度器)不可见,需用真实一致性测试覆盖替代品保真度;一旦字节级重放成为属性,破坏同种子同运行的变化应视为破坏公开契约;生产环境仍使用真实来源,注入点的价值在于可观察、可注入、可记录。
适用场景:测试抖动或依赖时序、需要按种子重放失败、需要强制交错以复现竞态、需要两个实现看到完全一致输入的差分运行。相关技能包括 reproduce-then-fix、fewer-tests-more-proof、dependency-diligence、ratchet-what-you-build、reading-isnt-proof。资料未提供价格、平台支持范围等其它信息。