我们可以将quick-check过程视为一个具有如下状态流的状态机:
`
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,这提供了通过向quick-check状态(作为step-fn的返回值)回传更改来驱动/增强quick-check过程的可能性。