我们可以将快速检查过程视为一个状态机,其状态流转类似于
`
started
v
尝试,尝试,[...]
v
成功 | 失败
v
shrinking, shrinking, [...]
v
shrunk"
`
过程开始,基于生成的值运行试验,要么成功,要么失败。如果成功,则过程结束。如果失败,那么它将运行成功的参数的连续缩小直到达到终端缩小状态。
以这种方式对过程进行建模,我们可以在过程的有趣点上调用step-fn,这有两个目的
- 向用户反馈关于过程的信息(通过副作用)
- 修改/增强过程跟踪的状态,使得实现如优雅地终止完成前的过程、在生成的值上计算统计数据(TCHECK-87)、添加时间戳(TCHECK-8、TCHECK-95、TCHECK-96)等变得容易。
附带的补丁旨在100%向后兼容。添加了新的{{clojure.test.check2/quick-check}}函数。"旧"的{{clojure.test.check/quick-check}}通过调用新的函数重新实现,通过将reporter-fn提升为step-fn,并通过(reporter-fn->step-fn)适配器函数维护所有当前行为。
编辑:添加了另一个补丁(TCHECK126-test.check-refactor.patch),它对c.t.c/quick-check
进行"就地"重构,而不是添加新的test.check2命名空间。最重要的变化是从reporter-fn切换到step-fn,这给了通过将步长函数的反馈改变传输回快速检查状态的可能性(作为步长函数的返回值)。