通过Chain Prompts方式将LLM的能力引入测试平台:正交实验测试用例生成

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
Elasticsearch Serverless检索通用型,资源抵扣包 100CU*H
简介: 通过Chain Prompts方式将LLM的能力引入测试平台:正交实验测试用例生成

通过Chain Prompts方式将LLM的能力引入测试平台:正交实验测试用例生成


Chain Prompts


Chain Prompts是指在一个对话或文本生成任务中,将前一个提示的输出作为下一个提示的输入,形成一个连续的链条。这种方法常常用于创建连贯的、有上下文关联的文本。在对话系统中,这种方法可以模拟真实对话中的连续性,使得生成的回复更加自然和流畅。


利用Chain Prompts,可以将LLM、外部程序、外部数据连接到一起,实现一个完整的解决方案。下面我们使用Chain Prompts的方式实现正交实验测试用例生成。


STEP1:LLM gen参数的边界值

> 文中使用的LLM是讯飞的星火2.0


首先,借助LLM的能力,设计CoT的Prompt实现让大模型返回每个参数的边界值数组,具体的代码如下:

'''
@des  :针对LLM反馈的内容,做一些文本处理,最终仅仅留下边界的数组返回
@params  : LLM反馈的内容
@return  : 处理好的,仅仅剩下list类型的边界值列表
'''
def get_boundary(content):
    result_boundary_list=[]
    if content.find("[") != -1:
        while content.find("[") != -1:
            if  content.find("[")!= content.find("]")+1:
                try:
                    stemp = content[content.index("["):content.index("]")+1]
                    # pattern = r'#.*?\n'
                    # stemp=re.sub(pattern,"",stemp)
                    result=eval(stemp)
                    result_boundary_list.append(result)
                    content = content.replace(content[content.index("[")],"")
                    content = content.replace(content[content.index("]")],"")
                except Exception as e:
                    content = content.replace(content[content.index("[")],"")
                    continue
            else:
                content = content.replace(content[content.index("[")],"")
                content = content.replace(content[content.index("]")],"")
        return result_boundary_list
    else:
        return []
'''
@des  :和大模型交互,生成边界值数组
@params  : 描述变量的Prompts   
@return  :边界值list
'''
def gen_boundary(usr_message_list):
    # 分隔符
    boundary_param_list=[]
    delimiter = "####"
    if len(usr_message_list)<1:
        return [{"error":"no user param prompt!"}]
    for usr_message in usr_message_list:
        text.clear
        # user_message = f"""{usr_message}{delimiter}。"""
        boundary_message=f"""{delimiter}设计参数的边界值,{usr_message}。
                            {delimiter}边界值还要包含不满足要求的一些内容,并将结果放到到一个数组中,不要返回python代码,只返回一个具体数组内容,不要包含任何注释。
                    """
        system_message = f"""{delimiter}是分隔符。{delimiter}你是一名资深测试工程师,{boundary_message}{delimiter}。"""
        SparkApi.answer=""
        question = checklen(getText("user",system_message))
        SparkApi.main(appid,api_key,api_secret,Spark_url,domain,question)
        try:
            boundary_param_list.append(get_boundary(SparkApi.answer))
        except Exception as e:
            print("error:"+SparkApi.answer+"\"}")
    # print(boundary_param_list)
    return boundary_param_list


STEP2 通过传统编码寻找参数的因素和水平,强度默认是2


接下来,我们需要将大模型处理后的反馈处理成Python可以处理的对象,然后处理成正交表的因素和水平字典。

factors = {}
    levels=[]
    istep = 0
    factors['username']=list[0][0]
    factors['password']=list[1][0]


         

STEP3:通过itertool处理,完成正交表设计和测试用例生成

@des  :生成正交表
@params  :每个因素的水平数list     
@return  :正交表(array)
def generate_orthogonal_table(levels):
    return list(itertools.product(*[range(1, l+1) for l in levels]))


通过统一的入口,调用上述步骤,完成测试用例设计


#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
@File    :   main.py
@Time    :   2023/10/18 13:12:25
@Author  :   CrissChan 
@Version :   1.0
@Site    :   https://blog.csdn.net/crisschan
@Desc    :   主要函数,尝试使用Chain Prompts的方式构建基于正交试验的测试用例生成
             step1:LLM gen参数的边界值
             step2:寻找参数的因素和水平,强度默认是2
             step3:LLM 生成正交表
             step4 用正交表替换测试用例
'''
from gen_boundary import gen_boundary
from gen_boundary import generate_orthogonal_table
import numpy as np
if __name__ == '__main__':
    # step 1 :调用LLM通过Prompt生成参数的边界值。        
    user_message_list=[]
    user_message_1 = f"""username是一个系统的用户名,string类型,长度限制10个字符,不能为空。"""
    user_message_2 = f"""password是一个系统用户的密码,string类型,长度限制10个字符,不能为空。"""
    user_message_list.append(user_message_1)
    user_message_list.append(user_message_2)
    list = gen_boundary(user_message_list)
    print(list)
    # step2 : 寻找参数的因素和水平,强度默认是2
    factors = {}
    levels=[]
    istep = 0
    factors['username']=list[0][0]
    factors['password']=list[1][0]
    # step 3: python计算正交表
    levels_list=[]
    # 创建强度为2的正交表
    for k,v in factors.items():
        levels_list.append(len(v))
    art_array = generate_orthogonal_table(levels_list)
    #step4:将正交表替换测试用例
    tc_list = []
    for a_arr in art_array:
        tc_list.append((factors['username'][a_arr[0]-1],factors['password'][a_arr[1]-1]))
    print(tc_list)

运行结果

请注意,这只是一个示例,实际的数组内容可能会根据具体需求而有所不同。

因素和水平数组:

[[['', '12345678901', 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '!@#$%^&*()', 'username', 'extra_long_username_that_exceeds_the_limit', '']], 
[['', '1234567890', 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'password', 'passw0rd', 'Passw0rd!', 'p@ssw0rd', 'p@$$w0rd', 'p@ssword']]]


生成的测试用例

 [('', ''), 
('', '1234567890'), 
('', 'abcdefghijklmnopqrstuvwxyz'),
('', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 
('', 'password'), 
('', 'passw0rd'), 
('', 'Passw0rd!'), 
('', 'p@ssw0rd'), 
('', 'p@$$w0rd'), 
('', 'p@ssword'), 
('12345678901', ''), 
('12345678901', '1234567890'), 
('12345678901', 'abcdefghijklmnopqrstuvwxyz'),
('12345678901', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'),
('12345678901', 'password'), 
('12345678901', 'passw0rd'), 
('12345678901', 'Passw0rd!'), 
('12345678901', 'p@ssw0rd'), 
('12345678901', 'p@$$w0rd'), 
('12345678901', 'p@ssword'), 
('abcdefghijklmnopqrstuvwxyz', ''), 
('abcdefghijklmnopqrstuvwxyz', '1234567890'), 
('abcdefghijklmnopqrstuvwxyz', 'abcdefghijklmnopqrstuvwxyz'), ('abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), ('abcdefghijklmnopqrstuvwxyz', 'password'), ('abcdefghijklmnopqrstuvwxyz', 'passw0rd'), ('abcdefghijklmnopqrstuvwxyz', 'Passw0rd!'), ('abcdefghijklmnopqrstuvwxyz', 'p@ssw0rd'), ('abcdefghijklmnopqrstuvwxyz', 'p@$$w0rd'), ('abcdefghijklmnopqrstuvwxyz', 'p@ssword'), ('ABCDEFGHIJKLMNOPQRSTUVWXYZ', ''), 
('ABCDEFGHIJKLMNOPQRSTUVWXYZ', '1234567890'), ('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), ('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), ('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'password'), ('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'passw0rd'), ('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'Passw0rd!'), ('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'p@ssw0rd'), ('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'p@$$w0rd'), ('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'p@ssword'),
('!@#$%^&*()', ''),
('!@#$%^&*()', '1234567890'),
('!@#$%^&*()', 'abcdefghijklmnopqrstuvwxyz'), 
('!@#$%^&*()', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 
('!@#$%^&*()', 'password'), 
('!@#$%^&*()', 'passw0rd'), 
('!@#$%^&*()', 'Passw0rd!'), 
('!@#$%^&*()', 'p@ssw0rd'), 
('!@#$%^&*()', 'p@$$w0rd'), 
('!@#$%^&*()', 'p@ssword'), 
('username', ''), 
('username', '1234567890'), 
('username', 'abcdefghijklmnopqrstuvwxyz'), 
('username', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 
('username', 'password'), 
('username', 'passw0rd'),
('username', 'Passw0rd!'),
('username', 'p@ssw0rd'), 
('username', 'p@$$w0rd'), 
('username', 'p@ssword'), 
('extra_long_username_that_exceeds_the_limit', ''), 
('extra_long_username_that_exceeds_the_limit', '1234567890'), ('extra_long_username_that_exceeds_the_limit', 'abcdefghijklmnopqrstuvwxyz'), ('extra_long_username_that_exceeds_the_limit', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), ('extra_long_username_that_exceeds_the_limit', 'password'), ('extra_long_username_that_exceeds_the_limit', 'passw0rd'), ('extra_long_username_that_exceeds_the_limit', 'Passw0rd!'), ('extra_long_username_that_exceeds_the_limit', 'p@ssw0rd'), ('extra_long_username_that_exceeds_the_limit', 'p@$$w0rd'), ('extra_long_username_that_exceeds_the_limit', 'p@ssword'), ('', ''), ('', '1234567890'), 
('', 'abcdefghijklmnopqrstuvwxyz'), 
('', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 
('', 'password'), 
('', 'passw0rd'), 
('', 'Passw0rd!'), 
('', 'p@ssw0rd'), ('', 'p@$$w0rd'), 
('', 'p@ssword')]





目录
相关文章
|
17天前
|
测试技术
|
2月前
|
人工智能 自然语言处理 JavaScript
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
Magnitude是一个基于视觉AI代理的开源端到端测试框架,通过自然语言构建测试用例,结合推理代理和视觉代理实现智能化的Web应用测试,支持本地运行和CI/CD集成。
315 15
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
|
2月前
|
测试技术 Shell
MindIE LLM场景快速上手实验
MindIE是昇腾自研推理框架,本实验手册可指导小白用户快速掌握MindIE在LLM(large language model)场景的基本功能,包括:大模型推理功能测试、大模型性能测试、大模型精度测试、服务化推理部署、benchmark测试等。
103 3
|
3月前
|
人工智能 自然语言处理 文字识别
解读 | 金融长上下文基准测试FailSafeQA:解锁金融领域LLM真实的审慎性和容错性
近年来,大型语言模型(LLMs)在金融领域的应用如火如荼,从风险分析到客户服务,它们正逐步改变行业的游戏规则。然而,这些模型是否真的足够“靠谱”?面对复杂的金融数据和多变的用户输入,它们还能保持精准和稳健吗?
115 8
解读 | 金融长上下文基准测试FailSafeQA:解锁金融领域LLM真实的审慎性和容错性
|
2月前
|
人工智能 自然语言处理 数据可视化
89.4K star!这个开源LLM应用开发平台,让你轻松构建AI工作流!
Dify 是一款开源的 LLM 应用开发平台,通过直观的可视化界面整合 AI 工作流、RAG 管道、智能代理等功能,助你快速实现从原型到生产的跨越。支持本地部署和云端服务,提供企业级功能与完整 API 接口。
|
5月前
|
前端开发 JavaScript 测试技术
使用ChatGPT生成登录产品代码的测试用例和测试脚本
使用ChatGPT生成登录产品代码的测试用例和测试脚本
147 35
|
5月前
|
前端开发 JavaScript Java
通过ChatGPT生成测试用例和测试脚本(2)
通过ChatGPT生成测试用例和测试脚本
126 21
|
5月前
|
数据挖掘 测试技术 项目管理
2025年测试用例管理看这一篇就够了 ----Codes 开源免费、全面的测试管理解决方案
Codes 是国内首款重新定义 SaaS 模式的开源项目管理平台,支持云端认证、本地部署、全部功能开放,并且对 30 人以下团队免费。它通过整合迭代、看板、度量和自动化等功能,简化测试协同工作,使敏捷测试更易于实施。并提供低成本的敏捷测试解决方案,如同步在线离线测试用例、流程化管理缺陷、低代码接口自动化测试和 CI/CD,以及基于迭代的测试管理和测试用时的成本计算等,践行敏捷测试。
2025年测试用例管理看这一篇就够了 ----Codes 开源免费、全面的测试管理解决方案
|
5月前
|
机器学习/深度学习 人工智能 缓存
基于英特尔平台加速 AI 应用及 LLM 推理性能介绍|龙蜥大讲堂第115期
本文摘自龙蜥大讲堂英特尔 AI 软件工程师黄文欢的分享,主要包括以下三个方面的内容: 1. 第五代英特尔至强处理器 2. LLM 推理加速框架 xFast Transformer 及其优化策略 3. 性能数据及 Demo 展示
161 0
|
9月前
|
测试技术
测试用例设计方法之基本路径测试法
基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法,设计出的测试用例要保证在测试中程序的语句覆盖100%,条件覆盖100%
538 7
测试用例设计方法之基本路径测试法