通过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')]





目录
相关文章
|
3月前
|
人工智能 自然语言处理 前端开发
CodeArena:在线 LLM 编程竞技场!用于测试不同开源 LLM 的编程能力,实时更新排行榜
CodeArena 是一个在线平台,用于测试和比较不同大型语言模型(LLM)的编程能力。通过实时显示多个 LLM 的代码生成过程和结果,帮助开发者选择适合的 LLM,并推动 LLM 技术的发展。
97 7
CodeArena:在线 LLM 编程竞技场!用于测试不同开源 LLM 的编程能力,实时更新排行榜
|
7月前
|
Kubernetes 测试技术 Perl
混沌测试平台 Chaos Mesh
混沌测试平台 Chaos Mesh
189 1
|
2月前
|
机器学习/深度学习 人工智能 缓存
基于英特尔平台加速 AI 应用及 LLM 推理性能介绍|龙蜥大讲堂第115期
本文摘自龙蜥大讲堂英特尔 AI 软件工程师黄文欢的分享,主要包括以下三个方面的内容: 1. 第五代英特尔至强处理器 2. LLM 推理加速框架 xFast Transformer 及其优化策略 3. 性能数据及 Demo 展示
101 0
|
8月前
|
传感器 数据采集 监控
LabVIEW电池管理系统测试平台
LabVIEW电池管理系统测试平台
99 4
|
4月前
|
人工智能 供应链 安全
AI辅助安全测试案例某电商-供应链平台平台安全漏洞
【11月更文挑战第13天】该案例介绍了一家电商供应链平台如何利用AI技术进行全面的安全测试,包括网络、应用和数据安全层面,发现了多个潜在漏洞,并采取了有效的修复措施,提升了平台的整体安全性。
166 4
|
4月前
|
监控 安全 测试技术
构建高效的精准测试平台:设计与实现指南
在软件开发过程中,精准测试是确保产品质量和性能的关键环节。一个精准的测试平台能够自动化测试流程,提高测试效率,缩短测试周期,并提供准确的测试结果。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
253 1
|
5月前
|
人工智能 监控 测试技术
云应用开发平台测试
云应用开发平台测试
111 2
|
5月前
|
存储 人工智能 Java
将 Spring AI 与 LLM 结合使用以生成 Java 测试
AIDocumentLibraryChat 项目通过 GitHub URL 为指定的 Java 类生成测试代码,支持 granite-code 和 deepseek-coder-v2 模型。项目包括控制器、服务和配置,能处理源代码解析、依赖加载及测试代码生成,旨在评估 LLM 对开发测试的支持能力。
154 1
|
5月前
|
人工智能 前端开发
大模型体验体验报告:OpenAI-O1内置思维链和多个llm组合出的COT有啥区别?传统道家理论+中学生物理奥赛题测试,名不虚传还是名副其实?
一个月前,o1发布时,虽然让人提前体验,但自己并未进行测试。近期终于有机会使用,却仍忘记第一时间测试。本文通过两个测试案例展示了o1的强大能力:一是关于丹田及练气的详细解答,二是解决一道复杂的中学生物理奥赛题。o1的知识面广泛、推理迅速,令人印象深刻。未来,或许可以通过赋予o1更多能力,使其在更多领域发挥作用。如果你有好的测试题,欢迎留言,一起探索o1的潜力。
258 1
|
4月前
|
监控 安全 测试技术
构建高效精准测试平台:设计与实现全攻略
在软件开发过程中,精准测试是确保产品质量的关键环节。一个高效、精准的测试平台能够自动化测试流程,提高测试覆盖率,缩短测试周期。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
124 0