← 中文资源

简体中文版本

确定性的重试测试台

用预设结果脚本与虚拟时钟驱动重试逻辑,记录每次尝试的位置与结果,无需真实等待即可断言重试行为。

阅读英文原文

功能说明

用真实定时器测试重试会让用例变慢且不稳定,重试缺陷容易被忽略。createHarness 接收一串预设结果和可注入的时钟,返回的 loader 每次调用按顺序消费一个结果并记录尝试日志,exhausted 用来判断脚本是否已经用完。重试策略接收同一个时钟,延迟因此变成虚拟时间,断言可以精确到第几次尝试与耗时。

关键代码

Outcome 是以 ok 区分的联合类型,ok 与 fail 两个辅助函数分别构造成功值与带 Error 的失败值。AttemptLog 保存 index、at 与 result。createHarness 内部的 loader 返回 Promise,在 executor 中读取 script[index],把 index、clock.now() 与结果写入 attempts,然后递增下标并按结果 resolve 或 reject。exhausted 通过比较下标与脚本长度得出。

const outcome = script[index];
attempts.push({ index, at: clock.now(), result: outcome.ok ? "ok" : "error" });
index += 1;
if (outcome.ok) resolve(outcome.value);
else reject(outcome.error);

使用注意

脚本耗尽后继续调用会读到 undefined,代码没有做保护,调用方应先用 exhausted 判断,或在自定义 loader 中补上兜底。示例的时钟只提供 now 与 setTimeout 两个方法,测试用的伪时钟在 setTimeout 中推进时间而不真正调度回调。脚本按同步顺序回放,不模拟并发请求与随机故障。它只负责提供结果,不实现退避或重试次数策略。

验证方式

用 node:test 运行随附测试:脚本设为两次失败后成功,连续调用三次,断言结果是错误、错误、成功,且 attempts 的结果序列一致;单结果脚本调用一次后 exhausted 为 true;再检查 attempts 的 index 是否为 0、1、2。