目标
在日常测试工作中,经常会有api接口的测试,除了正向流程的测试之外,我们经常还需要覆盖一些异常情况。
例如:
不合法字符串
字符串超长
应该是数字类型的,传入了字母
参数为空
传入了中文,标点符号等
sql注入等等
事实上,我们组的接口测试demo框架中,在dataprovider中也经常能够看到诸如下面的例子。
@DataProvider(name = "testIllegalName")
public static Object[][] testIllegalName(){
return new Object[][]{
//name
{null, 400, "域名为空或者域名非法"},
{"", 400, "域名为空或者域名非法"},
{"abcdefghijilmnopqrstu", 400, "域名为空或者域名非法"},
{" ", 400, "域名为空或者域名非法"},
{"12", 400, "域名为空或者域名非法"},
{"-12", 400, "域名为空或者域名非法"},
{"0.2", 400, "域名为空或者域名非法"},
{"abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcd.com", 400, "域名为空或者域名非法"},
{"zxq.qa.com", 400, "域名为空或者域名非法"},
{"zxq_qa.com", 400, "域名为空或者域名非法"},
};
}
此处是看看接口在传入非期望值的时候,能不能够很好的处理类似请求。
除此以外,还有一些和业务场景强相关的值类型,比如网络测试的时候,我们会关心cidr的格式;计费测试的时候,又特别关注数字的类型。
一方面,给每个接口增加类似的异常接口测试相对比较无趣;另一方面,我们作为人,考虑问题,不管是开发还是测试,都难免挂一漏万,有一些边边角角的case没能考虑到。
既然如此,我们能否统一抽象出来一种接口异常测试的框架,自动 注入各种类型的异常,然后将凡是服务没有捕获的,抛出trace, exception 的,记录下请求的payload,为后续验证覆盖提供支撑。
原理
主要使用了模糊测试技术(fuzz testing, fuzzing)。其核心思想是自动或半自动的生成随机数据输入到一个程序中,并监视程序异常,如崩溃,断言(assertion)失败,以发现可能的程序错误,比如内存泄漏。(摘抄之维基百科)
简单的模糊测试随机输入数据,而更加高效的模糊测试,需要理解对象结构或者协议。通过向数据内容,结构,消息,序列中引入一些异常,来人为的构造聪明的模糊测试。
如果你持续关注文件系统或内核技术,你一定注意过这样一篇文章:Fuzzing filesystem with AFL。Vegard Nossum 和 Quentin Casasnovas 在 2016 年将用户态的 Fuzzing 工具 AFL(American Fuzzing Lop)迁移到内核态,并