问题标签 [quickcheck]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
368 浏览

testing - 使 Test.QuickCheck.Batch 使用默认类型来测试列表函数

我正在测试一个名为提取的函数,它可以在任何列表上运行。

我想测试它,例如,

但这不会编译;我必须为runor提供一个类型prop_len,因为 QuickCheck 不能生成[a],它必须生成一些具体的东西。所以我选择了Int

有没有办法让 QuickChecka为我选择而不是在类型中指定它run

0 投票
11 回答
10131 浏览

java - 你在实际项目中使用过 Quickcheck

Quickcheck及其变体(即使在Java中有一个),似乎很有趣。然而,除了学术兴趣之外,它在真正的应用程序测试中是否真的有用(例如,GUI 应用程序或客户端/服务器,甚至是 StackOverflow 本身)?感谢您对类似测试生成器的任何体验。

0 投票
4 回答
4117 浏览

unit-testing - 不变测试可以代替单元测试吗?

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

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

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

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

我是不是疯了,还是我在做某事?

0 投票
1 回答
1553 浏览

testing - 针对多种类型测试 QuickCheck 属性?

我有一个类型类Atomic,它定义了用于将某些类型转换为/从包装器值 ( Atom) 转换的函数。我想定义一个 QuickCheck 属性,它声明:“对于 的所有实例Atomic,任何值都可以安全地存储和检索”。该属性如下所示:

但是,如果我只是尝试通过 QuickCheck 运行该属性,它只会选择一个实例 ( Bool) 并对其进行测试。我目前正在通过为测试列表中每个支持的原子类型定义类型签名来解决这个问题,但这很冗长且容易出错:

我正在尝试定义一个自动执行此操作的函数:

但它失败并出现类型检查错误:

有没有更好的方法来针对多种类型测试 QC 属性?如果没有,可以使 forallAtoms 工作还是类型系统不支持?

0 投票
1 回答
1916 浏览

quickcheck - 使用 QuickCheck 生成 Int 列表

我正在研究Real World Haskell第 4 章的练习之一是实现一个foldr基于版本的 concat. 我认为这将是使用 QuickCheck 进行测试的绝佳候选者,因为有一个现有的实现来验证我的结果。然而,这需要我定义一个 Arbitrary可以生成任意[[Int]]. 到目前为止,我一直无法弄清楚如何做到这一点。我的第一次尝试是:

这导致不执行任何测试。看着各种点点滴滴,我猜想Arbitrary需要并添加一个实例声明

这导致 ghci 抱怨我的实例声明无效并且添加 -XFlexibleInstances 可能会解决我的问题。添加{-# OPTIONS_GHC -XFlexibleInstances #-}指令会导致类型不匹配和重叠实例警告。

所以我的问题是要完成这项工作需要什么?我显然是 Haskell 的新手,没有找到任何可以帮助我的资源。任何指针都非常感谢。

编辑

fconcat当在测试优先方式中定义 为时,我似乎被 QuickCheck 的输出误导了

实际正确实现该功能确实给出了预期的结果。糟糕

0 投票
3 回答
2068 浏览

haskell - 如何在 quickCheck (Haskell) 中使用“oneof”

我正在尝试编写一个更改数独的道具,然后检查它是否仍然有效。

但是,我不确定如何正确使用“oneof”功能。请给我一些提示好吗?

这里有更多信息...

我已经为这个道具奋斗了 3 个小时,所以欢迎任何想法!

0 投票
1 回答
2686 浏览

haskell - QuickCheck 2 中有哪些新功能?

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

0 投票
2 回答
6379 浏览

haskell - 使用 Monadic QuickCheck 测试 IO 操作

谁能给我一个使用 Monadic QuickCheck 测试 IO 操作的简短示例?

0 投票
5 回答
1523 浏览

haskell - QuickCheck 2 中的详细检查?

QuickCheck 1 中的功能verboseCheck似乎在 QuickCheck 2 中不存在(或者至少,我找不到它)。有没有其他方法可以显示测试期间使用了哪些值?

0 投票
2 回答
264 浏览

haskell - 有没有 QuickCheck Happstack.State 方法的好方法?

我有一组 Happstack.State MACID 方法,我想使用 QuickCheck 进行测试,但我无法找出最优雅的方法来完成它。我遇到的问题是:

  • 评估Evmonad 计算的唯一方法是在IOmonad 中通过queryor update
  • 没有办法创建纯粹的内存 MACID 存储;这是设计使然。因此,在IOmonad 中运行意味着每次测试后都有临时文件需要清理。
  • 除了initialValuefor 状态,没有办法初始化一个新的 MACID 存储;Arbitrary除非我公开替换状态批发的访问方法,否则无法生成它。
  • 解决上述所有问题意味着编写仅使用MonadReaderor功能的方法(并在orMonadState内部运行测试而不是. 这意味着放弃在方法定义中使用or等​​。ReaderStateEvgetRandomgetEventClockTime

我能看到的唯一选择是:

  • 在一次性磁盘 MACID 存储中运行这些方法,在每次测试后进行清理并从initialValue每次开始着手。
  • 编写方法以使大部分代码在MonadReaderor中运行MonadState(这更容易测试),并根据需要在其周围使用少量非 QuickCheck-able 胶水来调用getRandomor getEventClockTime

有没有我忽略的更好的解决方案?