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
by

评论由:maciej.jaskowski

显然我还需要更多提示,因为我使用gen/bing生成(顺便说一句)都是形如 '(graph list-of-random-paths)' 的对。

只要算法按预期工作,这就有用了。然而,一旦它失败,就很难找出哪个random-paths失败了。

0
by

评论由:reiddraper

你能告诉我如何用嵌套属性编写测试,然后或许我可以帮你将其重写为使用 {{bind}} 吗?

0
by

评论由: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
by

评论由:reiddraper

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

0
by

评论由:maciej.jaskowski

好的,但现在我只能写出这样的东西

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

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

`

这会是指向我 eines 一个矩阵和一个长度为500的路径向量(其中一个是反例)。如果能得到矩阵和一个反例就更好了。

0
by

评论由:reiddraper

我还是不确定嵌套属性应该是什么样子。你能按你希望的编写代码,以嵌套属性的形式呈现吗?这将至少涉及两个for-alls。

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 报告。
...