基于堆栈的测试用例自动生成

testmachine的Python项目详细描述


测试机是一种新的测试方法。它是一个python库,用于 测试python程序,但核心概念是语言不可知的,应该是 易于移植到其他语言。

它的灵感来自quickcheck和其他类似的模糊测试方法, 但如果有一个转变,这个想法就会从内到外,变得更加 很强大。

核心概念是testmachine不生成数据,而是生成 程序。这是基于 Scalacheck(以及我的后续 它在hypothesis中的python端口, 但是对于testmachine,它同样适用于有状态和无状态系统。 一模一样。

statemachine生成的程序是由多个用户组成的 提供了规则。这些规则通常分为三类:

  • 生成随机值的函数(如quickcheck中的任意函数)
  • 关于值的断言(如quickcheck中的属性)
  • 组合值的规则(这在quickcheck中很难做到)

实际上,所有这三个都是由同一类型的内部和 有时使用这些规则的混合体(例如 也会生成某些断言的操作,或返回随机 但在很大程度上,这种分离是方便的。

将这些规则定义为python函数,然后testmachine接受它们 并试图找到会产生异常的组合。如果它发现 它会尽最大努力将其最小化,并将最终输出编译为 简单的文本格式,通常可以解释为有效的python(它是 由模式的简单字符串扩展生成。如果你的价值观有代表性 这是有效的python,您不会做任何异常的事情,然后输出 将是有效的python。否则可能需要一些编辑,但应该是可读的 一个人)。

状态

这段代码现在应该被认为是相当实验性的。你可以使用它 而且它可能会工作,但是我没有保证api是稳定的。 当我探索一个新的想法时,这仍然是一项正在进行的工作。

内部构件

它是如何工作的?

测试机的核心是描述一种可以执行的程序语言。 在具有多个命名值堆栈的计算机上。它生成随机程序 试图找出导致错误的原因。

每个程序都是一系列操作。每一个都可以操作堆栈 以任意的方式。如果操作抛出异常,那么testmachine现在 发现了一只虫子。

因为它定义了堆栈操作,所以很容易 最小化程序:程序只是没有显式 它们之间的依赖关系(所有数据依赖关系都经过堆栈),因此您可以 只需删除其中的指令,删除任何发现自己的指令 处于无效状态(例如,如果堆栈上的值不足),并且 看看程序是否仍然失败。如果是的话,你就缩小了程序。我们那时 贪婪地重复这个过程,直到我们不能再进一步缩小程序。

虽然这并不能产生保证是全局最小的程序, 在实践中,它似乎在制作简短的例子方面做得非常好 程序。

完成后,我们将有一个针对堆栈机的示例程序。 但这不是很可读,所以我们希望将其编译为更简单的python输出。

我们通过使用变量名维护一组阴影堆栈来实现这一点, 我们机器里每堆一个。通过跟踪要读取的变量 写在一个操作中,我们转换堆栈操作离子形成一组 变量读取和写入。结果是一系列变量读取和赋值 以SSA形式,相当于堆栈程序。然后我们做一些简单的字符串 模板化,它生成看起来非常像python程序的输出。

测试

这个版本的testmachine已经用python系列2.6、2.7和 3.2,3.3和Pypy。使用travis

检查生成 https://travis-ci.org/DRMacIver/testmachine.png?branch=masterhttps://coveralls.io/repos/DRMacIver/testmachine/badge.png?branch=master

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
maven通过pom文件增加最大java堆大小   java如何在Kojo IDE输出窗格中打印到同一行?   如何使用特定的JRE交付Java应用程序?   java Cordova插件调用日志找不到符号   Java上Redis哈希中的spring列表   java ThreadSafeClientConnManager不是多线程   java如何在激活器中获取IEclipseContext   java如何通过编程更改除法器偏差   在中找不到maven Java/Mvn本地资源。罐包装   JOptionPane的java用户输入验证。showInputDialog   java编辑:如何更改日期对象的日期格式?   文件编写器Java;如何覆盖   一行中包含多个值的java读取属性   java如何在安卓中使用截击上传视频