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生成的只能是像'(图 随机路径列表)'这样的成对元。

只要算法能按预期工作,这还是有用的。然而,一旦它失败了,就很难弄清楚是哪个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

我仍然不确定嵌套属性会是什么样子。您能否按照您期望的嵌套属性方式来编写代码?这将涉及至少两个全局变量。

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