软件测试之Fuzzing和基于属性的测试

基于属性的测试技术,是指编写对你的代码来说为真的逻辑语句(即“属性”),然后使用自动化工具来生成测试输入(一般来说,是指某种特定类型的随机生成输入数据),并观察程序接受该输入时属性是否保持不变。如果某个输入违反了某一条属性,则用户证明程序存在一处错误,并找到一个能够演示该错误的便捷示例。

基于属性的测试技术的一个经典示例是测试一个sort(排序)函数,具体代码如下所示。

@given(st.lists(st.integers()))

def test_sort(s):

out = list(sorted(s))

assert set(out) == set(s)

assert all(x

这个测试过程假定,给定一列整数,对其进行排序 - 保持元素的集合不变 - 生成一个有序输出

随后,测试框架将针对一些输入序列的集合自动化执行上述代码,并报告是否发现反例。

模糊测试(Fuzzing)是一种由来已久的实践技术,它通常是指向程序传递某些种类的随机生成数据(通常是纯随机的字节流,但可能以某种智能的方式对其进行了筛选过滤),期望发现能够引发崩溃的某种输入(因此,也同样能够演示该错误)。

近年来,很大程度上由AFL软件所引领的潮流是,以覆盖范围为指导的模糊测试实用技术,采用代码插桩/覆盖的形式,来研究那些更有可能产生有趣行为的输入;这种技术业已证明对大部分模糊测试目标是非常有效的。

在过去,模糊测试和基于属性的测试已知被认为是完全不同的两种技术。基于属性的测试主要起源于哈斯克尔快速审计(Haskell’s QuickCheck),因此通常与富类型语言、形式规约以及其他相关领域联系到一起;而另一方面,模糊测试则通常针对C/C++所编写的二进制程序进行测试,一般与安全范畴联系在一起——该技术的目标是发现可利用的内存破坏错误。

然而在本文中,我想要论证的观点是,模糊测试和基于属性的测试基本上是同一种技术,至少在某种抽象层面上来说是这样的。我希望,对这种相似性的识别能够帮助每一位从业者改进他们的工具和工作流程。

基于属性的测试即一种Fuzzing(模糊测试)技术

如果我们回退到大约一个抽象层面来看,基于属性的测试和模糊测试显得非常相似。对两种技术而言,我们都需要:

·

测试系统

一次基于属性的测试过程的传统粒度是一个函数,而对于模糊测试来说是一个二进制程序;但这两者只是“某些任意计算”的不同实现罢了。

·

待确认属性

基于属性的测试需要我们编写一条属性作为显式代码,而模糊测试只针对属性“不崩溃”进行测试。然而,通过简单范式“assert(property())”,我们可以将与不崩溃相关的任何属性转换为一句断言;测试人员已经使用该技术发现了非常巧妙的程序行为错误。

·

用于发现可能违反属性的输入的策略

快速审计,以及许多衍生的基于属性的测试套件,都使用类型驱动的生成策略,而模糊测试主要使用的是随机字节流、人工编码生成器或者已知良性输入的随机变种策略。然而,基本上所有这些方法都只是用于自动化生成输入数据的策略,测试人员期望这些输入数据能够触发违反测试系统所声明属性的行为。

在两种技术在实践和工具方面的用法有很多不同;然而很明显,两者同样存在着深度的相似性,而且两者并不存在根本性的不同。

关注的原因

模糊测试和基于属性的测试都有悠久的发展历史,多样的工具生态圈以及用户爱好者社区。然而在我的印象中,两者相对很少重叠,而且在两者的生态圈之间没有大范围的跨界交流。我认为这是不对的,两者的工具应该更加紧密地靠拢。在下一篇文章中,我希望针对一些特定技术更加深入地研究其细节,并且希望使用这些技术实现一些基于属性的测试工具。

附录:Hypothesis工具介绍

Hypothesis是一款开源的基于属性的测试工具,主要使用Python语言实现。我认为,该工具在很多方面领先于世界上其他任何一款工具。然而从本文的主题来说,该工具的作者在我之前就意识到了模糊测试和基于属性的测试之间的根本相似性,并且已经对其进行了撰文论述,同时在这款工具中引入了很多模糊测试领域的思想。

如果你拥有Python编程基础,那么你应该学习使用Hypothesis;如果没有,那么你应该学习理解Hypothesis,这样你就可以在自己的代码中借用其中最佳的思想。

本文由看雪翻译小组木无聊偶编译,来源MadeofBugs@Nelson Elhage

转载请注明来自看雪社区

热门阅读

本文来自企鹅号 - 看雪学院媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能LeadAI

数据清洗经验

平时习惯了在某些特定的数据集合上做实验,简单的tokenization、预处理等步骤就足够了。但是在数据越来越大的年代,数据清洗越来越重要,也越来越复杂。看到P...

3294
来自专栏程序员的碎碎念

分享几个我经常用到的函数

同上一个推送一样,为了提高php开发的效率,在学习完一些零零碎碎的知识外,我们要学会的那就是总结与分享,学会封装类和函数,方便下次你再次敲此功能代码。在...

3626
来自专栏大数据挖掘DT机器学习

Facebook社交网络R语言分析

本文将基于facebook的好友关系数据,研究用户分布规律,并提供简单的好友推荐算法。 数据来源 KONECT1 http://konect.uni-koble...

3569
来自专栏IT派

我用 Python 爬取微信好友,最后发现一个大秘密

你身处的环境是什么样,你就会成为什么样的人。现在人们日常生活基本上离不开微信,但微信不单单是一个即时通讯软件,微信更像是虚拟的现实世界。你所处的朋友圈是怎么样,...

1484
来自专栏python全栈布道师

python2018.06聚会笔记

这个小哥哥身穿白色T恤, 下身穿粉红色短裤, 讲起话来很幽默,而且喜欢自嘲式的谦虚.

832
来自专栏java达人

通过人工智能编写自修改/自完善的程序

作者:Kory Becker 译者: Mr派 来源:http://www.primaryobjects.com/2013/01/27/using-artific...

2038
来自专栏数据派THU

独家 | 2种数据科学编程中的思维模式,了解一下(附代码)

通常而言,在同一个文件中覆盖完整的流程将会导致Jupyter Notebook、脚本变成一团乱麻。此外,大多数的数据科学问题都要求我们在数据收集、数据清洗、数据...

783
来自专栏非著名程序员

如何处理前任程序员留下的代码

作为软件工程师不可避免会遇到的一个场景是:我们在改变或添加一个功能到不是我们创建的、我们不熟悉的、与我们负责的系统部分无关的代码中时,会遇到麻烦。虽然这可能会是...

792
来自专栏大数据文摘

手把手 | 数据科学速成课:给Python新手的实操指南

1635
来自专栏牛客网

基础题:深信服2018春季实习生面经

算法: 1、说一下二分查找 2、二分查找的条件是什么 3、说一下平衡二叉树的概念 4、你知道有哪些排序方式 5、归并排序的思想及时间空间复杂度 6、你知道图论算...

3697

扫码关注云+社区