[论文解读] DeepRNG: Towards Deep Reinforcement Learning-Assisted Generative Testing of Software
本文提出 DeepRNG,一种基于深度强化学习(DRL)的生成式测试框架,通过使用高效且可自动提取的调用栈状态表示,将 DRL 代理与随机数生成器(RNG)结合,从而增强软件测试。该框架在包含超过 350,000 行代码的大型区块链框架 Cosmos SDK 中,实现了统计上显著的测试覆盖率提升,并发现了此前未知的缺陷。
Although machine learning (ML) has been successful in automating various software engineering needs, software testing still remains a highly challenging topic. In this paper, we aim to improve the generative testing of software by directly augmenting the random number generator (RNG) with a deep reinforcement learning (RL) agent using an efficient, automatically extractable state representation of the software under test. Using the Cosmos SDK as the testbed, we show that the proposed DeepRNG framework provides a statistically significant improvement to the testing of the highly complex software library with over 350,000 lines of code. The source code of the DeepRNG framework is publicly available online.
研究动机与目标
- 为解决在生成式测试背景下,为复杂软件系统生成有效且多样化测试输入的挑战。
- 提升大规模系统(如拥有超过 350,000 行代码、对区块链基础设施至关重要的 Cosmos SDK)的软件测试效率与覆盖率。
- 开发一种可直接将深度强化学习集成到 RNG 过程中的框架,无需手动插桩或代码修改。
- 评估在 DRL 代理的状态表示中引入状态、动作和奖励的历史记录,是否能提升测试覆盖率与缺陷检测能力。
- 证明该框架在识别真实世界软件中先前未知漏洞方面的实际有效性。
提出的方法
- 该框架使用被测软件的完整调用栈作为轻量级、可自动提取的状态表示,替代复杂或低效的表示方式(如覆盖率位图)。
- 采用深度强化学习代理(使用 IMPALA 训练)生成随机数,以最大化测试覆盖率并触发软件故障。
- 代理的状态表示包含过去的状态、动作和奖励(SAR)历史,从而在不截断历史上下文的前提下实现灵活且鲁棒的学习。
- 状态表示被编码为执行过程中观察到的唯一调用栈模式的一对一向量,即使在大型系统中也能实现高效处理。
- 代理根据分支覆盖率的提升获得密集的每步奖励,若检测到测试失败(即缺陷),则获得最终 1.0 的奖励。
- 该系统被集成到 Cosmos SDK 的测试环境中,其中 DRL 代理直接控制测试生成器所使用的 RNG,取代默认的随机数生成机制。
实验结果
研究问题
- RQ1深度强化学习代理是否能通过增强随机数生成器,在大规模软件系统中有效提升测试覆盖率?
- RQ2基于调用栈的状态表示是否在测试覆盖率和效率方面优于传统的覆盖率位图表示?
- RQ3在 DRL 代理的状态表示中引入状态、动作和奖励的历史记录(SAR)对代理性能与鲁棒性有何影响?
- RQ4所提出的框架是否能识别出复杂真实世界软件系统(如 Cosmos SDK)中先前未知的缺陷?
- RQ5与默认的随机测试相比,使用 DeepRNG 框架是否在测试覆盖率提升上具有统计显著性?
主要发现
- DeepRNG 框架在 Cosmos SDK 上实现了统计上显著的测试覆盖率提升,其中 CS-SAR 配置的覆盖率达到 11.876%,相较于基线的 11.861%,p = 0.012。
- 尽管覆盖率位图(CB)携带更多信息,但仅使用调用栈(CS)表示的性能仍优于 CB 表示,表明信息密度并不总与强化学习测试中的性能正相关。
- 引入奖励历史(SAR)后性能得到提升,包含 SAR 的配置在多次运行中均表现出最显著的改进与鲁棒性。
- 该框架成功发现了 Cosmos SDK 中至少两种新型缺陷:非法初始化与意外超时。
- 使用轻量级、可自动提取的调用栈表示,实现了高效且可扩展的集成,且无需修改源代码。
- 结果表明,DRL 代理可通过学习状态、动作和奖励的历史,有效引导测试生成,从而更高效地探索复杂软件的状态空间。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。