问题标签 [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.
unit-testing - Difficulty thinking of properties for FsCheck
I've managed to get xUnit working on my little sample assembly. Now I want to see if I can grok FsCheck too. My problem is that I'm stumped when it comes to defining test properties for my functions.
Maybe I've just not got a good sample set of functions, but what would be good test properties for these functions, for example?
java - Agitar 和 Quickcheck 基于属性的测试有什么区别?
几年前,一种名为Agitar的 Java 测试工具很流行。它似乎做了一些基于属性的测试。
如今 - 基于Haskell 的 Quickcheck的基于属性的测试很流行。Java 有许多端口,包括:
我的问题是:Agitar 和 Quickcheck 基于属性的测试有什么区别?
scala - 使用 ScalaTest + ScalaCheck 检查意外异常
我正在尝试使用ScalaTest编写一个基本上声明“它不应该抛出异常,或者抛出可能的异常列表之一”的属性,GeneratorDrivenPropertyChecks
而它又使用scalatest。问题是我无法将noException
与逻辑或结合起来,所以我能想到的最好的就是这个丑陋的测试:
相反,我希望看到的内容更像
unit-testing - 属性测试用于什么
我想知道属性测试的目的是什么,它的最佳点是什么,应该在哪里使用。让我们有一个我想测试的示例函数:
这个函数,f
,接受一个数字列表,并将奇数平方并过滤掉偶数。我可以说明有关该功能的一些属性,例如
- 给定一个偶数列表,返回空列表。
- 给定一个奇数列表,结果列表将与输入具有相同的大小。
- 鉴于我有一个偶数列表和一个奇数列表,当我加入它们时,随机播放并传递给函数,结果的长度将是奇数列表的长度。
- 给定我提供了一个正奇数列表,那么结果列表中相同索引处的每个元素都将大于原始列表中的元素
- 鉴于我提供了一个奇数和偶数的列表,加入并打乱它们,然后我会得到一个列表,其中每个数字都是奇数
- 等等
没有任何属性测试,该函数适用于最简单的情况,例如我可以做一个简单的情况,如果我实现f
不正确,它将传递这些属性:
因此,如果我想涵盖一些简单的案例,看起来我要么需要在属性规范中重复算法的基本部分,要么需要使用基于值的测试。第一个选项,我有,重复算法可能有用,如果我打算改进算法,如果我打算改变它的实现,例如速度。这样,我就有了一个参考实现,我可以用它来再次测试。
如果我想检查一下,算法在一些琐碎的情况下不会失败,并且我不想在规范中重复该算法,看起来我需要一些单元测试。例如,我会写这些检查:
现在我对算法更有信心了。
我的问题是,基于属性的测试是要取代单元测试,还是互补?是否有一些一般的想法,如何编写属性,所以它们是有用的,或者它完全取决于对函数逻辑的理解?我的意思是,可以说以某种方式编写属性特别有益吗?
另外,是否应该努力让属性测试算法的每个部分?我可以将平方排除在算法之外,然后在其他地方进行测试,让属性只测试过滤部分,它看起来像,它很好地覆盖了它。
然后我可以通过Prelude.id
并g
使用单元测试测试其他地方。
unit-testing - 基于属性的测试是否会使您重复代码?
我正在尝试用基于属性的测试(PBT)替换一些旧的单元测试,具体地用scala
andscalatest - scalacheck
但我认为问题更普遍。简化的情况是,如果我有要测试的方法:
通常,我会编写单元测试,例如:
所以,对于每个测试,我都会写出我期望的输出,没问题。现在,使用 PBT,它会是这样的:
当我尝试编写一个适用于所有String
输入的测试时,我发现自己不得不在测试中再次编写该方法的逻辑。在这种情况下,测试看起来像:
也就是说,我必须在测试中编写实现以确保输出正确。有没有办法解决这个问题?我是否误解了 PBT,我是否应该测试其他属性,例如:
- “字符串的长度应与原始字符串相同”
- “字符串应该包含原始的所有字符”
- “字符串不应包含小写字符” ...
这也是合理的,但听起来很做作,不太清楚。任何在 PBT 方面有更多经验的人都可以在这里阐明一下吗?
编辑:按照@Eric的资料,我得到了这篇文章,并且有一个我的意思的例子(在再次应用类别时):测试 times
(F#
)中的方法:
作者最终编写了一个测试,如下所示:
因此,为了测试该方法,该方法的代码在测试中被复制。在这种情况下,像乘法一样微不足道,但我认为它可以外推到更复杂的情况。
unit-testing - 如果我已经练习了基于示例的测试,为什么还要使用基于属性的测试?
一些开发人员对基于示例的测试的 TDD 争论的一个警告是,可能缺少每个有效的输入处理。
让我们举一个简单的例子,这些开发人员可能会争论:
编写一个将两个数字相加的程序。
Bob,一位开发人员开始编写第一个测试:
给定 1 + 3,则结果为 4。
实现:def add(x: Int, y: Int) = 4
很好,它通过了。
现在第二个测试:
给定 2 + 2,那么结果是 4。实现仍然相同:def add(x: Int, y: Int) = 4
所以其他开发者会过来告诉他:
“现在您看到 Bob,基于示例的测试对于您糟糕的 2 个示例是不够的!
您没有测试每个输出并查看您的实际实现,对于结果与 4 不同的其他输入,它将失败!
现在,听听我们并开始编写一些基于属性的测试来覆盖所有有效输入。
所以让我们从交换性测试、关联性等开始,这些都是特定于加法的:加法的属性!”
但是但是但是.... Bob 的 TDD 实践真的很糟糕!
确实,他想应用三角测量,但他编写了一个已经成功的测试,因为不需要更改实现!
要导致三角剖分,应该编写一个失败的测试。而三角剖分是TDD实践的万能钥匙之一。
它允许主要步骤:重构,因为您应该管理导致 2 个不同结果的两条路径!
=> 只要测试变得具体,代码就会因为重构而变得更加通用。
所以我的问题是:
如果我们通过良好的三角测量实践来实践严格的 TDD,那么使用基于属性的测试的真正好处是什么,断言在 99% 的情况下已经被良好的 TDD 覆盖的不变量是什么?
确实,假设开发人员具有良好的智商并构建有意义的实现;)
我的例子取自那些幻灯片。
scala - 避免使用 ScalaTest forAll 测试重复值
我在 ScalaTest 上进行基于属性的测试,我有以下代码:
当我运行forAll
代码时,我注意到多次尝试相同的值,例如
鉴于上面的代码,我想知道是否有办法让每个值oneOf
只尝试一次。换句话说,要让 ScalaTest 不要两次使用相同的值。
即使我使用了其他生成器,例如Gen.alphaStr
,我也想找到一种方法来避免两次测试相同的字符串。我对此感兴趣的原因是因为每个测试都针对在不同进程中运行的服务器运行,因此涉及一些成本,所以我想避免两次测试相同的东西。
c# - 使用 FsCheck 进行测试的方法
我正在尝试将范式转变为 FsCheck 和基于随机属性的测试。我有复杂的业务工作流程,其中包含的测试用例比我可能列举的要多,而且业务逻辑是一个不断变化的目标,其中添加了新功能。
背景:匹配是企业资源计划(ERP)系统中非常常见的抽象。订单履行、供应链物流等
示例:给定一个 C 和一个 P,确定两者是否匹配。在任何给定的时间点,一些 P永远无法匹配,而一些 C永远无法匹配。每个人都有一个状态,表明他们是否可以考虑参加比赛。
奖励:除了天真的“块匹配”状态之外,C 和 P 都有一组检查。对于匹配的 C,一些检查必须为真,对于匹配的 P,一些检查必须为真,并且 C 的一些检查必须与 P 的检查进行交叉检查。这就是我怀疑基于模型的地方使用 FsCheck 进行测试将带来巨大的收益,因为 (a) 它是添加到产品中的新功能的示例 (b) 我可以编写测试(用户交互),例如:
- 创造
- 创建后,通过管道向前移动
- 向后移动(何时允许与不允许?例如:付费订单可能无法返回采购批准步骤)
- 在管道中间添加/删除东西(如检查)
- 如果我要求为相同的 C 和 P 创建两次匹配(例如,与 PLINQ 同时),我会创建重复项吗?(什么消息会返回给用户?)
我正在努力解决的事情:
- 我应该如何为 FsCheck 生成测试数据?我认为正确的方法是定义 Cs 和 Ps 的所有离散可能组合来创建匹配,并将它们作为我基于模型的测试的“前提条件”,后置条件是是否应该创建匹配,但是...
- 这真的是正确的方法吗?对于基于随机属性的测试工具来说,这感觉太确定了。在这种情况下甚至使用 FsCheck 是否过度设计?然后,就好像我有一个忽略种子值并返回确定性测试数据流的数据生成器。
- 在这一点上,FsCheck 生成器与仅使用 xUnit.net 和 AutoPOCO 之类的东西有什么不同吗?
unit-testing - 用于简单对象验证的基于属性的测试
考虑这个简单的例子:
- 有一个
Person
对象 - 它必须具有以下之一:
FirstName
和LastName
(或两者,但必须有一个) - 它必须有一个有效的
Age
(整数,介于 0 和 150 之间)
您将如何对这个简单的案例进行基于属性的测试?