背景
随着人工智能(AI)技术的迅速发展,AI在软件测试中的应用也变得越来越广泛。尤其是大模型的引入,使得生成高质量的测试用例变得更加便捷和高效。然而,为了确保生成的测试用例能真正满足质量要求,需要采用一种迭代优化的方法。本文将介绍一种通过AI输入测试点生成测试用例,并通过测试用例评价系统不断优化测试用例的方法,直至满足质量阈值为止,模拟人与大模型交互。
技术引入
大规模预训练语言模型如GPT-4等,可以通过自然语言处理技术,生成与输入内容相关的高质量文本。这些模型利用大量的训练数据,学习语言模式和语义关系,从而能够在接收到输入后生成相关的测试用例。但是,这么好的东西缺点也很明显:太TM太贵,贫道根本负担不起,只能曲线救国。
首先本地运行开源大模型,将处理需求文档,仍然利用大模型分段、分句分词和训练等等操作,得到功能点,将功能点输入给大模型,让其输出测试用例(本文不讨论需求文档处理这部分内容)。然而,仅依靠初始生成的测试用例是不够的,需要一个系统性的迭代优化过程来确保测试用例的质量。大体思路:使用开源大模型,调用api输入功能点,将输出的测试用例作为输入接入评价系统,由评价系统根据算法评估后得出优化建议,再将建议作为输入交给大模型......直到评价系统输出分数达到阈值时,停止。
开搞开搞
先看看大模型生成的测试用例
输入测试点
在开始生成测试用例之前,需要确定测试点,即需要测试的功能或特性。测试点可以通过人工设定,也可以通过自动化工具从代码或需求文档中提取。这里使用NLP+大模型也是可以处理的,大家可以慢慢研究,很讨厌需求分析到测试用例编写的童鞋,很值得研究。假设已经将需求拆分为各个测试功能点了(以用户登录为例),那直接调用本地大模型:
python newbee.py --str="用户登录" -c 2
生成初始测试用例
确定测试点后,将这些测试点输入到大模型中。大模型会根据输入的测试点,生成初步的测试用例。这些测试用例包含了输入条件、执行步骤和预期结果。生成的测试用例应该覆盖功能的各个方面,包括正常流程和异常流程。(tips:使用大模型,提示词很关键,貌似预测将来会有个提示词岗位)
分析输出
输出的测试用例,看着还行啊,毕竟耗时在那摆着,覆盖度及质量so far so good啦,手写的话也得好一会呢。话虽如此,但是仍然还有提升空间:
1、有部分内容有缺失,如个别测试步骤或预期结果,最可恨的是“见上文”、“同TestcaseNo_xxx”这种,要写入excel还得处理一下
2、覆盖度差点,如编写测试用例常用的方法:正态测试、负载测试、边界值测试和等价类划分等等,都有了么?
当然可以通过跟大模型交互,(大模型有记忆的、通过上下文....)只要不停的追问和调整提示词,让其输出更满意答案。so 为什么不把这部分也交给程序呢???说干就干。
测试用例评价系统
定义
需求是将生成的测试用例输入到测试用例评价系统中进行评估。评价系统通过预定的算法,对测试用例的覆盖率、冗余度、边界条件和异常处理等方面进行评估。评价指标包括测试覆盖率及质量,先整简单的,后面再补充优化如(缺陷发现率和冗余度等等)。
根据需求,我们可以定义评价系统为函数E,输入为测试用例数据和评价规则,输出为综合评分和改进建议:
-
输入 T: 测试用例集,形式化表示为 T = {t1,t2,…,tn},ti = { 功能点,测试类型,前置条件,步骤,预期结果 }
R: 评价规则集,形式化表示为 R = {r1,r2,…,rm},rj:T → {0,1},每个规则 rj是一个布尔函数,用于判断 T是否满足该规则。
-
输出 S(T,R)::综合评分,范围为 [0,100]。 C(T,R): 改进建议,形式为建议列表 C={c1,c2,…,ck}。
综合评分公式
根据上述定义,可以得出综合评分:
其中:Wcoverage,Wquality,Wcustom是评分权重,满足:
Wcoverage + Wquality + Wcustom = 1
Scoverage,Squality,Scustom分别表示覆盖度评分、质量评分和自定义规则评分。
覆盖度评分
质量评分
自定义规评分
改进建议公式
针对每个规则未通过的测试用例改进建议
如果规则 rj 未满足,生成建议 cj:
功能点{XXX}覆盖不足时:建议添加未覆盖功能点{xxx}的测试用例。
边界值测试不足时:建议增加边界值测试的覆盖。
自定义规则未满足时:提示具体规则。
示例演示
拿上述“用户登录”生成的测试用例作为一个示例:
输入:
测试用例集T:
T = {
"t1": {
"功能点": "用户登录",
"测试用例生成类型": "正太测试",
"前置条件": "系统已经安装并启动,数据库中有至少一个用户记录,用户名和密码的输入框在界面上可见且可操作",
"测试步骤": [1、2、3、],
"期望结果": "系统显示欢迎信息,提示用户登录成功"}
},
"t2"......
}
规则集 R:
r1(T): 所有功能点是否都有测试(本例只对一个功能点,so True)。
r2(T): 是否覆盖所有测试类型(正态测试、负载测试、边界值测试和等价类划分等等)。
r3(T): 是否为每个用例定义了预期结果(可以根据实际情况,如前置条件、测试步骤等)。
计算过程:
假设Wcoverage,Wquality,Wcustom的评分权重分别为0.4、0.4、0.2,将输入带入评分系统公式计算结果及改进建议。如覆盖为4/5、质量为2/3、自定义规则0,则综合得分:
S(T,R) = 0.4 * 4/5 + 0.4 * 2/3 + 0.2 * 0 = 0.59
改进建议:
C(T,R) =
{
"TestcaseNo_002": "缺少前置条件",
"TestcaseNo_003": "未覆盖测试类型负载测试",
"TestcaseNo_004": "缺少预期结果或预期结果描述错误"
}
分析和优化建议
根据评价系统的反馈,生成的测试用例可能存在一些问题,比如覆盖率不足、冗余度高或未考虑边界条件。评价系统会提供具体的优化建议,如增加某些测试用例、修改某些步骤或补充边界测试。
迭代优化
将评价系统的优化建议再次输入大模型,生成新一轮的测试用例。通过这种反馈循环,不断优化测试用例,确保其覆盖面广、质量高。每次迭代后,新的测试用例将再次输入评价系统进行评估,形成一个闭环的优化流程。
设定质量阈值
在迭代优化的过程中,设定一个质量阈值。当测试用例的评价指标达到或超过这个阈值时,认为测试用例质量已经达标,可以结束当前的优化迭代。这种方法确保了最终生成的测试用例具有足够的覆盖率和质量,可以有效发现潜在的缺陷。
结论
通过以上步骤,模拟人与大模型交互,可以优雅地让大模型输出高质量的测试用例。使用AI生成测试用例并通过评价系统进行迭代优化,不仅提高了测试用例的质量,还大大提升了测试效率。这种方法适用于各种规模的软件项目,特别是在快速迭代和持续交付的环境中,更能体现其优势。