AI 实践探索:辅助生成测试用例

背景

目前我们的测试用例主要依赖人工生成和维护,AI时代的来临,我们也在思考“AI如何赋能业务”,提出了如下命题:

“探索通过AI辅助生成测试用例,完成从需求到测试用例生成的穿刺”。

目标

  • 找全测试路径
  • 辅助生成测试用例

实践案例:登录注册流程

自然语言描述需求

需求名称:注册登录流程
需求描述:
1、注册和登录在同一个页面,有2个按钮,一个注册,一个登录,用户输入用户名、密码进行登录或者注册
2、首页:加载一张图,有个退出按钮,点击则退出首页

注:这里只是为了验证思路,需求描述会比较简单,实际需求考虑会更完善。

如何找全测试路径

使用LLM生成mermaid格式的状态机描述

使用Dify 搭建的工作流:

将前面的需求描述作为输入参数,提供Prompt模板告诉LLM,如下所示:
在这里插入图片描述

LLM 生成的mermaid 状态机描述:

stateDiagram-v2[*] --> UnregisteredUnregistered --> Registering: start_registerRegistering --> Unregistered: register_failedRegistering --> LoggingIn: register_successUnregistered --> LoggingIn: start_loginLoggingIn --> Unregistered: login_failedLoggingIn --> LoggedIn: login_successLoggedIn --> Unregistered: logoutLoggedIn --> [*]: exit

Markdown对mermaid支持友好,可以直接渲染成状态机图:
在这里插入图片描述

这里选择Mermaid来描述状态机的理由,主要是Mermaid天然适合文档化,代码轻量且无额外依赖,无需处理图片格式的一些问题。

参考:AI大模型生成的图表为什么倾向使用Mermaid格式?

使用AI帮我们开发工具

前面通过LLM能够帮我们理解需求生成状态机图,如果想基于状态机找全测试路径,我们尝试使用AI编程工具来辅助生成规则工具,来确保每次遍历的路径是一致的。

比如Cursor:

通过多轮的对话和人工修正,Cursor能够很高效的帮助我生成符合预期的代码,但仍需要人工去验证和调试。

核心路径生成算法:

from typing import List, Dict, Set
from abc import ABC, abstractmethodclass PathGeneratorBase(ABC):def __init__(self):self.graph = {}self.paths = []self.events = {}@abstractmethoddef parse_input(self):"""解析输入源(Mermaid或SCXML)"""passdef generate_paths(self, max_depth: int = 15) -> List[List[str]]:"""通用的路径生成算法"""paths = []start = self._find_start_state()visited_states = set()def dfs(current: str, path: List[str]):if len(path) > max_depth:returncurrent_transitions = self._get_transitions(current)if self._should_terminate(current, path, current_transitions):paths.append(path[:])returnvisited_states.add(current)for next_state in current_transitions:dfs(next_state, path + [next_state])visited_states.remove(current)dfs(start, [start])return self._deduplicate_paths(paths)def _find_start_state(self) -> str:"""查找起始状态"""if 'START' in self.graph:return 'START'in_degrees = self._calculate_in_degrees()for node, degree in in_degrees.items():if degree == 0:return nodereturn Nonedef _get_transitions(self, state: str) -> List[str]:"""获取状态的所有可能转换"""if state not in self.graph:return []return [target for target in self.graph[state]]def _should_terminate(self, current: str, path: List[str], transitions: List[str]) -> bool:"""判断是否应该终止当前路径"""return len(path) > 1 and (not transitions or current in path[:-1])def _deduplicate_paths(self, paths: List[List[str]]) -> List[List[str]]:"""去除重复路径"""unique_paths = []path_strings = set()for path in sorted(paths, key=len):path_str = "->".join(path)if path_str not in path_strings:path_strings.add(path_str)unique_paths.append(path)return unique_pathsdef calculate_coverage(self) -> Dict:"""计算测试覆盖率"""all_states = set(self.graph.keys())all_transitions = set()covered_states = set()covered_transitions = set()for path in self.paths:covered_states.update(path)for i in range(len(path) - 1):transition = (path[i], path[i + 1])covered_transitions.add(transition)all_transitions.add(transition)return {"state_coverage": len(covered_states) / len(all_states) * 100,"transition_coverage": len(covered_transitions) / len(all_transitions) * 100}

根据路径生成算法遍历生成的路径索引:

如何生成测试用例

用例关键要素

  • 前置条件:描述复现测试场景所需的条件;
  • 操作步骤:描述测试场景下用户的操作行为;
  • 预期结果:描述测试场景下,用户执行完操作预期得到的结果。

示例:

场景前置条件操作步骤预期结果
银行卡支付场景用户已绑定有效银行卡在收银台选择银行卡支付显示支付成功页面,账户余额减少相应金额

LLM 生成测试用例

工作流设计:

  1. 输入需求描述和测试路径
  2. 设计prompt提示词,要求LLM按固定格式输出测试用例

生成的测试用例结果示例:

[{"precondition": "用户未注册,系统处于未登录状态","operation_procedure": ["1. 访问系统首页","2. 输入用户名:a1_(3字符)","3. 输入密码:Passw0rd!","4. 点击'注册'按钮"],"expected_result": ["注册失败,提示'用户名长度需在4-20字符之间'","页面停留在注册/登录页面"]},{"precondition": "用户未注册,系统处于未登录状态","operation_procedure": ["1. 访问系统首页","2. 输入用户名:existing_user","3. 输入密码:Passw0rd!","4. 点击'注册'按钮","5. 再次输入相同用户名和密码点击'注册'按钮"],"expected_result": ["第二次注册时提示'用户名已存在'","页面停留在注册/登录页面"]},{"precondition": "用户未注册,系统处于未登录状态","operation_procedure": ["1. 访问系统首页","2. 输入用户名:user😊name","3. 输入密码:Passw0rd!","4. 点击'注册'按钮"],"expected_result": ["注册失败,提示'用户名包含非法字符'","页面停留在注册/登录页面"]},{"precondition": "用户未注册,系统处于未登录状态","operation_procedure": ["1. 访问系统首页","2. 输入不存在的用户名:new_user","3. 输入错误密码:wrongPass","4. 点击'登录'按钮"],"expected_result": ["登录失败,提示'用户名或密码错误'","页面停留在注册/登录页面"]},{"precondition": "用户已注册,系统处于未登录状态","operation_procedure": ["1. 访问系统首页","2. 输入已注册用户名:valid_user","3. 输入正确密码:Passw0rd!","4. 点击'登录'按钮"],"expected_result": ["登录成功,跳转至带图片的首页","页面显示退出按钮"]},{"precondition": "新用户完成注册,系统处于未登录状态","operation_procedure": ["1. 访问系统首页","2. 输入符合要求的用户名:new_user_123","3. 输入符合要求的密码:Passw0rd!","4. 点击'注册'按钮","5. 使用相同凭证点击'登录'按钮"],"expected_result": ["注册成功后自动清除表单","登录成功跳转至首页"]},{"precondition": "用户已登录,处于首页","operation_procedure": ["1. 点击'退出'按钮"],"expected_result": ["返回注册/登录页面","用户会话终止"]},{"precondition": "用户未注册,系统处于未登录状态","operation_procedure": ["1. 访问系统首页","2. 输入有效用户名:valid_user","3. 输入无效密码:password","4. 点击'注册'按钮"],"expected_result": ["注册失败,提示'密码需包含大写字母、小写字母、数字和特殊字符'","页面停留在注册/登录页面"]}
]

这里可以进一步将json数据转成xmind或excel格式的文件。

收益

价值思考? 几个方向:

  • AI辅助建模(状态机、类图),提升研发需求建模效率和规范
  • 释放助理生成测试用例的生产力,转变为review/修改用例的角色
  • AI辅助生成符合业务规则的可测试数据,提升构造数据的效率

经验总结

  • 使用AI帮助我们进行自然语言推理和图解析
  • 要让AI生成的测试用例更准确,需要精确描述需求,对需求进行建模,描述清楚业务规则
  • 使用AI编程工具帮助我们开发工具,比如有明确规则的工具开发
  • 通过搭建AI工作流完成需求穿刺

附录

  • Dify文档: https://docs.dify.ai/zh-hans

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/81068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#实现访问远程硬盘(附源码)

在现实场景中,我们经常用到远程桌面功能,而在某些场景下,我们需要使用类似的远程硬盘功能,这样能非常方便地操作对方电脑磁盘的目录、以及传送文件。那么,这样的远程硬盘功能要怎么实现了? 这次我们将给出…

02.Golang 切片(slice)源码分析(一、定义与基础操作实现)

Golang 切片(slice)源码分析(一、定义与基础操作实现) 注意当前go版本代码为1.23 一、定义 slice 的底层数据是数组,slice 是对数组的封装,它描述一个数组的片段。两者都可以通过下标来访问单个元素。 数…

记参加一次数学建模

题目请到全国大学生数学建模竞赛下载查看。 注:过程更新了很多文件,所有这里贴上的有些内容不是最新的(而是草稿)。 注:我们队伍并没有获奖,文章内容仅供一乐。 从这次比赛,给出以下赛前建议 …

virtualbox虚拟机中的ubuntu 20.04.6安装新的linux内核5.4.293 | 并增加一个系统调用 | 证书问题如何解决

参考文章:linux添加系统调用【简单易懂】【含32位系统】【含64位系统】_64位 32位 系统调用-CSDN博客 安装新内核 1. 在火狐下载你需要的版本的linux内核压缩包 这里我因为在windows上面下载过,配置过共享文件夹,所以直接复制粘贴通过共享文…

[Java实战]Spring Boot 3 整合 Ehcache 3(十九)

[Java实战]Spring Boot 3 整合 Ehcache 3(十九) 引言 在微服务和高并发场景下,缓存是提升系统性能的关键技术之一。Ehcache 作为 Java 生态中成熟的内存缓存框架,其 3.x 版本在性能、功能和易用性上均有显著提升。本文将详细介绍…

LlamaIndex 第九篇 Indexing索引

索引概述 数据加载完成后,您将获得一个文档对象(Document)列表(或节点(Node)列表)。接下来需要为这些对象构建索引(Index),以便开始执行查询。 索引(Index) 是一种数据结构,能够让我们快速检索…

【问题排查】easyexcel日志打印Empty row!

问题原因 日志打印​​I/O 操作开销​(如 Log4j 的 FileAppender)会阻塞业务线程,直到日志写入完成,导致接口响应变慢 问题描述 在线上环境,客户反馈导入一个不到1MB的excel文件,耗时将近5分钟。 问题排…

代码随想录第51天|岛屿数量(深搜)、岛屿数量(广搜)、岛屿的最大面积

1.岛屿数量&#xff08;深搜&#xff09; ---》模板题 版本一写法&#xff1a;下一个节点是否能合法已经判断完了&#xff0c;传进dfs函数的就是合法节点。 #include <iostream> #include <vector> using namespace std;int dir[4][2] {0, 1, 1, 0, -1, 0, 0, -…

Made with Unity | 从影视到游戏:《鱿鱼游戏》IP 的边界拓展

优质IP的跨媒体开发潜力不可限量。以现象级剧集《鱿鱼游戏》为例&#xff0c;Netflix旗下游戏工作室Boss Fight在第二季开播前夕推出的手游《Squid Game: Unleashed》&#xff0c;一经发布便横扫全球107个国家和地区的App Store免费游戏榜首。 这款多人派对大逃杀游戏完美还原…

allure 报告更改标题和语言为中文

在网上看到好多谈到更改allure 的标题设置都很麻烦&#xff0c;去更改JSON文件 其实可以有更简单的办法&#xff0c;就是在生成报表时增加参数 使用allure --help 查看&#xff1a; --lang, --report-language 设置报告的语言&#xff0c;默认是应用 The report language. …

HGDB索引膨胀的检查与处理思路

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5.8 文档用途 本文档主要介绍HGDB索引膨胀的定义、产生的原因、如何检查以及遇到索引膨胀如何处理&#xff08;包括预防和解决&#xff09; 详细信息 …

【Python CGI编程】

Python CGI&#xff08;通用网关接口&#xff09;编程是早期Web开发中实现动态网页的技术方案。以下是系统化指南&#xff0c;包含核心概念、实现步骤及安全实践&#xff1a; 一、CGI 基础概念 1. 工作原理 浏览器请求 → Web服务器&#xff08;如Apache&#xff09; → 执行…

数据库故障排查指南:从入门到精通

1. 常见数据库故障类型 1.1 连接故障 数据库连接超时连接池耗尽网络连接中断认证失败1.2 性能故障 查询执行缓慢内存使用过高CPU使用率异常磁盘I/O瓶颈1.3 数据故障 数据不一致数据丢失数据损坏事务失败2. 故障排查流程 2.1 初步诊断 -- 检查数据库状态SHOW STATUS;SHOW PRO…

conda创建环境常用命令(个人用)

创建环境 conda create --name your_project_name创建环境 ---- 指定环境python版本 conda create --name your_project_name python3.x环境列表 conda env list激活环境 conda activate your_project_name退出环境 conda deactivate环境列表 #使用conda命令 conda list …

PCL 绘制二次曲面

文章目录 一、简介二、实现代码三、实现效果一、简介 这里基于二次曲面的公式: z = a 0 + a 1 x + a 2 y + a

一文讲透面向对象编程OOP特点及应用场景

面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;是一种以对象为核心、通过类组织代码的编程范式。它通过模拟现实世界的实体和交互来构建软件系统&#xff0c;是现代软件开发中最广泛使用的范式之一。以下是 OOP 的全面解析&#xff1a; 一、OOP 的四大…

linux,我启动一个springboot项目, 用java -jar xxx.jar ,但是没多久这个java进程就会自动关掉

当使用 java -jar xxx.jar & 启动 Spring Boot 项目后进程自动关闭时&#xff0c;可能由多种原因导致。以下是常见排查步骤和解决方案&#xff1a; 一、查看日志定位原因 进程异常关闭通常会在控制台或日志中留下线索&#xff0c;建议先获取完整日志&#xff1a; 1. 查看…

【独家精简】win11(24h2)清爽加速版

自作该版本的初心&#xff1a;随着电脑性能的不断提升&#xff0c;我们需要的更多的是没有广告&#xff0c;没有推荐&#xff0c;没有收集隐私的windows清爽版纯净系统 目前只会去制作windows系统专业版 1、去除Windows系统自带的广告新闻和推荐以及小组间和聊天功能。 2、精简…

大二java第一面小厂(挂)

第一场&#xff1a; mybatis怎么防止数据转义。 Hutool用的那些你常用的方法。 springboot的常用注解。 redis的多级缓存。 websocket怎么实现的多人协作编辑功能。 怎么实现的分库分表。 mysql里面的各种操作&#xff0c;比如说分表怎么分&#xff0c;分页查询怎么用。 mybat…

OceanBase 的系统变量、配置项和用户变量有何差异

在继续阅读本文之前&#xff0c;大家不妨先思考一下&#xff0c;数据库中“系统变量”、“用户变量”以及“配置项”这三者之间有何不同。如果感到有些模糊&#xff0c;那么本文将是您理清这些概念的好帮手。 很多用户在使用OceanBase数据库中的“配置项”和“系统变量”&#…