【发布时间】:2014-10-08 18:42:23
【问题描述】:
Clojure 有许多用于生成测试的库,例如 test.check、test.generative 或 data.generators。
可以使用高阶函数来创建可组合的随机数据生成器,例如:
(defn gen [create-fn content-fn lazy]
(fn [] (reduce #(create-fn %1 %2) (for [a lazy] (content-fn)))))
(def a (gen str #(rand-nth [\a \b \c]) (range 10)))
(a)
(def b (gen vector #(rand-int 10) (range 2)))
(b)
(def c (gen hash-set b (range (rand-int 10))))
(c)
这只是一个示例,可以使用不同的参数、过滤器、部分等进行修改,以创建非常灵活的数据生成函数。
任何生成库都可以做的事情是不是也可以通过组合一些高阶函数来简洁地实现(或更多)?
作为对 stackoverflow 诸神的附注:我不认为这个问题是主观的。我不是在征求关于哪个图书馆更好的意见。我想知道任何/所有数据生成库的特定功能或技术将它们与组合普通高阶函数区分开来。一个示例答案应该说明使用任何库生成随机数据,并解释为什么按照我上面说明的方式编写 HOF 会更复杂。
【问题讨论】:
标签: clojure generative-testing