软件测试的目的是以最小成本发现尽可能多的缺陷,而测试用例的质量直接决定测试效果。人工编写用例依赖经验,容易遗漏边界条件和异常途径。AI 自动化测试生成为了从代码、模型、需求文档或运行轨迹中自动推理出有效、高包括、可执行的测试用例,将测试人员从重复劳动中解放出来,聚焦于更高方面的测试设计。近年来,从根据搜索的优化算法到大规模预训练语言模型,AI 测试生成技术经历了从启发式到认知型的跨越,其研究横跨软件工程、程序分析和人工智能多个领域。
1. 技术体系
根据搜索的测试生成(SBST)
将测试生成建模为组合优化问题,利用遗传算法、模拟退火等元启发式方法,以代码包括率(分支、语句、变异)为适应度函数,进化生成测试输入序列。代表性工作 EvoSuite 可针对 Java 类自动生成 JUnit 测试套件,动态执行并不断进化,兼顾包括率和断言质量。该类方法的优点是白盒导向、可精确度量,但容易陷入局部最优,且难以处理复杂对象状态。
符号执行和混合驱动
符号执行沿程序途径收集约束,通过约束求解器产生具体输入。AI 在此常以约束求解加速或途径选择方法的形式出现,如用强化学习引导途径探索顺序,避免途径爆炸。结合符号执行和模糊测试(fuzzing)的混合框架,利用轻量级动态分析快速触达深度途径,再用符号执行求解精确输入,是工业界漏洞挖掘的主流方式。
机器学习和强化学习
有监督学习:从大量(被测函数,已有测试用例)对中学习映射,如推断输入边界或断言方式。
无监督/聚类:对 API 流量或用户会话聚类,提取典型交互序列作为基线测试。
强化学习:将被测应用视为环境,测试代理通过交互获得包括率或崩溃反馈,学习生成能最大化长期回报的操作序列。典型如 Android 测试工具 Sapienz,使用多目的遗传算法,但 RL 变体(如 Q-learning)在 GUI 探索中表现优异,可自动适应界面变化。
根据深度学习的序列生成
将测试输入视为序列,利用 RNN、LSTM 乃至 Transformer 直接生成测试数据或测试代码。DeepTest 针对自动驾驶系统,用 CNN + RNN 生成逼真的驾驶场景图像序列,以触发转向角偏差。在单元测试领域,AthenaTest 等工具用抽象语法树(AST)途径编码方法体,再解码生成带有断言的测试代码,实现端到端的测试合成。该类方法擅长模拟真实数据分布,但生成结果的可解释性和可靠性较弱。
自然语言处理和需求驱动的生成
从需求文档、用户故事或 Gherkin 语法的 BDD 场景中,通过 NLP 提取行为描述、参和者和条件,映射为结构化测试用例。早期依赖规则和语义分析,现在逐步被预训练语言模型替代。AI 不仅能生成测试步骤,还能推导预期结果,将测试设计也纳入自动化范围。
大语言模型的崛起
随着 GPT-4、Code Llama、StarCoder 等代码大模型成熟,根据提示的测试生成成为研究新范式。只需将函数签名、Javadoc/注释、或需求描述作为提示,模型即可输出高完整度的测试函数,甚至包含 Mock、异常场景和边界检查。研究进一步延伸至:
零样本/少样本泛化:无需微调即可为陌生项目生成测试。
测试预言生成:让LLM直接推断预期行为,缓解无Oracle难题。
自愈型测试:代码重构后,LLM根据变更自动修复测试脚本。
2. 应用领域和方法
在不同测试方面和场景中,AI技术的不同各有不同,此处以领域分类展开说明。
单元测试方面,代表方法及工具包括EvoSuite、Pynguin以及GitHub Copilot等,技术集中于根据搜索的测试生成、大语言模型以及AST编码。搜索算法擅长包括白盒途径,而LLM则在快速生成符合惯例的用例上优势明显。
API 和 Web 服务测试领域,Schemathesis、RESTler 和Postman AI等工具被广泛使用,其技术重要是根据规约的模糊测试和强化学习,能根据OpenAPI等规范自动推导请求序列并检验响应一致性。
GUI 和移动应用测试中,Sapienz、AppFlow 以及根据强化学习的探索代理成为主流,它们将界面操作建模为序列决定问题,利用强化学习或计算机视觉技术适应动态界面,生成包括深层交互的用例。
性能测试方面,以流量回放加变异为典型方式,常用序列生成模型(如 VAE、GAN)学习真实流量特征,生成具有相似统计特性的请求序列,用于压力测试和容量考虑。
安全测试则多采用 AFL++ 和强化学习的结合,以及 DeepHunter 等工具,通过模糊测试途径选择的智能优化和符号执行混合,提升漏洞触达效率。
BDD 和验收测试领域,Copilot for Cucumber、SpecFlow AI 等工具借助LLM和NLP语义理解能力,从自然语言描述的场景中直接生成可执行的测试步骤和断言。
3. 挑战
测试预言问题
自动生成测试的输入相对容易,但判断输出是不是正确(Oracle)是根本难题。目前依赖崩溃检测、不变量推断、蜕变测试或 LLM 模拟预期,但均不彻底。
生成结果的有效性和可读性
AI可能生成语法正确但语义荒谬的测试、永不失败的重复途径,或难以维护的晦涩代码。测试的可维护性和开发者的信任程度是落地重点。
复杂状态和环境依赖
涉及数据库、外部服务、文件系统时,需自动搭建沙箱并 Mock 依赖。AI 在处理复杂环境 setup 时仍显笨拙,常导致生成测试无法独立执行。
包括率和真实缺陷的鸿沟
高包括率不代表能发现真实业务缺陷。AI 测试生成需和风险分析、变异测试结合,提升缺陷发现能力。
大模型的幻觉和数据泄漏
LLM 可能生成调用不存在 API 的“幻觉测试”,或直接复现训练数据中的开源测试,带来版权和有效性风险。
4. 代表性工具和框架
学术开源
EvoSuite:Java 单元测试生成,GitHub万星,不断维护,是 SBST 标准。
Pynguin:面向 Python 的自动化单元测试生成,支持 SBST 和随机方法。
DeepXplore:深度学习系统差分测试,白盒生成触发神经元包括的输入。
Schemathesis:根据 OpenAPI 规约的属性化测试生成,自动检测服务器端违背。
工业级平台
GitHub Copilot / Copilot Test Generation:在IDE内根据函数体或需求注释放生成测试,开发者可交互式调整。
Diffblue Cover:企业级Java单元测试自动生成,专注可维护性。
Katalon Studio AI:Web/API/移动端智能测试录制和自愈,AI辅助元素定位。
Testim, Functionize, Mabl:根据机器学习的端到端测试平台,自动生成UI场景用例。
5. 最新研究展望
大语言模型驱动的全流程测试代理
从理解需求 - 设计测试方法 - 生成测试脚本 - 执行和诊断 - 缺陷报告,创建自主测试流水线,如 Devin 式的测试智能体。
多模态 GUI 测试
结合视觉(截图)和方面结构(DOM/View Tree),用视觉-语言模型理解界面语义,生成跨语言、跨平台的健壮测试操作。
测试预言自动推断
通过大模型分析函数注释、历史运行日志或相似函数行为,自动生成回归断言,大幅降低人工编写断言的负担。
不断测试和自演进测试套件
在CI/CD中,AI监控代码变更和线上流量,动态淘汰低效测试,生成针对热点途径的新用例,实现测试套件的“代谢”。
面向非功能需求的生成
生成针对安全漏洞、性能短板、可访问性违规的专门测试,结合领域知识图谱。
可解释和可信测试生成
使生成过程透明,提供包括率、风险分析、生成理由,增强测试团队对AI生成产物的审核和管控。