问题标签 [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 投票
2 回答
430 浏览

scala - 测试递归数据结构

ScalaCheck:权威指南解释了如何为递归数据结构创建生成器。

首先,它定义了数据结构:

接下来,它显示Gen[Tree[A]]代码:

对于上面的生成器,本书演示了,调用它可能会导致StackOverflowError

给定以下MyList数据结构:

以及以下生成器:

我的理解是,Gen[Tree[A]]对 的使用listOf负责StackOverflowError

但是,代码StackOverflowError生成器中是否有可能Gen[MyList[A]]

我猜是如果足够genList返回足够Cons的,但我不确定。

0 投票
1 回答
115 浏览

scala - Scala:基于属性的测试:编写测试时如何了解所有必要的测试用例

我正在阅读使用 Scala 语言进行基于属性的测试。在这张幻灯片中,他们提出了这个概念:证明函数a+b是真的。我们只是为了证明这些陈述在随机数据上是正确的:

  1. a + b = b + a
  2. 一个 + 0 = 一个
  3. 一个 + 1 + 1 = 一个 + 2

我的问题是:哪些方法可以检查我们的测试用例是否足够,并且可以涵盖不同数据的所有案例。例如在前面的例子中,我们如何确定在我们的三个属性正确运行之后,我们可以确定我们的实现是正确的。

0 投票
2 回答
271 浏览

f# - Expecto FsCheck在生成字符串时出现堆栈溢出异常

我正在尝试学习如何正确使用 FsCheck,并将其与 Expecto 集成。如果我使用默认的 FsCheck 配置,我可以运行属性测试,但是当我尝试使用自己的生成器时,它会导致堆栈溢出异常。

这是我的发电机

我正在尝试像这样使用它:

异常甚至在进入Gen.where函数之前就被抛出

我究竟做错了什么?谢谢

0 投票
1 回答
391 浏览

c# - 在 FsCheck 中将两个生成器组合成一个任意值

我有一个属性,我想在 的集合上进行测试Stuff,其中一个Stuff满足某个属性。我有一种方法可以生成Stuff令人满意的属性,还有一种方法可以生成不满足的属性Stuff

今天,我正在做这样的事情(是的,我在 C# 中使用 FsCheck):

但这对排序进行了硬编码,即Stuff集合中满足属性的排序;我也想仲裁。

一种方法是嵌套Prop.ForAll调用;一个生成确定排序的东西的外部生成器,以及一个内部生成器,它是我上面的那个,但将控制排序的参数传递给集合构建器:

但这感觉很笨拙和令人费解。是否有更简单和/或更惯用的方法来实现相同的目标,即测试两个任意输出的笛卡尔积?

0 投票
1 回答
958 浏览

testing - Clojure 规范与基于属性的测试库(例如 Haskell QuickCheck)有何不同?

其他语言有基于属性的测试库,比如Haskell QuickCheckClojure 规范与此类库有何不同?或者它只是Clojure的一个基于属性的测试框架?

0 投票
1 回答
1736 浏览

c# - C#、xunit、fscheck,使用自定义生成器或受约束的随机字符串编写基于属性的简单测试

我正在尝试解决菱形 kata,以便学习如何使用 fscheck 库编写基于属性的测试。我想用 C# 编写测试,我正在使用 Visual Studio 2017。

我想编写一个基于属性的测试,它不会生成任何随机字符作为输入,而只会生成字母。我不确定如何编写生成器 fscheck 需要执行此操作以及将代码放在哪个文件中?

我到处搜索并阅读文档,但遇到了麻烦(部分原因是我不能很好地将 F# 翻译成 C#)。

如何[Property]用于将输入数据限制为仅字母?

如果有更好的方法请告诉我。

[编辑:]

我编辑了我的代码示例,现在包含 Kurt Schelfthout 的一个工作解决方案。



测试


测试类

0 投票
1 回答
765 浏览

c# - FsCheck:如何生成依赖于其他测试数据的测试数据?

FsCheck 有一些简洁的默认Arbitrary类型来生成测试数据。但是,如果我的一个考试日期取决于另一个考试日期怎么办?

例如,考虑string.Substring()结果子字符串永远不能长于输入字符串的属性:

虽然实现Substring肯定是正确的,但这个属性失败了,因为最终PositiveInt会生成比生成的更长的 a,NonEmptyString从而导致异常。

收缩:NonEmptyString "a" PositiveInt 2 异常:System.ArgumentOutOfRangeException:索引和长度必须引用字符串中的位置。

我可以与 an 进行比较,if (input.Length < length) return true;但这样我最终会进行大量测试运行,甚至没有检查该属性。

如何告诉 FsCheck 只生成PositiveInt不超过输入字符串的 s?我想我必须使用这个Gen<T>类,但它的界面让我很困惑......我尝试了以下但仍然PositiveInts 超过了字符串:

0 投票
1 回答
313 浏览

f# - 如何将 FsCheck 生成器列表累积为单个值?

我编写了一个 FsCheck 生成器,它产生随机 glob 语法模式(例如a*c?)以及与该模式匹配的随机字符串(例如abcd)。但是我的解决方案使用了一个可变变量,我对此感到很惭愧。看一看:

请注意,它text是可变的,以及它的值是如何在循环中累积的。

我的直觉告诉我,必须有一种方法可以fold将生成器导入text,但我不知道如何,因为我不了解let!引擎盖下的工作原理(还)。我正在考虑类似于以下内容:

我在正确的轨道上吗?累加器和种子应该是什么fold样的?

0 投票
1 回答
385 浏览

java - QuickTheories:从列表创建生成器的方法

使用 java 库 QuickTheories,是否有一种内置方法可以从值列表创建生成器?

就像是:

自己动手并不算太糟糕,但似乎是在重新发明轮子:

0 投票
1 回答
140 浏览

javascript - 使用 JSVerify 强制特定输入

我开始使用 JSVerify 进行基于属性的测试。

给定一个接受字符串作为参数的函数(只是一个示例),我使用 JSVerify 传入大量任意字符串,并查看函数的行为是否符合所有字符串的预期。事实证明,有一些字符串会导致测试失败:到目前为止,我发现如果字符串包含\0000, \0001or \n,则测试失败。

我想更正我的代码,以便相应地处理这种情况,但为了防止回归,我想确保每个测试运行都包含这些情况。我还想避免对数字生成器的种子 ( rngState) 进行硬编码,因为这会阻止将来发现其他极端情况。

澄清一下:假设我正在测试我的功能foo()

foo()每次运行测试套件时,该测试都会向其中输入 100 个随机字符串。最初它正在通过。在一些运行之后它突然失败,因为这一次,随机字符串生成器生成了一个包含字符的字符串\0000,我的函数没有按预期处理。从现在开始,我希望我的测试每次都使用这个字符串作为输入,再加上通常的 100 个随机输入。

是否有使用 JSVerify 的内置方法来执行此操作?还是我应该将这些输入视为单独的测试用例?