标签: quickcheck

使用Monadic QuickCheck测试IO操作

有人能给我一个使用Monadic QuickCheck测试IO操作的简单示例吗?

io haskell quickcheck

49
推荐指数
2
解决办法
5613
查看次数

QuickCheck 2有哪些新功能?

QuickCheck 1和QuickCheck 2有哪些主要区别?通过查看Haddock文档,我可以看到它被拆分为更多模块,coarbitrary已被新Fun类型和FunArbitrary类替换(这对我来说似乎更容易理解),现在支持测试monadic代码.我还应该注意什么?

haskell quickcheck

40
推荐指数
1
解决办法
2647
查看次数

对于Haskell的QuickCheck,什么是收缩?

我正在学习QuickCheck的绳索> = 2.6但我不明白收缩是什么.从查看类型签名收缩看起来更像扩展!请照亮我:)

haskell quickcheck

38
推荐指数
2
解决办法
4287
查看次数

如何为快速检查生成简单类型的任意实例

我有一个简单的类型定义:

data Cell = Cell {
    x       :: Int,
    y       :: Int
  } deriving (Show)
Run Code Online (Sandbox Code Playgroud)

我不能Cell用作quickcheck属性的输入,大概是因为quickcheck不知道如何生成Cell值.

我的理解是我需要让Cell成为Arbitrary类型类的一个实例.

我该怎么做,例如,如果我想用x和y的随机正值生成Cell?

haskell quickcheck

37
推荐指数
2
解决办法
8900
查看次数

您是否在实际项目中使用过Quickcheck?

Quickcheck及其变体(即使Java中也有一个)似乎很有趣.但是,除了学术兴趣之外,它是否真正适用于真正的应用程序测试(例如,GUI应用程序或客户端/服务器,甚至是StackOverflow本身)?您对类似测试生成器的任何经验表示赞赏.

java testing haskell quickcheck

36
推荐指数
5
解决办法
9756
查看次数

可以通过不变测试替换单元测试吗?

作为一名程序员,我全心全意地购买了TDD理念,并努力为我编写的任何重要代码进行广泛的单元测试.有时这条道路可能会很痛苦(行为变化会导致多个单元测试的级联变化;需要大量的脚手架),但总的来说,我拒绝编程而没有我可以在每次更改后运行的测试,而且我的代码就像结果.

最近,我一直在玩Haskell,它是常驻测试库,QuickCheck.与TDD明显不同的是,QuickCheck强调测试代码的不变量,即保留输入的所有(或实质子集)的某些属性.一个简单的例子:一个稳定的排序算法应该给出相同的答案,如果我们运行它两次,应该有增加的输出,应该是输入的排列等.然后,QuickCheck生成各种随机数据,以测试这些不变量.

在我看来,至少对于纯函数(即没有副作用的函数 - 如果你正确地模拟你可以将脏函数转换成纯函数),那些不变测试可以取代单元测试作为这些函数的严格超集. .每个单元测试由输入和输出组成(在命令式编程语言中,"输出"不仅仅是函数的返回,而且还有任何已更改的状态,但这可以被封装).可以想象,可以创建一个随机输入生成器,它足以覆盖您手动创建的所有单元测试输入(然后是一些,因为它会产生您根本不会想到的情况); 如果由于某些边界条件而在程序中发现错误,则可以改进随机输入生成器,以便生成该情况.

那么,挑战在于是否有可能为每个问题制定有用的不变量.我要说的是:一旦你有一个答案,看它是否正确,首先计算答案就更简单了.对不变量的思考也有助于澄清复杂算法的规范,比特殊测试用例更好,这鼓励了对问题的逐个案例思考.您可以将程序的先前版本用作模型实现,或者使用另一种语言的程序版本.等等.最终,您可以覆盖所有以前的测试用例,而无需显式编码输入或输出.

我疯了,还是我做某事?

unit-testing quickcheck

32
推荐指数
2
解决办法
3318
查看次数

如何从QuickCheck中获得好(小)缩小?

我试图在一些嵌套列表上运行QuickCheck,看起来像这样:

type Constraint = Text
data Value = Value [Constraint]
data Literal = Literal Value [Value]
type Formula = [Literal]
Run Code Online (Sandbox Code Playgroud)

所以公式是一个文字列表,每个文字都包含一个谓词和一些参数; 谓词/参数是每个字符串形式的约束分离的值.这给了我们一份列表清单列表,p!

如果我的一个QuickCheck属性失败,我倾向于得到一个难以理解的页面输出.在尝试收缩之前,我曾经通过使用只能生成一小组(小)值的任意实例来解决这个问题.为我的每个类型实现收缩功能似乎有点帮助,但没有我想要的那么多.我仍然得到一页输出.

我认为我想要收缩的是一个小文字列表,其中每个文字都有一个小的值列表,而这些值又有很少的约束,每个约束都尽可能短.但在我目前的努力中,至少这些列表变得足够大,使输出变得可怕.如果我尝试调整缩小实现,我也发现QC开始花费很长时间(寻找收缩?),这会削弱我有效收缩的努力.

当您嵌套这样的数据时,如何提高理解QuickCheck失败的几率?

haskell quickcheck

31
推荐指数
1
解决办法
1195
查看次数

如何让Haskell QuickCheck 2.4增加#测试?

好的,正如我通过上一个问题所了解的那样,RWH书籍已经过时了QuickCheck.尽管我读过的所有帖子告诉我使用QuickCheck有多么简单,我找不到任何地方告诉我如何更改为房产运行的测试数量.

RWH说:

handyCheck limit = check defaultConfig {
                     configMaxTest = limit
                   , configEvery   = \_ _ -> ""
                   }
Run Code Online (Sandbox Code Playgroud)

如何使用QuickCheck 2.4做到这一点?更重要的是,我怎么会发现自己?请不要告诉我,我应该能够从API文档中找到它.

haskell quickcheck

26
推荐指数
1
解决办法
2768
查看次数

QuickCheck:生成平衡样本的嵌套数据结构的任意实例

tl; dr:Arbitrary如果你的数据类型允许过多的嵌套,你如何编写不爆炸的实例?您如何保证这些实例能够生成真正随机的数据结构样本?

我想生成随机树结构,然后在用我的库代码修改它们之后测试这些结构的某些属性.(注意:我正在编写子类型算法的实现,即给定类型的层次结构,类型A是类型B的子类型.通过在层次结构中包含多继承和后初始化更新,可以使其任意复杂化不支持这些的经典方法是Schubert编号,我所知道的最新结果是Alavi et al.2008.)

我们来看玫瑰树的例子如下Data.Tree:

data Tree a = Node a (Forest a)
type Forest a = [Tree a]
Run Code Online (Sandbox Code Playgroud)

Arbitray的一个非常简单的(并且不用尝试在家)实例将是:

instance (Arbitrary a) => Arbitrary (Tree a) where
    arbitrary = Node <$> arbitrary <$> arbitrary
Run Code Online (Sandbox Code Playgroud)

由于a已经有一个Arbitrary类型约束的实例,并且Forest将有一个,因为[]也是一个实例,这似乎是直截了当的.它不会(通常)以非常明显的原因终止:因为它生成的列表是任意长的,结构变得太大,并且它们很可能不适合内存.即使是更保守的方法:

arbitrary = Node <$> arbitrary <*> oneof [arbitrary,return []]
Run Code Online (Sandbox Code Playgroud)

因为同样的原因,再也不会工作了.人们可以调整大小参数,以保持列表的长度,但即使这样也不能保证终止,因为它仍然是多个连续的掷骰子,并且它可能会非常糟糕(我希望奇数节点有100个)孩子们.)

这意味着我需要限制整个树的大小.那不是那么直截了当.unordered-containers很简单:只需使用fromList.这在这里不是那么容易:你如何随机地将一个列表变成一棵树,而不会产生任何一种或另一种偏见(即不利于左分支,或者是非常左倾的树.)

列表中的某种广度优先构造(Data.Tree所有预先提供的功能)都很棒,我想我可以写一个,但结果却是非平凡的.由于我现在正在使用树,但是后来会使用更复杂的东西,我想我可能会尝试找到更通用,更简单的解决方案.有没有,还是我不得不求助于编写我自己的非平凡Arbitrary发电机?在后一种情况下,我实际上可能只是采用单元测试,因为这似乎太多了.

testing haskell quickcheck data-structures

26
推荐指数
2
解决办法
3773
查看次数

在Haskell(GHC)中快速检查令人讨厌的外部函数

我想用Haskell的quickcheck库测试一些C代码.最简单的方法似乎是 foreign import在最终的haskell函数之上编写一个属性.这样做的问题是,如果C代码导致段错误或设法破坏内存,我的测试要么在没有输出的情况下崩溃,要么做一些完全不可预测的事情.

第二种方法是在C位上创建简单的可执行包装器,并在测试过程之外执行它们System.Process.不用说,这样做需要大量的脚手架和序列化值,但另一方面,它可以处理段错误.

有没有办法让foreign import战略像运行外部流程一样安全?

haskell ghc quickcheck memory-safety

24
推荐指数
1
解决办法
210
查看次数