基于通用LLM的一次测试用例自动生成的实验
选择很多,最后选择了讯飞的星火做本次实验,原因还是因为讯飞的LLM的API是有免费额度的,案例代码相对比较成熟易学易用
1 LLM和基于LLM的应用
最近这段实际LLM已经变成了一个炙手可热的词汇,现在任何技术不了到LLM都感觉好像没有彻底聊完一样。那么LLM到底是什么呢?其实LLM(大语言模型)是一种语言模型,由具有许多参数的人工神经网络组成,使用自监督学习或半监督学习对大量未标记文本进行训练。大型语言模型在2018年左右出现,并在各种任务中表现出色。这里面的大其实也是相对的,那么多少参数算大、多少参数又算小确实没有一个通用的定义,通常指的是参数数量在数十亿或更多数量级的模型就算大模型。
训练一个模型一般都是通过如上三个步骤完成的,先去确定一个候选算法的集合,然后确定一种评价方法,在这种评价方法上找到优的算法,最终达到预期目标的过程就是模型训练的过程。
训练一个模型一般需要很长时间,那么构建一个基于 LLM 的应用就需要更长时间。随着 Prompt 的发展现在基于 prompt 构建一个应用系统已经变的时间越来越多,有很多在几小时只能就能完成开发。
2 LLM生成测试用例
本文就在充分描述Prompt之上,构建了一个通过通用模型生成测试用例的例子(这只是一个demo)。为了方便,我先把被测试系统的逻辑(类似条目化的需求陈述如下)。
被测系统是地铁车票自助购票软件系统需求,系统只接收 5元或10元纸币,一次只能使用一张纸币,车票只有两种面值 5 元或者 10 元。其中:
- 若投入5元纸币,并选择购买5元面值票,完成后出票,提示购票成功。
- 若投入5元纸币,并选择购买10元面值票,提示金额不足,并退回5元纸币。
- 若投入10元纸币,并选择购买5元面值票,完成后出票,提示购票成功,并找零5元。
- 若投入10元纸币,并选择购买10元面值票,完成购买后出票,提示购买成功。
- 若输入纸币后在规定时间内不选择票种类的按钮,退回的纸币,提示错误。
- 若选择购票按钮后不投入纸币,提示错误
看到这个测试流程应用测试用力设计方法,设计测试用例如下图:
那么调用讯飞的 spark 生成测试用例的例如代码如下:
import SparkApi
import os
from dotenv import load_dotenv, find_dotenv
#加载环境变量
_=load_dotenv(find_dotenv())
appid = os.getenv("SPARK_APP_ID")
api_secret=os.getenv("SPARK_APP_SECRET")
api_key=os.getenv("SPARK_APP_KEY")
#用于配置大模型版本,默认“general/generalv2”
# domain = "general" # v1.5版本
domain = "generalv2" # v2.0版本
#云端环境的服务地址
# Spark_url = "ws://spark-api.xf-yun.com/v1.1/chat" # v1.5环境的地址
Spark_url = "ws://spark-api.xf-yun.com/v2.1/chat" # v2.0环境的地址ws(s)://spark-api.xf-yun.com/v2.1/chat
text =[]
# length = 0
def getText(role,content):
jsoncon = {}
jsoncon["role"] = role
jsoncon["content"] = content
text.append(jsoncon)
return text
def getlength(text):
length = 0
for content in text:
temp = content["content"]
leng = len(temp)
length += leng
return length
def checklen(text):
while (getlength(text) > 8000):
del text[0]
return text
if __name__ == '__main__':
text.clear
while(1):
Input = input("\n" +"我:")
softprompt = "你是一名资深测试工程师,下面你会用等价类法设计测试用例,请根据下面的业务描述设计接口参数的入参:"
question = checklen(getText("user",softprompt+Input))
SparkApi.answer =""
print("星火:",end = "")
SparkApi.main(appid,api_key,api_secret,Spark_url,domain,question)
getText("assistant",SparkApi.answer)
# print(str(text))
运行后,输入我们的业务逻辑后,LLM给设计的测试用例如下:
仔细分析一下如上流程,其实比人工设计的还要精简,但是按照业务流程的覆盖度上而言,确实还是很好的,人工可以通过完善一下对应的 cases 就可以执行测试了。
3 总结
如上就是一个小实验,尝试使用LLM帮助测试工程师,实验中可以看出prompting base构建的系统就足以满足测试工程师工作的助手的要求了,只要设计好prompt,并且给prompt足够的信息,那么就可以得出有效的测试用例,但是这距离工程化还有一段很长的路要走。