问题标签 [property-based-testing]

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 投票
3 回答
392 浏览

haskell - 一套快速检查测试与实现相匹配是好事还是坏事?

我正在尝试开始使用 Haskell 的 QuickCheck,虽然我熟悉测试方法背后的概念,但这是我第一次尝试将它用于超越测试之类的项目的项目reverse . reverse == id中事物。我想知道将它应用于业务逻辑是否有用(我认为很有可能)。

因此,我想测试的几个现有业务逻辑类型函数如下所示:

对于这个函数,我可以编写一个 QuickCheck 规范,如下所示:

我最终得到的是一个更优雅地expectation验证当前实现的函数。shouldDiscountProduct所以现在我有一个测试,我可以重构我原来的功能。但我的自然倾向是将其更改为以下实现expectation

但这很好,对吧?如果将来我想再次更改此功能,我已经准备好相同的功能来验证我的更改是否合适并且不会无意中破坏某些东西。

或者这是矫枉过正/双重簿记?我想我已经从 OOP 测试中根深蒂固地告诉我,你应该尽量避免镜像实现细节,这实际上不能比这更进一步,它就是实现!

然后我想当我完成我的项目并添加这些类型的测试时,我将有效地添加这些测试,然后重构为我在expectation断言中实现的更清晰的实现。显然,对于比这些更复杂的功能,情况并非如此,但我认为在这一轮中会如此。

人们对使用基于属性的业务逻辑类型功能的测试有什么经验?这种事情有什么好的资源吗?我想我只是想验证我是否以适当的方式使用 QC,而这只是我的 OOP 过去让我对此产生怀疑......

0 投票
1 回答
199 浏览

python - 通过参数化递归调用,使用 Python 假设生成有效的二叉搜索树

如何在 Python 假设库中参数化递归策略?

我想通过使用递归策略is_valid_bst生成有效的 BST 来测试该函数是否有效。

0 投票
0 回答
111 浏览

haskell - 如何在`hedgehog`中使用`GenT`

hedgehog图书馆里,有一个GenT单子变压器。但是该forAll函数采用Gen类型。

有一个forAllT功能,但它在一个Internal模块中。

因此,如果我想使用具有特定 monad 的生成器 monad 变压器(例如State),那么使用这种 monad 的方法是GenT什么?

0 投票
1 回答
69 浏览

scala - Difference between instantiating something from the class and from the companion object

I am reading and working on the exercises on the book Funcional Programming in Scala. In the chapter about property testing, one exercise ask to implement def listOf[A](g: Gen[A]): SGen[List[A]], here is the relevant code:

As you can see, listOf[A](g: Gen[A]): SGen[List[A]] is implemented in two ways, the second one is the one I thought, and the first one is the solution provided by the book.

My question is, is there any difference between creating that SGen via the companion object and creating it using the listOfN method on the generator g? I suppose as long as both implementations ends up using g to generate the values, there is little difference.

0 投票
1 回答
71 浏览

c# - 禁止参数组合

我正在尝试使用 FsCheck 为DateTimeOffset在给定间隔内生成随机值的类编写基于基本属性的测试。

min当>时,该测试很快失败,max因为我验证了输入参数Next()并在这种情况下抛出一个ArgumentException

我不想更改实现以交换输入参数。而且我也不想在测试方法中这样做。

有没有办法教 FsCheck 生成minandmax值,其约束条件min不得大于该值max

C# 中的示例将不胜感激,因为我对 F# 的了解不达标。

0 投票
1 回答
132 浏览

haskell - 生成满足 QuickCheck 中特定属性的数据的最佳做法是什么?

当我们使用 QuickCheck 检查我们的程序时,我们需要为我们的数据定义生成器,有一些通用的方式来定义它们,但是当我们需要生成的数据满足某些约束才能工作时,通用的方式通常变得无用。

例如

现在我需要定义 Expr 的生成器(即Gen Exprinstance Arbitrary Expr),但也希望它生成正确的类型(即isJust (typeInfer generatedExpr)

一种天真的方法是使用suchThat过滤掉无效的方法,但这显然是低效的,Expr并且TyRep在更多情况下变得复杂。

另一个类似的情况是关于参考完整性,例如

在这种情况下,我们希望生成的所有引用名称Expr都包含在某些特定的名称中Context,现在我必须Expr为特定的名称生成Context

但是现在shrink会成为一个问题,而要解决这个问题,我必须定义一个特定版本的shrink,并且forAllShrink每次使用时都要使用arbExpr,这意味着很多工作。

所以我想知道,有没有做这些事情的最佳实践?

0 投票
1 回答
180 浏览

scala - ScalaTest:没有为 GeneratorDrivenPropertyChecks 运行测试

我正在尝试使用 ScalaTest 和 ScalaCheck 设置基于属性的测试......并且基于输出,我似乎成功了,但它太快了,据我通常理解,ScalaCheck 应该会告诉你测试可能是如何进行的运行,在我的情况下,此信息不存在:

这是测试类:

Gens trait 是我的 - 它只包含 Gen[Array[Int]] 的定义:

将此来源用于测试设置。以防万一,我提供了 scalacheck 和 scalatest 的版本(来自 Dependencies.scala 和 build.sbt):

0 投票
0 回答
56 浏览

javascript - 如何测试整数减法不是可交换的?

我想写一个基于属性的单元测试来证明整数减法是不可交换的。我有 mocha 和fast-check

几次运行后,我注意到当条件a === b && a <= 0为真时它会失败。但是,我不确定是否还有其他不符合的条件a - b !== b - a,因此我不确定排除该特定条件是否正确。

我该如何编写测试?我应该排除特定条件吗?或者我应该检查a - b !== b - a至少两个给定值是否为真?或者有其他方法可以测试吗?

也欢迎使用任何其他类型的 javascript 库进行基于属性的测试的示例。

0 投票
2 回答
123 浏览

haskell - 显示集成收缩限制的示例

我刚刚观看了一个视频,该视频介绍了基于属性的测试的集成收缩概念。该方法似乎比类型定向收缩具有一些优势,但是在此 reddit 线程中指出,集成收缩方法不适用于单子生成器:

以您的方式进行收缩并不适合生成器的一元样式。这是一个示例,考虑生成一个任意列表(暂时忽略终止):

现在,收缩的默认行为将首先收缩 x(保持 xs 不变),然后收缩 xs(保持 x 不变),这严重限制了收缩(局部最小值的概念现在不那么强大了)。

我将上述评论读为“集成收缩可能无法提供全局最小反例”。但是,由于hedgehog似乎能够为列表上的失败属性找到最少的反例,我想知道是否有一个示例可以显示上面引用中指出的缺点。

0 投票
2 回答
130 浏览

haskell - 为什么这个收缩树看起来像使用过滤器时的样子

我试图了解 filter 在使用hedgehog 集成收缩时对生成器的收缩树有什么影响。

考虑以下函数:

打印收缩树时:

我会得到如下所示的收缩树:

这是一棵非常深的树,只包含x's,discard最后是 a。

为什么收缩函数不断返回x's 而不是一个空列表,这表明没有进一步的收缩可能?