增强RESTful API测试:针对MongoDB的搜索式模糊测试新方法
论文: Search-Based Fuzzing For RESTful APIs That Use MongoDB
一段话总结
本文聚焦于使用MongoDB的RESTful API的基于搜索的模糊测试,提出了增强测试生成的新技术:通过自动代码 instrumentation 动态分析MongoDB状态,并允许从测试用例直接插入NoSQL数据,作为开源工具EvoMaster的扩展。实验在6个RESTful API上进行,结果显示代码覆盖率较现有白盒方法最多提升18%,且优于4种最先进的黑盒模糊测试工具,为NoSQL数据库交互的API测试提供了有效方案。
研究背景
想象一下,你经营着一家大型电商平台,后台依赖数十个微服务协同工作——用户登录、商品推荐、订单处理等功能分别由不同的RESTful API负责。这些API每天要处理数百万次请求,而它们的“记忆中心”正是数据库。其中,MongoDB这类NoSQL数据库因灵活的存储格式(无需固定表结构)被广泛采用,就像一个没有固定货架的仓库,货物可以随意摆放,极大提升了存储效率。
但问题来了:如何确保这个“灵活仓库”和API的配合不出错?传统的API测试工具就像只会检查固定货架的质检员,面对MongoDB的动态数据结构时频频“失灵”:
- 黑盒测试工具看不见API内部逻辑,只能盲目尝试请求,效率低下;
- 现有白盒工具(如EvoMaster)虽能利用内部信息,但主要针对SQL数据库,对MongoDB的动态 schema 和复杂查询过滤支持不足;
- 当API需要特定数据库状态才能触发隐藏错误时(比如某个查询必须返回非空结果),传统工具很难“猜中”正确的数据组合。
这就像要打开一把密码锁,传统方法只能随机试数字,而我们需要一种能“感知”密码组合接近程度的新工具。
主要作者及单位信息
- Hernan Ghianni:布宜诺斯艾利斯大学计算机科学系、CONICET计算机科学研究所
- Man Zhang:北京航空航天大学计算机学院
- Juan P. Galeotti:布宜诺斯艾利斯大学、CONICET、挪威Kristiania应用科学大学
- Andrea Arcuri:挪威Kristiania应用科学大学、奥斯陆城市大学计算机系
创新点
动态追踪MongoDB交互:通过代码 instrumentation 实时监控API对MongoDB的查询操作,记录所有未返回结果的过滤器(如“查找x=100的文档”),解决了“看不见数据库内部逻辑”的问题。
NoSQL距离计算:为每个未命中的过滤器计算“距离”——评估现有数据库文档与满足过滤器条件的接近程度(例如,文档x=90与过滤器x=100的距离为10),给测试工具提供“优化方向”。
直接插入NoSQL数据:允许测试用例直接向MongoDB插入数据,无需通过API接口,尤其适合只读服务或复杂交互场景(比如API没有提供创建数据的接口,但测试需要特定初始数据)。
自适应数据格式推断:通过反射技术自动识别MongoDB集合中文档的预期格式(如字段类型),确保插入的数据能被API正确解析,避免因格式错误导致的测试失效。
研究方法和思路、实验方法
核心技术步骤
监控数据库交互
在API运行时,通过 instrumentation 追踪MongoDB驱动的find()
方法调用,记录查询过滤器和目标集合名称,相当于给数据库装了一个“监控摄像头”。计算NoSQL距离
对每个未返回结果的过滤器,遍历集合中的文档,根据过滤器条件(如$eq
、$gt
)计算文档与条件的“距离”(参考分支距离算法),并取最小值作为该过滤器的优化目标。例如:- 过滤器为
x=17
,文档x=42,则距离为|42-17|=25
; - 多条件过滤器(如
x=17且y="c"
)则通过归一化处理避免某一条件主导结果。
- 过滤器为
优化测试生成
将NoSQL距离作为次要目标融入EvoMaster的搜索算法,在生成测试用例时,优先选择能减小距离的输入(如调整API请求参数),引导测试逐步接近满足过滤器的状态。直接插入数据
当通过API难以准备所需数据时,自动生成插入操作,直接向MongoDB写入符合格式的文档,并结合查询条件确保插入数据能触发目标代码路径。
实验设计
- 测试对象:6个来自EMB corpus的真实RESTful API(总324个端点,84531行代码),均使用MongoDB且运行在JVM上。
- 对比工具:
- 白盒:基础版EvoMaster(无MongoDB支持);
- 黑盒:ARAT-RL、EvoMaster BB、Restler、Schemathesis(均为当前主流工具)。
- 实验设置:每个API重复测试30次,每次测试时长1小时,评估指标为代码覆盖率和故障检测数。
主要贡献
显著提升测试效果:在6个API中,代码覆盖率平均提升7.3%,最高达18%(session-service API),5个API的提升具有统计显著性。
超越现有工具:与4种黑盒工具相比,新方法平均覆盖率达52.7%,排名第一,远超第二名(EvoMaster WB,43.8%)。
解决实际痛点:
- 支持只读API测试(无需通过接口创建数据);
- 应对MongoDB动态schema挑战,减少因格式错误导致的测试失败;
- 开源工具扩展(https://github.com/anonymousmongodb/fuzzing-nosql),可直接复用。
故障检测能力增强:在3个API中发现更多隐藏故障,平均故障检测数从51.8增至52.8。
思维导图
详细总结
1. 研究背景与动机
- RESTful API与数据库交互:RESTful API广泛用于微服务,依赖数据库持久化数据,其中NoSQL数据库(如MongoDB)因灵活性和可扩展性被广泛使用,但无固定schema的特性增加了测试难度。
- 现有测试工具局限:黑盒测试工具无法利用SUT内部信息;现有白盒工具(如EvoMaster)主要针对SQL数据库,对NoSQL数据库支持不足,难以处理动态schema和复杂过滤器。
- 研究目标:提出增强的基于搜索的测试生成技术,解决MongoDB交互的RESTful API测试难题。
2. 核心技术
NoSQL启发式方法
- 监控NoSQL命令:通过 instrumentation 监控MongoDB驱动层的find()调用,记录过滤器和集合信息。
- 计算NoSQL距离:对返回空结果的过滤器,评估集合中每个文档与过滤器的接近程度(基于分支距离和归一化函数),公式为Hc(F)=mind∈c{Hd(F)}H_{c}(F)=min _{d \in c}\left\{H_{d}(F)\right\}Hc(F)=mind∈c{Hd(F)}。
- 适应度函数整合:将NoSQL距离作为次要目标,辅助优化测试生成,优先选择更接近满足过滤器的测试用例。
NoSQL数据生成
- 允许直接向MongoDB集合插入文档,解决只读服务或复杂交互场景下的数据准备难题。
- 通过反射推断集合数据格式(基于find()返回的类信息),确保插入文档的有效性。
3. 实验设计
- 实验对象:6个来自EMB corpus的JVM REST API,具体信息如下表:
SUT | 端点数量 | 源文件数量 | 代码行数(LOC) |
---|---|---|---|
bibliothek | 8 | 33 | 2176 |
genome-nexus | 23 | 405 | 30004 |
gestaohospital-rest | 20 | 33 | 3506 |
ocvn-rest | 258 | 526 | 45521 |
reservations-api | 7 | 39 | 1853 |
session-service | 8 | 15 | 1471 |
总计 | 324 | 1051 | 84531 |
对比工具
- 白盒:基础版EvoMaster(无MongoDB支持)
- 黑盒:ARAT-RL、EvoMaster BB、Restler、Schemathesis。
实验设置:每个API重复测试30次,每次测试时长1小时,评估指标为代码覆盖率和故障检测数。
4. 实验结果
RQ1:与现有白盒工具对比
- 代码覆盖率:平均从40.0%提升至47.3%,最高提升18%(session-service,从57.3%到75.7%)。
- 统计显著性:5个API结果统计显著,平均效应量A^12=0.91\hat{A}_{12}=0.91A^12=0.91,4个API效应量达1.00(每次运行均优于基础版)。
- 故障检测:平均检测故障数从51.8增至52.8,3个API显著提升。
RQ2:与黑盒工具对比
- 平均覆盖率:扩展后的EvoMaster(Mongo)以52.7%排名第一,优于第二名EvoMaster WB(43.8%)。
- 工具排名:在6个API中,Mongo在4个API中排名第一,整体平均排名1.5。
5. 结论与贡献
- 研究贡献:提出新的NoSQL启发式方法、NoSQL数据生成技术,开源扩展EvoMaster(https://github.com/anonymousmongodb/fuzzing-nosql)。
- 结论:新技术显著提升RESTful API测试的代码覆盖率和故障检测能力,未来可探索与强化学习结合。
关键问题
问题:该研究提出的NoSQL启发式方法如何计算文档与过滤器的接近程度?
答案:通过计算NoSQL距离实现。对于返回空结果的过滤器F,对集合c中的每个文档d,基于过滤器中的条件(如eq、eq、eq、gt等)递归计算启发式分数Hd(F)H_d(F)Hd(F)(参考分支距离和归一化函数),最终集合c的NoSQL距离为所有文档分数的最小值,即Hc(F)=mind∈c{Hd(F)}H_c(F)=min _{d \in c}\left\{H_d(F)\right\}Hc(F)=mind∈c{Hd(F)}。问题:实验中使用了哪些API,其规模如何?结果显示代码覆盖率提升的具体表现是什么?
答案:实验使用6个来自EMB corpus的JVM REST API,共324个端点、1051个源文件、84531行代码(LOC)。代码覆盖率提升方面,平均从40.0%提升至47.3%,最高提升18%(session-service),5个API结果统计显著,4个API每次运行均优于基础版EvoMaster。问题:与现有黑盒模糊测试工具相比,该研究的技术优势体现在哪里?
答案:扩展后的EvoMaster(Mongo)平均代码覆盖率达52.7%,排名第一,优于所有黑盒工具(ARAT-RL、EvoMaster BB、Restler、Schemathesis)。在6个API中,Mongo在4个API中排名第一,整体平均排名1.5,较第二名EvoMaster WB(43.8%)高出8.9个百分点,尤其在处理MongoDB交互场景时优势明显。
总结
本文针对使用MongoDB的RESTful API测试难题,提出了一套增强的搜索式模糊测试技术。通过动态追踪数据库交互、计算NoSQL距离、直接插入数据等创新方法,显著提升了代码覆盖率和故障检测能力。实验表明,该技术在6个真实API上的表现优于现有白盒和黑盒工具,尤其在处理NoSQL数据库的动态特性时优势明显。
解决的主要问题:
- 现有测试工具对MongoDB等NoSQL数据库支持不足的问题;
- 难以生成能触发特定数据库状态的测试用例的问题;
- 只读API或复杂交互场景下的数据准备难题。
主要成果:
- 一套适用于MongoDB的测试生成技术,代码覆盖率最高提升18%;
- EvoMaster工具的开源扩展,可直接应用于实际项目;
- 为NoSQL数据库的API测试提供了新的研究思路。