gpt4 book ai didi

unit-testing - FsCheck 属性的难点思考

转载 作者:行者123 更新时间:2023-12-03 23:10:53 26 4
gpt4 key购买 nike

我设法得到xUnit处理我的小样本组装。现在我想看看我能不能摸索FsCheck也。我的问题是在为我的函数定义测试属性时我很困惑。

也许我只是没有一个好的函数样本集,但是例如,这些函数的好的测试属性是什么?

//transforms [1;2;3;4] into [(1,2);(3,4)]
pairs : 'a list -> ('a * 'a) list //'

//splits list into list of lists when predicate returns
// true for adjacent elements
splitOn : ('a -> 'a -> bool) -> 'a list -> 'a list list

//returns true if snd is bigger
sndBigger : ('a * 'a) -> bool (requires comparison)

最佳答案

已经有很多具体的答案了,所以我会尝试给出一些一般性的答案,可能会给你一些想法。

  • 递归函数的归纳属性。对于简单的函数,这可能相当于重新实现递归。但是,请保持简单:虽然实际实现往往会不断发展(例如,它变成尾递归,但您添加了内存,...)保持属性简单明了。 ==> 属性组合器通常在这里派上用场。您的 pair 函数可能是一个很好的例子。
  • 包含模块或类型中的多个函数的属性。检查抽象数据类型时通常会出现这种情况。例如:向数组中添加一个元素意味着该数组包含该元素。这将检查 Array.add 和 Array.contains 的一致性。
  • 往返:这有利于转换(例如解析,序列化) - 生成任意表示,序列化,反序列化,检查它是否等于原始表示。
    您可以使用 splitOn 和 concat 来做到这一点。
  • 作为健全性检查的一般属性。寻找可能具有的普遍已知的属性 - 诸如交换性、关联性、幂等性(应用两次不会改变结果)、自反性等。这里的想法更多是为了稍微练习一下这个函数 - 看看它是否真的有什么奇怪的事情.

  • 作为一般建议,尽量不要把它搞得太大。对于 sndBigger,一个好的属性是:

    let ``当且仅当 snd 更大时才应该返回 true`` (a:int) (b:int) =
    sndBigger (a,b) = b > a

    这可能正是实现。不用担心——有时一个简单的老式单元测试正是您所需要的。无需内疚! :)

    也许 this link (由 Pex 团队提供)也给出了一些想法。

    关于unit-testing - FsCheck 属性的难点思考,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2446242/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com