ChatGPT辅助编写自动化测试

news2025/1/17 2:52:31

大家好,我是洋子,ChatGPT已经越来越火爆,国内百度、阿里等互联网大厂也纷纷投入大模型研究,OpenAI官网中提供了许多ChatGPT应用场景,例如SQL翻译、语言翻译、代码解释等

作为一名QA,我更关注ChatGPT生成的自动化测试脚本质量如何,借助ChatGPT能否提升自动化测试编写效率

当提到自动化测试时,我们通常将其分为单元测试、接口测试和UI测试,接下来,我们先看看ChatGPT生成的单元测试代码的质量如何

ChatGPT辅助后补单元测试

首先,使用Spring框架编写一个简单的后端服务,服务包括两个接口:一个createUser接口和一个getUsers接口,使用“spring-boot-starter-data-jpa”连接、操作数据。service层的代码实际上没有业务处理逻辑,只是调用了Repository中的方法而已

为了让ChaGPT为service层的代码编写单元测试,Prompt中的要求如下:

Prompt中要求使用JUnit5Mockito框架。
Prompt中要求使用@Mock@InjectMocks注解。
Prompt中给出了UserServiceImpl中的createUser()方法的源代码。

ChatGPT生成了两个测试用例:一个正向测试用例和一个异常测试用例。将这些代码复制到IDE中,基本上无需修改即可成功运行。通过这个实验,可以看到,对于简单逻辑的代码,ChatGPT生成的单元测试代码质量较高

在这里插入图片描述

在上面的例子中,介绍了如何编写Service层的单元测试。如果希望编写Controller层的单元测试,只需稍微修改Prompt,在Prompt中要求使用Spring框架提供的MockMvc编写单元测试即可。除了单元测试,针对后端服务,也建议编写少量容器内的集成测试,以覆盖Controller层到DB层的代码

修改Prompt,在Prompt中要求使用@SpringBootTestTestRestTemplate编写集成测试。实验结果如下,将生成的代码复制到IDE上,几乎无需任何修改即可成功执行。
在这里插入图片描述

总结而言,对于逻辑比较简单的代码,ChatGPT生成的单元测试和集成测试代码质量较高,基本可以直接运行,或做很小的修改即可运行。接下来,继续探索对于稍微复杂的代码,ChatGPT生成的单元测试质量如何。下图是特意编写的一个包含很多分支逻辑的方法,源代码中包含一个public的toLocal()方法和几个private方法,toLocal()方法会调用这些私有方法。Prompt和生成的单元测试如下所示
在这里插入图片描述

  1. 由于代码中存在很多分支逻辑,适合参数化测试数据,因此Prompt中要求使@Parameterized
  2. 将生成的测试代码复制到IDE中运行,会发现部分单元测试运行失败。经检查发现,部分单元测试与源代码的逻辑不符,这表明对于稍微复杂的代码,ChatGPT生成的单元测试仍需要人工干预来进行修正。
  3. ChatGPT生成的单元测试覆盖率在30%-40%左右,如果继续要求ChatGPT补充更多的单元测试,ChatGPT可能会生成一些与上一个版本重复的单元测试,或者给私有方法添加单元测试。这表明对于分支逻辑较为复杂的代码,ChatGPT生成的单元测试覆盖率不够,剩余的部分需要人工进行补充。

当然,上面都是针对遗留系统需要后补单元测试的情况,如果是新系统的开发,我们更加推荐采用TDD的方式,而不是在后期补充单元测试。

ChatGPT辅助编写接口自动化测试

如果要为一个接口编写自动化测试,除需确定测试框架外,还需构建接口的Request、Response Object。以选用Java技术栈为例,可以选用Lombok来灵活构建接口的Request body,使用jackson完成object和json string的转换。下图是ChatGPT生成的接口自动化测试结果,接口测试代码质量较高,几乎无需修改即可成功运行。
在这里插入图片描述

当然,上述实验仅为单个接口生成接口测试。在实际项目中,接口测试还涉及多个接口间的值传递、配置信息管理、测试数据管理等问题。从测试场景的角度来看,即便是测试同一个接口,也需要构建不同的Request body以测试接口的返回内容是否符合预期。实际,对于这些任务都可以通过任务拆解、提供不同的Prompt来完成。例如,对于多个接口之间的值传递场景,可以在Prompt中先提供第一个接口的信息,生成代码后,再提供第二个接口信息,在生成的代码基础上稍微调整,即可完成不同接口间值传递场景。总结而言,利用ChatGPT可提高编写接口自动化测试的效率。

ChatGPT辅助编写Web UI自动化测试

当搜索“ChatGPT auto write test”时,发现排在前面的大多数是关于“如何使用ChatGPT编写web UI自动化测试”的文章,这似乎有些奇怪,因为编写Web UI自动化测试需要定位Web页面上的目标元素,而ChatGPT并不知道被测Web系统的页面结构。从原理上来说,ChatGPT无法编写UI自动化测试,那么ChatGPT真的能编写Web UI自动化测试吗?

先来看下第一个例子,让ChatGPT使用Cypress对一个公共网站“https://angular.realworld.io/” 编写UI自动化测试,测试场景涉及三个页面。生成的自动化测试质量很高,除了登录页面上的两个元素定位错误外,其他部分基本正确。并且,按照Prompt中要求的Page Object模式生成代码,因此,只需稍微修改即可成功运行。当我做到这个实验时,我觉得很奇怪,为什么页面元素定位准确率这么高?我尝试询问ChatGPT是否会爬取页面结构,ChatGPT回复并没有。
在这里插入图片描述

为了搞清楚这个问题,我做了第2个实验,编写了一个包含注册、登陆、添加todoList的简单web系统,本地启动后,让ChatGPT为这个web系统编写UI自动化测试脚本,测试场景涉及三个页面。此次生成的脚本质量较差,部分元素定位错误,第三个页面总共有5个页面元素,ChatGPT只定位了2个,且定位元素的selector也不正确。但是通篇没有任何留空白的地方,在这里,我们也看到了ChatGPT如何一本正经地胡说八道。
在这里插入图片描述

从上面的实验来看,即使是本地启动的Web系统,ChatGPT仍然可以正确定位少量页面元素。经过分析和观察,我猜测ChatGPT大概是根据Prompt中的信息猜测元素的类型,然后选用可能性较高的一种方式来定位页面元素。例如,Prompt提供如下信息:

  1. 进入https://xxxx
  2. 点击“signup”菜单
  3. 输入username、password

ChatGPT结合上述信息,会猜测“signup”菜单是一个链接,因此会选用Cypress中的“cy.contain(“signup”)”来定位该元素。它还会猜测username和password是input类型的元素,因此会选择使用Cypress中的“cy.get(‘input[name=”firstname”]’)”来定位这些元素。当然,如果你多次生成,有些元素的定位方式可能会从CSS修改为ID定位等其他方式。

为了进一步验证上面的猜测,我进行了第3个实验。在这个实验中,Prompt中明确告知ChatGPT第三个页面需要输入“title,desc”,选择“status和targetDate”。通过这个信息,ChatGPT就知道了第三个页面总共有四个需要定位的元素。其中,前两个是Input类型的元素,后两个是多选框。对于多选框,生成的代码中,ChatGPT用cy.get(“…”).select(“…”)的方式进行定位。虽然还是没有定位到目标元素,但语法格式正确,与上一次生成的脚本相比,脚本质量有所提高。
在这里插入图片描述

从上面的几个实验结果来看,基本证实了ChatGPT确实是根据Prompt中的信息,猜概率的方式编写UI自动化测试,它并不真正知道目标web系统的页面结构。但是,如果是猜概率,为什么第一个public的web系统元素定位正确率这么高呢?难道是public的网站定位正确率高,private的低?

为了解决这个疑惑,我写了另外一个Prompt,让ChatGPT登陆我司官网,生成的脚本质量并不高。下面的实验1是让ChatGPT登陆我司网站,生成的代码中第一个元素定位正确,后面两个均错误。实际系统中,登陆首页并没有password输入框和submit按钮。接着,做了第2次实验,在Prompt中描述了更详细的操作步骤,生成的脚本中元素定位正确率依然很低,只是比第1次有所提高而已,详细结果如下所示:
在这里插入图片描述

同样都是public的网站,编写的脚本代码质量差异很大,这说明可能和训练的数据有关。联想到ChatGPT基于github上的代码做训练,大概率是github上有很多UI自动化测试代码,用第一个public的网站作为测试对象(备注:我自己就用不同的UI测试框架测试过第一个public网站,且代码也在github上)。所以,如果是某些常见场景,例如打开google,查找某个信息等,ChatGPT生成的脚本质量可能较高。反之,如果是内部web系统或者新上线的系统,生成的脚本质量就较差。

实际项目中有很多是ToB系统,且要求自动化测试和新功能实现同步完成。鉴于ChatGPT数据训练来源于github,如果用ChatGPT为实际项目中系统生成web UI测试代码,因为页面元素定位正确率很低,故生成的UI测试代码帮助很有限。

总结

总的来说,如果一个系统需要后补单元测试,可以考虑借助ChatGPT生成单元测试和容器内的集成测试。如果源代码中类的代码行数太多,建议逐个方法输入以生成测试,避免遇到ChatGPT单次tokens限制。此外,还可以通过任务拆解的方式为项目从0开始构建完善的接口自动化测试。对于Web UI自动化测试而言,由于ChatGPT无法知道页面的结构,虽然可以生成UI自动化测试脚本,但元素定位的准确率很低,对实际项目的帮助很有限

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

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

相关文章

【全面讲解】CPU缓存一致性:从理论到实战(上)

本文从 CPU、缓存、内存屏障、CAS到原子操作,再到无锁实践,逐一详细介绍。 01存储体系结构 速度快的存储硬件成本高、容量小,速度慢的成本低、容量大。为了权衡成本和速度,计算机存储分了很多层次,扬长避短&#xff…

动态主机配置协议 (DHCP):简化网络中IP地址分配的利器

文章目录 一、引言二、什么是DHCP?三、DHCP的工作原理IP地址分配流程解决多服务器冲突IP地址租约更新 四、DHCP中继代理五、相关命令 首先可以看下思维导图,以便更好的理解接下来的内容。 一、引言 在局域网中,手动配置静态IP地址不仅繁琐…

22.3D等距社交媒体菜单的悬停特效

效果 源码 <!doctype html> <html><head><meta charset="utf-8"><title>CSS Isometric Social Media Menu</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.…

ThinkPHP 集成 jwt 技术 token 验证

ThinkPHP 集成 jwt 技术 token 验证 一、思路流程二、安装 firebase/php-jwt三、封装token类四、创建中间件&#xff0c;检验Token校验时效性五、配置路由中间件六、写几个测试方法&#xff0c;通过postman去验证 一、思路流程 客户端使用用户名和密码请求登录服务端收到请求&…

Android-关于页面卡顿的排查工具与监测方案

作者&#xff1a;一碗清汤面 前言 关于卡顿这件事已经是老生常谈了&#xff0c;卡顿对于用户来说是敏感的&#xff0c;容易被用户直接感受到的。那么究其原因&#xff0c;卡顿该如何定义&#xff0c;对于卡顿的发生该如何排查问题&#xff0c;当线上用户卡顿时&#xff0c;在线…

Android Aidl跨进程通讯(二)--异常捕获处理

学更好的别人&#xff0c; 做更好的自己。 ——《微卡智享》 本文长度为1623字&#xff0c;预计阅读5分钟 前言 上一篇《Android Aidl跨进程通讯的简单使用》中介绍了跨进程的通讯处理&#xff0c;在进程间的数据通过Aidl实现了交互&#xff0c;项目中经常会遇到Bug&#xff0c…

charles证书失效解决方法

1. 先reset 2. 再下载&#xff08;即下载最新的证书&#xff09; 钥匙串中信任后即可正常使用

图像分割模型GUI应用:基于Tkinter和MMseg实现

简介 本篇博客介绍了一个使用Python的Tkinter库和MMseg图像分割库创建的图像分割模型GUI应用。该应用允许用户加载图像文件夹&#xff0c;浏览加载的图像&#xff0c;并对选定的图像执行分割推断&#xff0c;展示分割结果。这个应用演示了如何使用图形界面与深度学习模型结合&…

PageObject三层架构模式实现之数据驱动

接上一篇PageObject三层架构模式实现&#xff0c;发现我们的用户名和密码都是在代码中写死的&#xff0c;如果要测试不同用户名和密码的登录&#xff0c;那么每执行一次就要修改一次代码。这样效果非常不好。 因此本篇文章介绍如何实现数据驱动并且记录下每次操作的日志。 在…

SpringBoot - Google EventBus、AsyncEventBus

介绍 EventBus 顾名思义&#xff0c;事件总线&#xff0c;是一个轻量级的发布/订阅模式的应用模式&#xff0c;最初设计及应用源与 google guava 库。 相比于各种 MQ 中间件更加简洁、轻量&#xff0c;它可以在单体非分布式的小型应用模块内部使用&#xff08;即同一个JVM范围…

数字孪生智慧工厂:电缆厂 3D 可视化管控系统

近年来&#xff0c;我国各类器材制造业已经开始向数字化生产转型&#xff0c;使得生产流程变得更加精准高效。通过应用智能设备、物联网和大数据分析等技术&#xff0c;企业可以更好地监控生产线上的运行和质量情况&#xff0c;及时发现和解决问题&#xff0c;从而提高生产效率…

Vlan和Trunk

文章目录 一、VLAN的定义与背景1. 传统以太网的问题&#xff08;广播域&#xff09;2. 用VLAN隔离广播域3. VLAN的优点与应用 二、VLAN的转发过程举例三、802.1Q标签&#xff1a;帧格式与作用四、VLAN工作原理交换机端口类型AccessTrunkHybrid PVID&#xff08;Port VLAN ID&am…

十三、享元模式

一、什么是享元模式 享元&#xff08;Flyweight&#xff09;模式的定义&#xff1a;运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销&#xff0c;从而提高系统资源的利用率。 享元&#xff08;F…

C语言拷贝一个文件。

今天学习了如何用c语言拷贝一个文件&#xff0c;一个字符一个字符的拷贝一个文件&#xff0c;特此记录一下。 #include<stdio.h>int main() {FILE * pfr fopen("1.txt", "r"); //打开文件1.txt 用读的模式if (pfr NULL){return 1;}FILE* pfw fo…

1.RTKLIB环境配置和调试

1.源码下载 下载链接&#xff1a;rtklib 注&#xff1a;2.4.2 p13为稳定版本&#xff08;标识p代表稳定版本&#xff09;&#xff0c;2.4.3 b34为最新实验版本&#xff08;标识b&#xff09;。点击2.4.3 b34 的Source Programs and Data 链接下载源码。 2.环境配置 **集成…

Linux系统文件权限修改:permission denied

最近遇到文件夹权限的问题 通过命令发现www缺少写和执行的权限 然后赋予所有权限 下面是一些详解&#xff1a; 要赋予文件或目录写入权限&#xff0c;可以使用 chmod 命令。 命令的基本语法是&#xff1a; chmod <permissions> <file or directory>其中 <…

【测试】笔试01

文章目录 1. 按照瀑布模型的阶段划分&#xff0c;软件测试可以分为单元测试&#xff0c;集成测试&#xff0c;系统测试。请问以下哪项测试不属于系统测试的内容&#xff08; &#xff09;2. 测试设计员的职责有哪些&#xff1f;3. 针对程序段&#xff1a;IF&#xff08;A||B||C…

xsschallenge靶场练习1-13关

文章目录 第一关第二关第三关第四关第五关第六关第七关第八关第九关第十关第十一关第十二关第十三关 第一关 观察页面 http://192.168.80.139/xsschallenge/level1.php?nametest尝试在name后面输入最近基本的xss语法 <script>alert(1)</script>第二关 查看页面源…

Java【手撕滑动窗口】LeetCode 3. “无重复字符的最长子串“, 图文详解思路分析 + 代码

文章目录 前言一、长度最小子数组1, 题目2, 思路分析3, 代码 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 &#x1f4d7; Java数据结构: 顺序表, 链…

(二十)大数据实战——Flume数据采集的基本案例实战

前言 本节内容我们主要介绍几个Flume数据采集的基本案例&#xff0c;包括监控端口数据、实时监控单个追加文件、实时监控目录下多个新文件、实时监控目录下的多个追加文件等案例。完成flume数据监控的基本使用。 正文 监控端口数据 ①需求说明 - 使用 Flume 监听一个端口&am…