2024 Clojure现状调查中分享您的想法!

欢迎!请访问关于页面获取有关如何工作的更多信息。

0
test.check

为了支持嵌套属性的功能,以下是一个实现的例子:

`
(defn exists?
[e coll]
(some #{e} coll))

(defn remove-elem
[e coll]
(remove #{e} coll))

;; 此测试应失败,并说明嵌套属性的情况
(quick-check (for-all [v (gen/vector gen/int)]

           (for-all [e (elements v)]
             #(exists? e (remove-elem e v)))))

`

这个需求是支持对属性的再实现,但目前尚未实现。

(链接:https://github.com/reiddraper/simple-check/issues/10 文本:原始问题 - GitHub #10)

12个答案

0

评论由:maciej.jaskowski

这个问题的状态如何?
以下情况能极大地帮助我们:我想验证我的路径查找算法是否能找到图G中的最优解,因此我生成图和一些随机路径并检查是否所有随机路径都比算法找到的路径“次优”。

希望有嵌套的for-all将更加简单。有其他方法吗?

0

评论由:reiddraper

很抱歉这里没有更新。嵌套属性在我这边还处于某种“悬停”状态。好消息是它们非常方便,你可以通过使用{{clojure.test.check.generators/bind}}实现同样的效果。你可以在这里看到如何使用{{bind}}的示例(链接:https://github.com/clojure/test.check/blob/v0.5.8/doc/generator-examples.md#a-vector-and-a-random-element-from-it 文本:这里)。

0

评论由:maciej.jaskowski

显然我还需要更多信息,因为使用 gen/bing(顺便说一下)生成的所有东西都只是 `(graph list-of-random-paths)` 这样的对。

只要算法按预期运行,这还是有用的。然而,一旦它失败了,就很难确定哪个 random-paths 导致了失败。

0

评论由:reiddraper

你能给我展示一下如何用嵌套属性编写测试吗?然后也许我能帮助你将其重写为使用 {{bind}}?

0

评论由:maciej.jaskowski

太好了(图片:谢谢)

请,查找以下最重要的部分。

`
(defn gen-matrix-and-paths [size]

(gen/bind
  (gen-matrix gen/s-pos-int size)
  (fn [matrix]
    (let [ nodes (into [] (range (count matrix)))
           gen-perms (gen-permutations nodes)
           perms (distinct (gen/sample gen-perms 500)) ]
      (gen/tuple 
        (gen/return matrix) 
        (gen/return perms))))))

`

gen-matrix 生成一个平方矩阵的生成频率,例如 (链接:[0 1) (链接:4 0)]
gen-permutations 为提供的向量生成排列

0

评论由:reiddraper

我困惑了。你遇到了什么问题?你粘贴的代码使用 {{bind}},而不是嵌套属性。

0

评论由:maciej.jaskowski

好吧,但现在我只能写类似这样的东西

`
(prop/for-all [data (gen-matrix-and-paths 6)]
(let [ [matrix random-paths] data ]

 (not-worse-then-others? tsp matrix random-paths))))

`

这,如果我的 'tsp' 算法不正确,会指向一个矩阵和一个长度为 500 的路径向量中的一个反例。如果我能得到一个矩阵和一个单独的反例会更好。

0

评论由:reiddraper

我还是不确定这个看起来是什么样子,如果我们使用嵌套属性。你能按你希望看到的方式以嵌套属性写代码吗?这至少需要两次 for-all。

0

评论由:maciej.jaskowski

当然!

我想写点类似的东西

`
(prop/for-all [matrix (gen-matrix 6)]
(prop/for-all [random-path (gen-random-path matrix)]

(<= (cost (tsp matrix)) (cost random-path))))

`

0

评论由:maciej.jaskowski

ping!

0

评论由:reiddraper

好吧,让我们将其翻译为使用 {{gen/bind}}。就像嵌套属性一样,{{bind}} 允许你创建依赖于另一个生成器 的生成器。例如,你的 {{gen-random-path}} 依赖于之前生成的 {{matrix}} 变量。所以让我们编写一个返回一个 {{matrix}} 和一个 {{random-path}} 的生成器。

`
(def matrix-and-path
"返回一个包含 [matrix random-path] 的二元组"
(gen/bind (gen-matrix 6)

        (fn [matrix]
           (gen/tuple (gen/return matrix) (gen-random-path matrix)))))

(prop/for-all [[matrix random-path] matrix-and-path]
(<= (cost (tsp matrix)) (cost random-path))
`

0
参考: https://clojure.atlassian.net/browse/TCHECK-7 (由 hypirion 提出)
...