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

欢迎!请参阅 关于 页面获取更多有关此是如何工作的信息。

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

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

这有助于找到最慢的生成器,这些生成器可以通过自定义获得最大的好处。

12 答案

0
_ 评论由: alexmiller_

我将此移至 test.check,因为生成器就在那里。

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

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

这不是什么大问题,因为元数据将主要对 spec 工具的开发者直接有用。那些想用这个功能的可以绕过限制,通过包装基本类型。

对于最终用户 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}}。

我同意能够轻松地调试生成器性能很有用,但我不认为这种方法明显适用于一些组合器,如{{gen/fmap}}和{{gen/bind}}。我更乐意考虑一个更具体的提案,该提案包括那些情况的详细信息。

0

评论者:jare

bq.但我不认为这种方法明显适用于一些组合器,如gen/fmap

元数据不应该从{{gen/fmap}}应用到的函数内部提供。相反,应在函数内部消耗的时间和性能统计信息与{{gen/fmap}}输入统计信息关联起来,然后再将其附加到输出。因此,数据将通过嵌套{{gen/}}调用之间的上下文传递。

bq.元数据不应该在{{gen/fmap}}呼叫的函数内部可用。

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

0
by
_ 评论由: 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
by

评论者:gfredericks

例如,假设我有

`
(def g1 ...)

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

当我从 {{g2}} 生成值时,我会得到什么信息?是关于 {{g1}}、关于 {{f}},还是两者都有的信息?

0
by

评论者:gfredericks

(链接: ~JAre) 我相信您的注释权限已修复。

好的,我可以看到这可能是一个明确定义的概念。但这将是一项相当复杂的工作,我想要确保不会出现重大的性能差异。如果有的话,我们可能需要一个默认关闭它的方法,并确保即使在关闭的情况下也不会有性能损失。

0
by

评论者:jare

是的,现在工作正常。谢谢。

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