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

欢迎!请参阅关于页面以获取更多有关此工作方式的信息。

0
test.check
如果生成器输出的值包括尝试次数和时间作为元数据,这对于优化生成测试(具有规格说明)非常有用。
示例

(-> (s/exercise string? 1)
    first
    meta)
;; => {:time-ms 2, :attemts 1}

这有助于找到最慢的生成器,这些生成器可以从定制中获得最大好处。

12个答案

0
评论由: alexmiller

我将其移动到test.check,因为生成器就在那里。

请注意,并非每个值都可以携带元数据(数字、字符串等),但这是一个有趣的想法。
0
评论由: jare_

> 请注意,并非每个值都可以携带元数据(数字、字符串等),但这是一个有趣的想法。

由于元数据主要用于递归/嵌套规格说明,这对于规格工具开发人员非常直接有用,这不是什么大问题。想要使用它的个人可以通过包装基本数据类型来克服限制。

对于最终用户API,类似于spec/explain(s/explain-data,s/explain-str)的东西会很棒。
我将它称为s/complexity,该函数接收一个规格说明,并返回与原始规格相同形状的结构(在s/complexity-data的情况下),并用生成复杂度数据(平均时间、尝试次数、mb规格形式)填充。它应该以合理的方式处理复杂的规格说明,即:
0

评论者:jare

此外,可能需要为每个节点(spec 元素)配置一个超时时间(可配置),因为它是主要的调试/性能分析工具。

0

评论者:gfredericks

这里“尝试”是什么意思?它是否仅适用于 {{gen/such-that}} 生成器?

0

评论者:jare

是的,在 spec 的上下文中。生成器需要尝试多少次才能满足 spec。

0

评论者:gfredericks

我刚刚注意到 {{:time-ms}} 这个方面,它很可能不仅适用于 {{such-that}},还适用于更多情况。

我同意能够轻松地调试生成器性能是有用的, but 我觉得这种方法如何应用于一些组合器,比如 {{gen/fmap}} 和 {{gen/bind}},并不明显。如果我有一个更具体的建议,包括这些情况的详细说明,我会更容易理解。

0

评论者:jare

注:我认为这种方法如何应用于像 gen/fmap 这样的组合器并不明显。

元数据不应从 {{gen/fmap}} 应用的函数内部访问。相反,函数内部的时间和性能统计数据应与 {{gen/fmap}} 输入的数据关联,并附加到输出。因此,数据将通过嵌套 {{gen/}} 调用之间的上下文传递。

注:元数据不应从 {{gen/fmap}} 调用的函数内部访问。

或者,您可以允许检查输入统计信息,但不能更改它。我不确定这一点。这可能太复杂了。

0
评论由: jare_

实际上,如果你允许窥视,那么它不仅可以用于调试,还可以用于调整生成以改善性能。
为了摊销累积生成器的复杂度,通过切换路由来满足某些截止日期。

- - - - -

@gfredericks 由于某种原因,我无法向任何问题添加新评论,所以我更新了旧的那个。

关于


(def g1 ...)

(def g2 (gen/fmap f g1))


_复杂度_函数应该输出



(complexit g1) => {:name <generator-name> :time-ms 10}

(complexit g2) => {:name :fmap :time-ms 5 :args [{:name <generator-name> :time-ms 10}]}


这里 _:time-ms 5_ 表示在 _f_ 函数内部所花费的时间。
0

评论者:gfredericks

例如,假设我有

`
(def g1 ...)

(def g2 (gen/fmap f g1))
`

当我从 {{g2}} 中生成一个值时,我会得到什么信息?这将是关于 {{g1}}、关于 {{f}},还是关于它们的某种组合吗?

0

评论者:gfredericks

(链接: ~JAre) 我认为你的评论权限已修复。

好的,我可以看到这可能是一个定义良好的概念。但这可能需要相当大的工作量,并且我希望确保不会出现重大的性能差异。如果存在的话,我们可能希望有一个默认关闭的方式,并确保即使在关闭时也不会有性能损失。

0

评论者:jare

现在可以工作了。谢谢。

0
参考:[https://clojure.atlassian.net/browse/TCHECK-153](https://clojure.atlassian.net/browse/TCHECK-153) (由 alex+import 报告)
...