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,这些:labels包含在:complete报告中,以便计算统计数据。

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

0

由 gfredericks 发表的评论:

需要考虑的事项:

  • 这些统计数据仅取决于参数,因此是否有必要将整个属性包装起来?
    不过 Haskell 是这样做的
  • 另一方面,我喜欢统计信息作为一个特定实例的想法,它是{{check}}命名空间通用特征的组成部分,但我们目前的实现并没有完全达到这一点,因为我们在{{check}}命名空间中有大量标签内容
  • 但是移动它很困难,因为如果{{check}}只公开通用的reduce功能,那么直接访问{{quick-check}}的用户将需要提供两个东西 - 一个包装好的属性和适当的reduce函数
0

评论作者:nberger

上传了一个新的补丁,该补丁利用了新的 reporter-fn 机制。

在这个新的补丁中,一些内容被简化了。

  • 删除了新定义的 * } var,该变量原本将作为启用和禁用每个测试的统计数据打印的方式。现在,default-reporter-fn 只会在结果映射中存在标签时打印统计数据。要避免打印统计数据,只需要使用一个不打印统计数据的不同 :reporter-fn。
  • 在统计数据报告中,现在只打印带有标签的行。在先前的版本中,有一个包含“无标签”试验百分比的行。我现在移除了它来减少冗余。

此外,还增加了文档字符串,确保统计数据在 clojurescript 和其他小改进中正常工作。

0

评论作者:nberger

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

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

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

根据我的理解,Haskell QuickCheck(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

由 gfredericks 发表的评论:

讨论后,我的直觉是 2 和 5 是最自然的,也许可以将 2 命名为 {{collect}} 以反映 Haskell 版本的命名。

我们谈论了将 {{nil}} 视为在 {{collect}} 中不标记的标志,但我不太喜欢这个想法。

0

由 gfredericks 发表的评论:

我也应该注意到这一点可能与我为了解决 confluence 页面上的“Test Failure Feedback”问题所做的更改重叠:http://dev.clojure.org/display/design/test.check

0

由 gfredericks 发表的评论:

我也应该注意到这一点可能与我为了解决 confluence 页面上的“Test Failure Feedback”问题所做的更改重叠:http://dev.clojure.org/display/design/test.check

0

评论作者:nberger

bq. 我们讨论了将 nil 视为在 collect 中不标记的标志的可能性,但我不太喜欢这个主意。

也许我们可以使用一个命名空间关键字来表示应该忽略标签?例如 {{clojure.test.check.stats/ignore}}。这样我们就可以通过创建一个在 pred 不匹配时返回 {{stats/ignore}} 的函数,在 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

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

...