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 ...)包括整个结果图,以便reporter-fn有机会“保存”此状态,但这种方法看起来并不优雅...

0 投票

由 gfredericks 发布的评论

需要考虑的事项

  • 统计信息仅是参数的函数,所以是否需要将整个属性包裹?
    不过 Haskell 实现了这一点
  • 另一方面,我喜欢统计信息是一种 {{check}} 命名空间的通用功能的特定实例的想法,但当前的实现并没有完全实现这一点,因为我们有大量的标记内容在 {{check}} 命名空间中
  • 但是很难将其移除,因为如果 {{check}} 只暴露了一个通用的 reduce 功能,那么直接访问 {{quick-check}} 的用户将必须提供两件事 - 一个包裹的属性和适当的 reduce 函数
0 投票

评论人:nberger

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

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

  • 删除了新的 * } var,它将用作启用/禁用每个测试统计信息打印的方式。现在默认报告函数仅在有结果映射中存在标签时打印统计信息。要打印统计信息,只需使用一个不打印统计信息的不同 :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}} 返回一个真值时应用 {{label-fn}}。例如:(classify prop count #(> (count %) 1)) - 当计数大于 1 时分配计数的标签
  4. {{(classify prop pred)}}: 使用的参数向量作为标签,但仅当 {{pred}} 返回一个真值时。例如:(classify prop #(<= (count %) 1)) - 当计数小于或等于 1 时分配计数的标签
  5. {{(classify prop pred label)}}: 这是目前签名。仅当 pred 返回真值时分配标签

因此,我考虑将签名更改为接收可能的键的映射:{{(: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页面上“测试失败反馈”问题相关的更改重叠: http://dev.clojure.org/display/design/test.check

0 投票

由 gfredericks 发布的评论

我还应该记住,这可能与管理Confluence页面上“测试失败反馈”问题相关的更改重叠: http://dev.clojure.org/display/design/test.check

0 投票

评论人:nberger

bq. 我们曾讨论过也许将nil作为collect中不标记的标志,但我不太喜欢这个想法。

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

`
(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 投票
by

评论人:nberger

添加了一个新的补丁TCHECK87-add-stats-feature-2.patch,它是基于当前主分支重新构建的。我认为这不是最终版本(我希望找到一种方法来避免将标签功能等污染主quickcheck循环,例如),但它可能正在逐步接近。

0 投票
by

评论人:nberger

添加了一个新的补丁TCHECK87-add-stats-feature-3.patch,它是基于当前主分支并进行了一些合并的提交。同时解决了ClojureScript中的print-stats测试。

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

这个补丁遇到了什么问题吗?

...