当前位置: 首页 > 面试题库 >

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

蓝飞
2023-03-14
问题内容

Quickcheck及其变体(甚至Java中也没有)似乎很有趣。但是,除了学术兴趣之外,它在实际的应用程序测试中是否真的有用(例如GUI应用程序或Client
/ Server甚至是StackOverflow本身)?您使用类似的测试生成器的任何经验都将受到赞赏。


问题答案:

好吧。其实没有,但是我是在最初开发QuickCheck的那个人的带领下学习的,他是一个非常有趣的人。

早在2004年,我们就不得不使用QuickCheck来测试我们的Haskell程序,这是好事与坏事的结合。主要是因为Haskell有点令人生畏,但当您开始工作时,它的精彩程度从未如此出色。

从那时起,John完善了自己多年编写的内容,并实际上帮助Ericssion测试了其复杂的电信硬件,并且他在2000万左右的代码行中发现了错误,通过他的方法,将其减少到仅三个步骤。他是一位出色的演讲者,所以听他介绍他的出色表现总是很高兴,但总而言之,他对QuickCheck所做的一切对我来说都是新的。所以我问他,他的兴趣是什么将其推向市场。他对这个想法持开放态度,但是当时他的业务(基于QuickCheck)相对较新,因此他还需要关注其他领域。现在是2007年。我要说的是,即使您最终不会使用它,也可以向QuickCheck学习。

但是什么是QuickCheck?这是一个组合测试框架,是测试程序的一种有趣方式。微软研究院的人们已经建立了类似的Pex。Pex通过检查您的IL自动生成测试。但是,John会为函数的可能输入和测试属性编写生成器。属性是可以轻松测试的东西,它更加正式。例如倒转清单?好吧,反转列表与将列表分成两半,分别将它们分别反转然后以相反的顺序连接两个反转的一半相同。

1,2,3,4 // original
1,2 3,4 // split into A and B
2,1 4,3 // reverse A and B
4,3,2,1 // concat B and A

这是使用QuickCheck测试的一个很棒的特性,称为规范,其结果令人惊讶。

Pex很不错,但是不像QuickCheck那样酷,Pex简化了事情,QuickCheck做到了,但是编写一个良好的规范需要大量的精力。

QuickCheck的功能在于,当它发生故障时,它将导致测试失败的输入减少到最小的形式。向您详细说明什么状态进展会导致测试失败。与其他测试框架相比,它们只是试图以蛮力方式破坏您的代码。

由于您编写测试规范的方式,这使之成为可能。QuickCheck依靠伪随机性来发明输入,正因为如此,它能够回溯并找到很小的输入而无法通过您的测试。

编写QuickCheck属性需要做很多工作,但是最终结果是更好的测试。就像约翰本人所说的那样,70%的错误是通过单元测试捕获的,而其他30%的错误则导致程序崩溃。QuickCheck正在测试最后30%的内容。



 类似资料:
  • 问题内容: 我唯一了解的是 如果使用其 方法,它将始终返回而不是对象。它有什么用? 通过使用,您可以确保无法从 方法中恢复该对象。 但是这个概念/类的用途是什么? 您是否曾在您的任何项目中使用过此功能,或者在任何示例中应使用此功能? 问题答案: 我在简单,非常专业的内存分析器中使用s来监视对象的创建和销毁。我需要他们追踪破坏。但是这种方法已经过时了。(它于2004年针对J2SE1.4编写。)专业的

  • 最近部门有需求打算把jenkins持续集成应用起来。 所以查阅了一些资料,把jenkins环境搭建起来,跑了一下简单的小流程:源码拉取、maven编译打包、(后续可能会制作为docker镜像 -> 选择性将镜像推到docker私服 -> 搭建模拟运行环境) 但其实我有一些困惑,主要是感觉 jenkins 是一个可有可无的存在。 jenkins主要是为了解决“谁的”、“什么问题”呢? 有多少项目是实

  • 问题内容: 我正在尝试设置一些环境变量(用于对dev / prod端点进行API调用,取决于dev / prod等的键等),我想知道使用dotenv是否行得通。 我已经安装了dotenv,并且正在使用webpack。 我的webpack条目是,因此在该文件中 然后,在我的webpack配置中,输入以下内容: 但是,它仍未定义。如何正确执行此操作? 问题答案: 最简洁的答案是不。浏览器无法访问本地或

  • 问题内容: 众所周知,Windows使用带反斜杠的路径,而Unix使用带反斜杠的路径。node.js提供了始终使用正确的斜杠。因此,例如,您不必编写Unix,而只编写Unix 。 但是,似乎存在这种差异,但是如果您不对路径进行规范化(例如,使用path.join),而仅编写诸如node.js之类的路径,则在Windows上运行脚本没有问题。 那么,有没有写上任何好处了?无论平台如何,两者似乎都可以

  • 当我尝试执行我得到一个 我正试图找出问题所在,但我不知道是什么原因造成的。我正在使用MongoEngine(和MongoDB) 我的设置中有以下内容。py: 这就是我得到的: 回溯:get_response 111中的文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site packages/django/cor

  • 问题内容: 我目前正在用Java开发一个小平台,并为此编写了自己的游戏引擎,名为Bonsai。现在我问自己一个问题:“我是否过度使用了静态方法?”。 一方面,这非常方便,因为我不必在每个类(例如地图或玩家)中都引用游戏实例。另一方面,我已经不得不去除applet的支持了,因为那里所有静态的东西都非常小。 所以我的问题是,由于您可能比我更有经验的Java程序员,我应该摆脱所有的静态知识吗?如果是的话