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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 通过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')]





目录
相关文章
|
9月前
|
关系型数据库 测试技术 数据库
使用Docker搭建测试用例管理平台TestLink:简易指南
使用Docker搭建TestLink测试管理软件的步骤如下:首先,拉取`bitnami/mariadb`和`bitnami/testlink-archived`镜像。然后,启动MariaDB容器,创建数据库。接着,启动TestLink容器并连接到MariaDB。检查容器状态确保它们已启动。最后,访问`localhost:8099`以使用TestLink,默认用户名为`user`,密码为`bitnami`。这样,你就能在本地便捷地进行测试管理了。
|
11天前
|
前端开发 JavaScript 测试技术
使用ChatGPT生成登录产品代码的测试用例和测试脚本
使用ChatGPT生成登录产品代码的测试用例和测试脚本
62 35
|
11天前
|
前端开发 JavaScript Java
通过ChatGPT生成测试用例和测试脚本(2)
通过ChatGPT生成测试用例和测试脚本
49 21
|
27天前
|
数据挖掘 测试技术 项目管理
2025年测试用例管理看这一篇就够了 ----Codes 开源免费、全面的测试管理解决方案
Codes 是国内首款重新定义 SaaS 模式的开源项目管理平台,支持云端认证、本地部署、全部功能开放,并且对 30 人以下团队免费。它通过整合迭代、看板、度量和自动化等功能,简化测试协同工作,使敏捷测试更易于实施。并提供低成本的敏捷测试解决方案,如同步在线离线测试用例、流程化管理缺陷、低代码接口自动化测试和 CI/CD,以及基于迭代的测试管理和测试用时的成本计算等,践行敏捷测试。
2025年测试用例管理看这一篇就够了 ----Codes 开源免费、全面的测试管理解决方案
|
2月前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
79 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
19天前
|
机器学习/深度学习 人工智能 缓存
基于英特尔平台加速 AI 应用及 LLM 推理性能介绍|龙蜥大讲堂第115期
本文摘自龙蜥大讲堂英特尔 AI 软件工程师黄文欢的分享,主要包括以下三个方面的内容: 1. 第五代英特尔至强处理器 2. LLM 推理加速框架 xFast Transformer 及其优化策略 3. 性能数据及 Demo 展示
|
5月前
|
测试技术
测试用例设计方法之基本路径测试法
基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法,设计出的测试用例要保证在测试中程序的语句覆盖100%,条件覆盖100%
301 7
测试用例设计方法之基本路径测试法
|
9月前
|
机器学习/深度学习 数据采集 人工智能
【专栏】AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计
【4月更文挑战第27天】本文探讨了AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计。AI辅助工具利用机器学习、自然语言处理和图像识别提高效率,但面临数据质量、模型解释性、维护更新及安全性挑战。未来,AI将更注重用户体验,提升透明度,并在保护隐私的同时,通过联邦学习等技术共享知识。AI在软件测试领域的前景广阔,但需解决现有挑战。
1091 6
|
6月前
|
存储 人工智能 自然语言处理
无缝融入,即刻智能[二]:Dify-LLM平台(聊天智能助手、AI工作流)快速使用指南,42K+星标见证专属智能方案
【8月更文挑战第8天】无缝融入,即刻智能[二]:Dify-LLM平台(聊天智能助手、AI工作流)快速使用指南,42K+星标见证专属智能方案
无缝融入,即刻智能[二]:Dify-LLM平台(聊天智能助手、AI工作流)快速使用指南,42K+星标见证专属智能方案
|
9月前
|
异构计算
FPGA片内ROM测试实验(二)
FPGA片内ROM测试实验
104 1