当前位置: 首页 > article >正文

测试用例生成平台通过大模型升级查询功能,生成智能测试用例

在测试工作中,查询功能是各类系统的核心模块,传统的测试用例编写往往耗时且重复。如何让老旧平台焕发新活力?本文将结合大模型技术,通过用户输入的字段信息,自动化生成高效、精准的测试用例。同时,我们还将介绍如何在 Django 框架中异步调用阿里云的 DeepSeek-R1 API,避免阻塞主线程,从而进一步提升系统性能。点击底部小卡片了解更多AI测试话题。


一、传统查询功能的痛点

在老旧平台中,查询功能面临以下问题:

  1. 测试用例编写耗时:每次需求变更后,测试用例需要手动更新,效率低下。
  2. 用例质量参差不齐:测试人员的理解差异导致用例覆盖率和场景设计不足。
  3. 缺乏智能化:无法根据用户输入的字段信息自动生成测试用例,适应动态变化的需求。

二、大模型驱动的查询功能升级

2.1 升级方案概述

通过将用户输入的字段名称、字段类型、字段值等信息传递给大模型,我们可以自动生成符合标准的测试用例。以下是升级的基本逻辑:

  1. 用户输入查询条件(字段名称、类型、值等)。
    在这里插入图片描述

  2. 系统将输入的信息封装为提示词(Prompt),并发送给大模型。
    在这里插入图片描述

  3. 大模型根据模板自动生成测试用例,包括查询步骤和预期结果。 真拿来即用!
    在这里插入图片描述

[
  {
    "title": "根据机构、类型、开始日期、结束日期组合查询",
    "steps": "1.进入页面;\n2.在机构中选择湖北分公司;\n3.在类型中选择当年;\n4.在开始日期输入2023-01-01;\n5.在结束日期输入2023-12-31;\n6.点击查询",
    "expect_results": "查询到湖北分公司当年且在2023-01-01至2023-12-31期间的数据",
    "priority": "P0"
  },
  {
    "title": "根据开始日期、结束日期组合查询",
    "steps": "1.进入页面;\n2.在开始日期输入2023-01-01;\n3.在结束日期输入2023-12-31;\n4.其他条件保持默认;\n5.点击查询",
    "expect_results": "查询到2023-01-01至2023-12-31期间的数据",
    "priority": "P0"
  },
  {
    "title": "根据机构、类型组合查询",
    "steps": "1.进入页面;\n2.在机构中选择湖北分公司;\n3.在类型中选择当年;\n4.其他条件保持默认;\n5.点击查询",
    "expect_results": "查询到湖北分公司当年的数据",
    "priority": "P1"
  },
  {
    "title": "根据机构、开始日期、结束日期组合查询",
    "steps": "1.进入页面;\n2.在机构中选择湖北分公司;\n3.在开始日期输入2023-01-01;\n4.在结束日期输入2023-12-31;\n5.其他条件保持默认;\n6.点击查询",
    "expect_results": "查询到湖北分公司且在2023-01-01至2023-12-31期间的数据",
    "priority": "P1"
  },
  {
    "title": "根据类型、开始日期、结束日期组合查询",
    "steps": "1.进入页面;\n2.在类型中选择当年;\n3.在开始日期输入2023-01-01;\n4.在结束日期输入2023-12-31;\n5.其他条件保持默认;\n6.点击查询",
    "expect_results": "查询到当年且在2023-01-01至2023-12-31期间的数据",
    "priority": "P1"
  },
  {
    "title": "根据机构查询",
    "steps": "1.进入页面;\n2.在机构中选择湖北分公司;\n3.其他条件保持默认;\n4.点击查询",
    "expect_results": "查询到湖北分公司的所有数据",
    "priority": "P2"
  },
  {
    "title": "根据类型查询",
    "steps": "1.进入页面;\n2.在类型中选择当年;\n3.其他条件保持默认;\n4.点击查询",
    "expect_results": "查询到当年的所有数据",
    "priority": "P2"
  },
  {
    "title": "根据开始日期查询",
    "steps": "1.进入页面;\n2.在开始日期输入2023-01-01;\n3.其他条件保持默认;\n4.点击查询",
    "expect_results": "查询到开始日期大于等于2023-01-01的数据",
    "priority": "P3"
  },
  {
    "title": "根据结束日期查询",
    "steps": "1.进入页面;\n2.在结束日期输入2023-12-31;\n3.其他条件保持默认;\n4.点击查询",
    "expect_results": "查询到结束日期小于等于2023-12-31的数据",
    "priority": "P3"
  }
]

2.2 提示词逻辑设计

我们设计如下提示词模板:

prompt = (f'系统名称为: {project};主功能模块名称为: {primary_module};子功能模块为:{sub_module};'
          f'用例创建人为: {case_creator};'
          f'查询结果比对方式为: {check_result_method};'
          f'查询页面是否需要补充UI测试用例: {ui_case_needed};自主标定用例的优先级;')

prompt += f'字段名称: {field_name};字段类型: {field_type};'

if enums:
    prompt += f'枚举值:{enums};'
elif symbol_date:
    prompt += f'日期符号为:{symbol_date};'
elif date_:
    prompt += f'日期为:{date_};'
elif symbol_time:
    prompt += f'时间比较符号为:{symbol_time};'
elif time_:
    prompt += f'时间选定的值为:{time_};\n'

2.3 自动生成的测试用例示例

根据提示词生成的测试用例示例如下:

[
    {'title': '根据姓名查询'},
    {'steps': '1.进入页面;\n2.在查询条件姓名输入;\n3.其他查询条件保持默认;\n4.点击查询'},
    {'expect_results': '查询到姓名的数据'},
]

通过这种方式,测试工程师只需输入字段信息,即可轻松生成高质量的测试用例,大幅提升工作效率。


三、实战演练:基于大模型升级查询功能

结合上述逻辑,我们对用户输入进行处理,并生成测试用例。以下是具体代码示例:

3.1 数据输入

用户输入字段信息:

project = "客户管理系统"
primary_module = "查询功能"
sub_module = "客户信息查询"
case_creator = "测试工程师A"
check_result_method = "数据匹配"
ui_case_needed = "是"

field_name = "姓名"
field_type = "字符串"
enums = None
symbol_date = None
date_ = None
symbol_time = None
time_ = None

3.2 提示词构建

根据输入信息构建提示词:

prompt = (f'系统名称为: {project};主功能模块名称为: {primary_module};子功能模块为:{sub_module};'
          f'用例创建人为: {case_creator};'
          f'查询结果比对方式为: {check_result_method};'
          f'查询页面是否需要补充UI测试用例: {ui_case_needed};自主标定用例的优先级;')

prompt += f'字段名称: {field_name};字段类型: {field_type};'

3.3 调用大模型生成测试用例

通过大模型接口生成测试用例:

async def generate_cases(prompt_param):
    # 初始化OpenAI客户端
    client = OpenAI(
        # 如果没有配置环境变量,请用百炼API Key替换:api_key="sk-xxx"
        # api_key='sk-xxx',
        api_key='sk-xxx',  # todo 此处需更换
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )

    reasoning_content = ""  # 定义完整思考过程
    answer_content = ""  # 定义完整回复
    is_answering = False  # 判断是否结束思考过程并开始回复
    example = [
        {'title': '根据姓名查询'},
        {'steps': '1.进入页面;\n2.在查询条件姓名输入;\n3.其他查询条件保持默认;\n4.点击查询'},
        {'expect_results': '查询到姓名的数据'},
    ]
    # 创建聊天完成请求
    completion = client.chat.completions.create(
        model="deepseek-r1",  # 此处以 deepseek-r1 为例,可按需更换模型名称
        messages=[
            {'role': 'user',
             'content': f'你是一名资深测工程师,根据这些字段组合{prompt_param}生成查询条件的组合,条件组合不能重复;输出列表形式的JSON,示例:{example}'}
        ],
        stream=True,
        # 解除以下注释会在最后一个chunk返回Token使用量
        # stream_options={
        #     "include_usage": True
        # }
    )

    print("\n" + "=" * 20 + "思考过程" + "=" * 20 + "\n")

    for chunk in completion:
        # 如果chunk.choices为空,则打印usage
        if not chunk.choices:
            print("\nUsage:")
            print(chunk.usage)
        else:
            delta = chunk.choices[0].delta
            # 打印思考过程
            if hasattr(delta, 'reasoning_content') and delta.reasoning_content != None:
                print(delta.reasoning_content, end='', flush=True)
                reasoning_content += delta.reasoning_content
            else:
                # 开始回复
                if delta.content != "" and not is_answering:
                    print("\n" + "=" * 20 + "完整回复" + "=" * 20 + "\n")
                    is_answering = True
                # 打印回复过程
                print(delta.content, end='', flush=True)
                answer_content += delta.content
    return answer_content

四、Django 异步调用阿里云 DeepSeek-R1 API

为了在查询功能升级中提升性能,我们可以采用 Django 异步调用阿里云 DeepSeek-R1 API。以下是具体实现步骤:

4.1 安装依赖

pip install aiohttp

4.2 异步请求实现

通过 aiohttp 实现异步调用:

import aiohttp
import asyncio

async def generate_cases(prompt_param):
    # 初始化OpenAI客户端
    client = OpenAI(
        # 如果没有配置环境变量,请用百炼API Key替换:api_key="sk-xxx"
        # api_key='sk-xxx',
        api_key='sk-xxx',  # todo 此处需更换
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )

    reasoning_content = ""  # 定义完整思考过程
    answer_content = ""  # 定义完整回复
    is_answering = False  # 判断是否结束思考过程并开始回复
    example = [
        {'title': '根据姓名查询'},
        {'steps': '1.进入页面;\n2.在查询条件姓名输入;\n3.其他查询条件保持默认;\n4.点击查询'},
        {'expect_results': '查询到姓名的数据'},
    ]
    # 创建聊天完成请求
    completion = client.chat.completions.create(
        model="deepseek-r1",  # 此处以 deepseek-r1 为例,可按需更换模型名称
        messages=[
            {'role': 'user',
             'content': f'你是一名资深测工程师,根据这些字段组合{prompt_param}生成查询条件的组合,条件组合不能重复;输出列表形式的JSON,示例:{example}'}
        ],
        stream=True,
        # 解除以下注释会在最后一个chunk返回Token使用量
        # stream_options={
        #     "include_usage": True
        # }
    )

    print("\n" + "=" * 20 + "思考过程" + "=" * 20 + "\n")

    for chunk in completion:
        # 如果chunk.choices为空,则打印usage
        if not chunk.choices:
            print("\nUsage:")
            print(chunk.usage)
        else:
            delta = chunk.choices[0].delta
            # 打印思考过程
            if hasattr(delta, 'reasoning_content') and delta.reasoning_content != None:
                print(delta.reasoning_content, end='', flush=True)
                reasoning_content += delta.reasoning_content
            else:
                # 开始回复
                if delta.content != "" and not is_answering:
                    print("\n" + "=" * 20 + "完整回复" + "=" * 20 + "\n")
                    is_answering = True
                # 打印回复过程
                print(delta.content, end='', flush=True)
                answer_content += delta.content
    return answer_content

# 示例调用
async def search_page_generate_case_by_ai(request):
    print('开始进行异步大模型用例生成')
    if request.method == 'POST':
        case = Cases.objects.all()
        case_common_title = []
        case_common_steps = []
        case_common_expect_result = []
        total_len = len(request.POST)
        case_system = request.POST.get('auth')
        case_module = ''
        primary_module = request.POST.get("module1")
        sub_module = []
        for _ in range(2, 4):
            if request.POST.get(f"module{_}"):
                sub_module.append(request.POST.get(f"module{_}"))
        sub_module = ">>".join(sub_module)
        case_precondition = f'已登录{case_module}系统'
        page_name = request.POST.get('page_name')
        check_result_method = request.POST.get("check_result_method")
        case_creator = request.POST.get('creator')
        ui_case_needed = request.POST.get('ui_case')
        field_count = (total_len - 10) // 7
        project = Project.objects.get(project_name=case_system)
        project_id = project.id
        if field_count > 1:
            field_name_list = []
            prompt = (f'系统名称为: {project};主功能模块名称为: {primary_module};子功能模块为:{sub_module};'
                      f'用例创建人为: {case_creator};'
                      f'查询结果比对方式为: {check_result_method};'
                      f'查询页面是否需要补充UI测试用例: {ui_case_needed};自主标定用例的优先级;')
            for i in range(field_count):
                field_name = request.POST.get(f'field_name{i}')
                field_type = request.POST.get(f'field_type{i}')
                enums = request.POST.get(f'enums{i}')
                symbol_date = request.POST.get(f'symbol_date{i}')
                date_ = request.POST.get(f'date{i}')
                symbol_time = request.POST.get(f'symbol_time{i}')
                time_ = request.POST.get(f'time{i}')
                time_ = str(time_).replace('T', ' ')
                field_name_list.append(field_name)
                # todo 修改此处适配AI大模型用例生成
                prompt += f'字段名称: {field_name};字段类型: {field_type};'
                if enums:
                    prompt += f'枚举值:{enums};'
                elif symbol_date:
                    prompt += f'日期符号为:{symbol_date};'
                elif date_:
                    prompt += f'日期为:{date_};'
                elif symbol_time:
                    prompt += f'时间比较符号为:{symbol_time};'
                elif time_:
                    prompt += f'时间选定的值为:{time_};\n'
            deepseek_result = await generate_cases(prompt)
            return HttpResponse(deepseek_result)

asyncio.run(main())

4.3 在 Django 中集成

将异步调用集成到 Django 视图中:

@require_POST
async def search_page_generate_case_by_ai(request):
    print('开始进行异步大模型用例生成')
    if request.method == 'POST':
        case = Cases.objects.all()
        case_common_title = []
        case_common_steps = []
        case_common_expect_result = []
        total_len = len(request.POST)
        case_system = request.POST.get('auth')
        case_module = ''
        primary_module = request.POST.get("module1")
        sub_module = []
        for _ in range(2, 4):
            if request.POST.get(f"module{_}"):
                sub_module.append(request.POST.get(f"module{_}"))
        sub_module = ">>".join(sub_module)
        case_precondition = f'已登录{case_module}系统'
        page_name = request.POST.get('page_name')
        check_result_method = request.POST.get("check_result_method")
        case_creator = request.POST.get('creator')
        ui_case_needed = request.POST.get('ui_case')
        field_count = (total_len - 10) // 7
        project = Project.objects.get(project_name=case_system)
        project_id = project.id
        if field_count > 1:
            field_name_list = []
            prompt = (f'系统名称为: {project};主功能模块名称为: {primary_module};子功能模块为:{sub_module};'
                      f'用例创建人为: {case_creator};'
                      f'查询结果比对方式为: {check_result_method};'
                      f'查询页面是否需要补充UI测试用例: {ui_case_needed};自主标定用例的优先级;')
            for i in range(field_count):
                field_name = request.POST.get(f'field_name{i}')
                field_type = request.POST.get(f'field_type{i}')
                enums = request.POST.get(f'enums{i}')
                symbol_date = request.POST.get(f'symbol_date{i}')
                date_ = request.POST.get(f'date{i}')
                symbol_time = request.POST.get(f'symbol_time{i}')
                time_ = request.POST.get(f'time{i}')
                time_ = str(time_).replace('T', ' ')
                field_name_list.append(field_name)
                # todo 修改此处适配AI大模型用例生成
                prompt += f'字段名称: {field_name};字段类型: {field_type};'
                if enums:
                    prompt += f'枚举值:{enums};'
                elif symbol_date:
                    prompt += f'日期符号为:{symbol_date};'
                elif date_:
                    prompt += f'日期为:{date_};'
                elif symbol_time:
                    prompt += f'时间比较符号为:{symbol_time};'
                elif time_:
                    prompt += f'时间选定的值为:{time_};\n'
            deepseek_result = await generate_cases(prompt)
            return HttpResponse(deepseek_result)
        else:
            return HttpResponse("没有内容!!!")

通过这种方式,Django 可以在处理查询请求时避免主线程阻塞,从而提升系统的并发性能。


五、大模型与平台升级的未来展望

通过大模型的引入,老旧平台的查询功能可以焕发新活力。测试工程师不仅能更高效地生成测试用例,还可以通过异步调用大模型接口,提升系统响应速度,为用户提供更好的体验。未来,随着大模型和容器化技术的普及,本地部署和性能优化将成为测试领域的重要方向。

快将这些技术应用到你的项目中,让测试工作更智能、更高效吧!


http://www.kler.cn/a/610475.html

相关文章:

  • Python:计算机二级:简单应用
  • 动态规划-01背包
  • MATLAB 控制系统设计与仿真 - 29
  • 如何自动规整化(格式化)HTML
  • cmd命令查看电脑的CPU、内存、存储量
  • 数据库理论基础
  • 容联云创始人孙昌勋:金融大模型应用,做出场景化应用比技术的先进更重要
  • 【组件安装】Ubuntu 22.04.5 desktop 安装 Anyware Agent
  • 逻辑回归(Logistic Regression)模型的概率预测函数
  • Objective-C语言的数据可视化
  • 机器人原点丢失后找回原点的解决方案与步骤
  • 微信小程序-通用印刷体识别cv/ocr/comm报media data missing hint错
  • 光谱范围与颜色感知的关系
  • [AI绘图] ComfyUI 中自定义节点插件安装方法
  • 加油站小程序实战教程01首页搭建
  • Java 大视界 -- 基于 Java 的大数据分布式系统的监控与运维实践(155)
  • 初2数学-1.勾股定理
  • Java面试黄金宝典13
  • 计算机二级WPS Office第十套WPS演示
  • 命令模式(Command Pattern)★