1. 项目背景与核心思路
去年在给一个金融系统做自动化测试时,我遇到了一个头疼的问题——断言逻辑总是写不到位。要么覆盖不全边界条件,要么误判了正常业务场景。每次测试失败排查下来,十有八九都是断言写得不够严谨。这让我开始思考:能不能让AI来学习我们项目的历史Bug,自动生成更可靠的断言代码?
于是我开始收集团队近三年积累的测试用例和对应的Bug报告,筛选出100个典型的断言相关缺陷。这些案例覆盖了空指针异常、数值精度问题、集合元素缺失、状态机跳转错误等常见场景。通过分析发现,80%的缺陷其实都集中在20%的典型模式里,这为AI训练提供了可能性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据准备与特征工程
2.1 原始数据清洗
原始Bug报告数据主要来自JIRA系统,需要做以下处理:
- 提取关键字段:问题描述、重现步骤、根本原因、修复方案
- 标准化表述:将"nil"、"null"、"空值"等不同表述统一为"null"
- 代码片段提取:用正则匹配代码块,保留方法上下文
python复制# 示例:从Markdown格式的Bug报告中提取代码
import re
def extract_code(text):
pattern = r'```java(.*?)```'
matches = re.findall(pattern, text, re.DOTALL)
return [m.strip() for m in matches]
2.2 断言模式标注
将每个Bug对应的断言缺失/错误情况分类标注:
- 空值检查缺失(NullCheck)
- 范围验证不足(Range)
- 集合包含错误(Collection)
- 状态转移遗漏(State)
- 时间顺序错误(Sequence)
json复制// 标注示例
{
"bug_id": "PROJ-487",
"type": "Collection",
"bad_code": "assert(items.size() > 0);",
"fixed_code": "assert(items.stream().anyMatch(i -> i.status == ACTIVE));"
}
