[论文阅读] 人工智能 + 软件工程 | 增强RESTful API测试:针对MongoDB的搜索式模糊测试新方法

发布于:2025-07-31 ⋅ 阅读:(37) ⋅ 点赞:(0)

增强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应用科学大学、奥斯陆城市大学计算机系

创新点

  1. 动态追踪MongoDB交互:通过代码 instrumentation 实时监控API对MongoDB的查询操作,记录所有未返回结果的过滤器(如“查找x=100的文档”),解决了“看不见数据库内部逻辑”的问题。

  2. NoSQL距离计算:为每个未命中的过滤器计算“距离”——评估现有数据库文档与满足过滤器条件的接近程度(例如,文档x=90与过滤器x=100的距离为10),给测试工具提供“优化方向”。

  3. 直接插入NoSQL数据:允许测试用例直接向MongoDB插入数据,无需通过API接口,尤其适合只读服务或复杂交互场景(比如API没有提供创建数据的接口,但测试需要特定初始数据)。

  4. 自适应数据格式推断:通过反射技术自动识别MongoDB集合中文档的预期格式(如字段类型),确保插入的数据能被API正确解析,避免因格式错误导致的测试失效。

研究方法和思路、实验方法

核心技术步骤

  1. 监控数据库交互
    在API运行时,通过 instrumentation 追踪MongoDB驱动的find()方法调用,记录查询过滤器和目标集合名称,相当于给数据库装了一个“监控摄像头”。

  2. 计算NoSQL距离
    对每个未返回结果的过滤器,遍历集合中的文档,根据过滤器条件(如$eq$gt)计算文档与条件的“距离”(参考分支距离算法),并取最小值作为该过滤器的优化目标。例如:

    • 过滤器为x=17,文档x=42,则距离为|42-17|=25
    • 多条件过滤器(如x=17且y="c")则通过归一化处理避免某一条件主导结果。
  3. 优化测试生成
    将NoSQL距离作为次要目标融入EvoMaster的搜索算法,在生成测试用例时,优先选择能减小距离的输入(如调整API请求参数),引导测试逐步接近满足过滤器的状态。

  4. 直接插入数据
    当通过API难以准备所需数据时,自动生成插入操作,直接向MongoDB写入符合格式的文档,并结合查询条件确保插入数据能触发目标代码路径。

实验设计

  • 测试对象:6个来自EMB corpus的真实RESTful API(总324个端点,84531行代码),均使用MongoDB且运行在JVM上。
  • 对比工具
    • 白盒:基础版EvoMaster(无MongoDB支持);
    • 黑盒:ARAT-RL、EvoMaster BB、Restler、Schemathesis(均为当前主流工具)。
  • 实验设置:每个API重复测试30次,每次测试时长1小时,评估指标为代码覆盖率和故障检测数。

主要贡献

  1. 显著提升测试效果:在6个API中,代码覆盖率平均提升7.3%,最高达18%(session-service API),5个API的提升具有统计显著性。

  2. 超越现有工具:与4种黑盒工具相比,新方法平均覆盖率达52.7%,排名第一,远超第二名(EvoMaster WB,43.8%)。

  3. 解决实际痛点

    • 支持只读API测试(无需通过接口创建数据);
    • 应对MongoDB动态schema挑战,减少因格式错误导致的测试失败;
    • 开源工具扩展(https://github.com/anonymousmongodb/fuzzing-nosql),可直接复用。
  4. 故障检测能力增强:在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)=mindc{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测试的代码覆盖率和故障检测能力,未来可探索与强化学习结合。

关键问题

  1. 问题:该研究提出的NoSQL启发式方法如何计算文档与过滤器的接近程度?
    答案:通过计算NoSQL距离实现。对于返回空结果的过滤器F,对集合c中的每个文档d,基于过滤器中的条件(如eq、eq、eqgt等)递归计算启发式分数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)=mindc{Hd(F)}

  2. 问题:实验中使用了哪些API,其规模如何?结果显示代码覆盖率提升的具体表现是什么?
    答案:实验使用6个来自EMB corpus的JVM REST API,共324个端点、1051个源文件、84531行代码(LOC)。代码覆盖率提升方面,平均从40.0%提升至47.3%,最高提升18%(session-service),5个API结果统计显著,4个API每次运行均优于基础版EvoMaster。

  3. 问题:与现有黑盒模糊测试工具相比,该研究的技术优势体现在哪里?
    答案:扩展后的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测试提供了新的研究思路。

网站公告

今日签到

点亮在社区的每一天
去签到