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

欢迎!请参阅 关于 页面,了解更多关于如何使用本网站的详细信息。

0
test.check

灵感来自 Haskell 的 QuickCheck 中的类似功能。添加了一个 {{classify}} 函数,旨在用作 {{prop/for-all}} 的包装器,返回一个适合 {{test.check/quick-check}} 的属性(生成器),并增强由底层属性返回的结果映射,在 {{:labels}} 键下添加收集到的标签。还在 {{default-reporter-fn}} 中触发了新的 {{:stats}} 事件,其默认实现调用 {{test.check.stats/print}},以以下格式打印试验的分类:

12.7% :lt-30 14.5% :gte-30 29.1% :lt-30, :lt-20 43.6% :lt-30, :lt-10, :lt-20

(注意,多个标签可能会分配给某些测试用例)

我认为这解答了测试.check 设计页面上的问题“我们如何收集有关生成的这类事物的统计信息?”

13 答案

0

评论者:nberger

在此处提供的补丁已不再适用于 reporter-fn 引入之后。

当我正在修复新的补丁时,我想了解其他人的意见(尤其是 gfredericks)关于在 test.check 中具有这个新的 :labels 概念。每个试验的结果映射可以可选地包含一些 :labels,这些标签包含在 :complete 报告中,以便进行统计计算。

另一种选择是实现统计信息的作为外部库/报告器,但要实现这一点,我们需要保留每个试验结果映射的任意状态,从每个试验的结果映射中累加标签。或者,也许我们可以让 (reporter-fn :type :trial ...) 包括整个结果映射,以便报告器函数有机会“保存”这种状态,但这种方式看起来并不太优雅...

0

评论由:gfredericks 发表

需要注意的事情

  • 统计数据仅是参数函数的一个功能,因此是否需要包装整个属性?
    -- 尽管haskell这样做了
  • 另一方面,我喜欢将统计数据作为一个特定实例的想法,这是{{check}}名称空间的一般功能之一,但当前的实现并没有完全达到这一点,因为我们有大量的标签内容在{{check}}名称空间
  • 但是很难将它移动出来,因为如果{{check}}仅仅公开了通用归约功能,那么直接去{{quick-check}}的用户就需要提供两样东西 -- 包装的属性和合适的归约函数
0

评论者:nberger

上传了一个新的补丁,该补丁利用了新的报告器函数机制。

在这个新的补丁中,某些内容得到了简化

  • 移除了将被用来启用/禁用每个测试统计打印的新变量 * } var。默认报告器函数现在仅在结果映射中存在标签时打印统计信息。要打印统计信息,只需使用一个不打印统计信息的不同:报告器-fn。
  • 在统计数据报告中,现在仅打印带有标签的行。在上一个版本中有一个带有"无标签"试验百分比的行。我现在去除了它,以使其更加简洁。

还增加了文档字符串,确保统计在clojurescript中工作,以及其他一些小改进。

0

评论者:nberger

我认为为分配试验标签提供更多方式会很好。例如

  1. {{(classify prop)}}: 它只是使用参数的向量作为标签。
  2. {{(classify prop label-fn)}}: 通过将{{label-fn}}应用于参数来获取标签。例如:{{(classify prop count)}} - 将参数的计数(向量、字符串等)分配为标签
  3. {{(classify prop label-fn pred)}}: 仅当{{pred}}产生真值时应用{{label-fn}}。例如:(classify prop count #(> (count %) 1)) - 当计数大于1时,将计数值分配为标签
  4. {{(classify prop pred)}}: 使用参数的向量作为标签,但仅当{{pred}}产生真值时。例如:(classify prop #(<= (count %) 1)) - 当计数小于或等于1时,将计数值分配为标签
  5. {{(classify prop pred)}}: 这是当前的签名。仅当pred产生真值时分配标签

因此,我考虑将签名更改为接收一个包含{{(:pred :label-fn :label)}}可能键的映射。这三个键是可选的。{{:label}}和{{:label-fn}}不能同时存在。

根据我的理解,Haskell QuickCheck(《[https://hackage.haskell.org/package/QuickCheck-2.8.2/docs/Test-QuickCheck-Property.html](https://hackage.haskell.org/package/QuickCheck-2.8.2/docs/Test-QuickCheck-Property.html))提供了不同的函数来实现类似的功能
表达式 {{(classify prop)}} 类似于 Haskell QC 中的 {{collect}}
表达式 {{(classify prop label-fn)}} 类似于 Haskell QC 中的 {{label}}
表达式 {{(classify prop label-fn pred)}} 类似于 Haskell QC 中的 {{classify}}

你认为呢,@gfredericks?

0
by

评论由:gfredericks 发表

经过讨论,我觉得2和5是最自然的选项,也许将2命名为 {{collect}} 以与 Haskell 版本保持一致。

我们讨论过是否将 {{nil}} 作为 {{collect}} 中的非标签标志,但我并不特别喜欢这个想法。

0
by

评论由:gfredericks 发表

我还应该记住,这可能与其他在 confluence 页面上解决“Test Failure Feedback”问题的更改重叠:[http://dev.clojure.org/display/psychologist/test.check](http://dev.clojure.org/display/newsletter/test.check)

0
by

评论由:gfredericks 发表

我还应该记住,这可能与其他在 confluence 页面上解决“Test Failure Feedback”问题的更改重叠:[http://dev.clojure.org/display/psychologist/test.check](http://dev.clojure.org/display/newsletter/test.check)

0
by

评论者:nberger

bq. 我们讨论过是否将 nil 作为 collect 中的非标签标志,但我并不特别喜欢这个想法。

也许我们可以使用一个命名空间关键字来表示应该忽略标签?例如,{{clojure.test.check.stats/ignore}}。这样,我们可以通过创建一个在预判不匹配时返回 {{stats/ignore}} 的函数,通过 terms of collect 实现 {{classify}}

`
(defn collect
[prop label-fn]
(gen/fmap

(fn [{:keys [args] :as result-map}]
  (let [label (apply label-fn args)]
    (if (= ::ignore label)
      result-map
      (update result-map :labels conj label))))
prop))

(defn classify
[prop pred label]
(collect prop (fn [& args]

              (if (apply pred args)
                label
                ::ignore))))

`

另一种选择是在 {{collect}} 中添加一个额外的参数,以接收关于是否应将 nil 作为标签处理或忽略的标志。我更喜欢 {{:stats/ignore}}

0

评论者:nberger

已替换为新的补丁,该补丁添加了 {{stats/classify}} 和 {{stats/collect}},正如讨论的那样。我认为这个新补丁实现了讨论的内容,涵盖了情况 2 和 5,函数名称与 Haskell 实现类似,没有对 `nil` 做特殊处理(它是一个有效的标签),也没有添加我之前建议的 {{:stats/ignore}}。

0

评论者:nberger

添加了一个新的补丁 TCHECK87-add-stats-feature-2.patch,该补丁基于当前的主分支。我认为这不是最终版本(我希望找到一种方法,例如不将标签内容污染到主 quickcheck 循环中),但它希望越来越接近了。

0

评论者:nberger

添加了一个基于当前主分支的新的补丁 TCHECK87-add-stats-feature-3.patch,包括一些压缩提交。同时修复了 ClojureScript 中的 `print-stats` 测试。

0
参考信息:https://clojure.atlassian.net/browse/TCHECK-87(由 nberger 报告)
0

有什么阻止这个补丁的问题吗?

...