问题标签 [test.check]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
clojure - 如何以受约束的顺序为一系列操作创建 test.check 生成器?
作为两个生成器的示例:
ACTIONS
是一个映射,其中键是操作的名称,值是该操作的(或基于)依赖项。举个例子,你必须:create-new-user
先做任何事,你必须:create-new-board
先做:edit-board
,你必须至少有一个:create-new-*-comment
,然后才能做:edit-comment-text
。
上面的代码似乎工作,但它是丑陋的。1)我不喜欢filter-actions-into-logical-order
代码必须有一个特定的例外:create-new-user
。2)我不喜欢这样,我基本上是在随机操作列表中,并对其进行过滤,直到这些操作变得有序为止。
我想知道其他人如何使用 test.check 生成这样的一系列动作?当然必须有一种方法可以只使用生成器吗?
clojure - 如何在 Clojure 中生成可以与 test.check 一起使用的 UUID
生成式测试似乎很有趣,但我需要生成随机 UUID 作为测试的一部分。java.util.UUID/newRandom 对 test.check 缩小效果不佳。
Java 代码如下所示:
翻译成 Clojure 比看起来更棘手。
如何在 Clojure 中编写一个可以成功收缩的随机 UUID 函数?
clojure - 使用 test.check 生成排序数据
我想使用 test.check 来生成表单的排序时间序列数据
[ [timestamp value] [timestamp value] ..]
其中时间戳,值对按时间戳升序排列。
我可以轻松地以随机顺序生成此类数据
(gen/tuple timestamp gen/int)
timestamp
例如在哪里(gen/choose 1412664660 1423419720)
我应该如何生成排序数据?
unit-testing - 如何使用 test.check 生成具有特定属性(如 stddev)的集合
我想使用 clojure 的test.check
库来生成可以做一些简单统计的集合,比如计算平均值、标准差、置信区间等等。
如何生成集合,以便它们具有这些属性的预定值?
clojure - test.check 生成具有不同节点类型的树
我想生成具有不同节点类型的树。对于每个节点类型,都有可能成为该节点子节点的节点类型的不同可能组合。任何节点类型都可能没有子节点。
recursive-gen
从本质上迫使我从里到外构建树,从一个叶生成器开始,该生成器生成一个没有子节点的任何类型的节点。从子生成器创建生成器的函数本质上必须生成所需的父节点类型并such-that
在子生成器上使用,直到它生成所需的子节点类型。这通常会导致运行时错误,说such-that
在 10 次尝试后失败。
由于无法从父生成器参数化子生成器,有哪些替代选项?
clojure - test.check 生成一定长度的字符串
在使用 test.check 时,我需要一个生成器来生成一定长度的字符串。电话号码、邮政编码、社会安全号码都是此类数据的示例。尽管这些示例似乎只是数字,但我的问题是一般的字符串。
clojure - test.check 中的循环和状态管理
随着 Spec 的引入,我尝试为我的所有函数编写 test.check 生成器。这对于简单的数据结构来说很好,但对于具有相互依赖的部分的数据结构来说往往会变得困难。换句话说,然后需要在生成器中进行一些状态管理。
拥有 Clojure 的循环/递归或归约的生成器等效项已经非常有帮助,因此在一次迭代中产生的值可以存储在某个聚合值中,然后在后续迭代中可以访问。
需要这样做的一个简单示例是编写一个生成器,用于将集合拆分为恰好 X 个分区,每个分区具有零到 Y 之间的元素,然后将元素随机分配给任何分区。(注意
test.chuck
'partition
函数不允许指定 X 或 Y)。如果您通过循环遍历集合来编写此生成器,那么这将需要访问在先前迭代期间填充的分区,以避免超过 Y。
有人有什么想法吗?我发现的部分解决方案:
test.check
let
并bind
允许您生成一个值,然后稍后重用该值,但它们不允许迭代。tuple
您可以使用和函数的组合遍历先前生成的值的集合bind
,但这些迭代无权访问先前迭代期间生成的值。(defn bind-each [k coll] (apply tcg/tuple (map (fn [x] (tcg/bind (tcg/return x) k)) coll))
您可以使用原子(或挥发物)来存储和访问在先前迭代期间生成的值。这可行,但非常不符合 Clojure,特别是因为您需要
reset!
在返回生成器之前使用 atom/volatile,以避免它们的内容在生成器的下一次调用中被重用。生成器因其
bind
和return
函数而类似于 monad,这暗示了将诸如 Cats 之类的 monad 库与 State monad 结合使用。但是,State monad 在 Cats 2.0 中被删除(因为据称它不适合 Clojure),而我知道的其他支持库没有正式的 Clojurescript 支持。此外,在他自己的库中实现 State monad 时,Clojure 的 monad 专家之一 Jim Duey 似乎警告说 State monad 的使用与 test.check 的收缩不兼容(参见http://www. clojure.net/2015/09/11/Extending-Generative-Testing/),这大大降低了使用 test.check 的优点。
clojure - test.check 中的函数生成器
我想为函数制作一个生成器。
我注意到确实有IFn
值的生成器,但是当函数域是无限的(并且由于值是严格的)时,将它们用作函数的生成器通常是不切实际的。
这个功能是否存在或者我必须自己实现它?