• 0
  • 0
分享

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

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

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

  ChatGPT辅助后补单元测试

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

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

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

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

1-1.png

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

  修改Prompt,在Prompt中要求使用@SpringBootTest和TestRestTemplate编写集成测试。实验结果如下,将生成的代码复制到IDE上,几乎无需任何修改即可成功执行。

1-2.png

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

1-3.png

  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生成的接口自动化测试结果,接口测试代码质量较高,几乎无需修改即可成功运行。

1-4.png

  当然,上述实验仅为单个接口生成接口测试。在实际项目中,接口测试还涉及多个接口间的值传递、配置信息管理、测试数据管理等问题。从测试场景的角度来看,即便是测试同一个接口,也需要构建不同的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回复并没有。

-5.png

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

1-6.png

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

  进入https://xxxx
  点击“signup”菜单
  输入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(“…”)的方式进行定位。虽然还是没有定位到目标元素,但语法格式正确,与上一次生成的脚本相比,脚本质量有所提高。

1-7.png

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

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

1-8.png

  同样都是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自动化测试脚本,但元素定位的准确率很低,对实际项目的帮助很有限


作者:Bug 挖掘机    

来源:http://www.51testing.com/html/80/n-7798280.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   Apple Maps 存在一个隐私 BUG,可以在未经用户许可的情况下,允许应用收集用户位置数据。苹果在最新发布的 iOS 16.3 更新中已经修复了这个 BUG。  根据巴西记者 Rodrigo Ghedin 报道,当地外卖应用 iFood 在 iOS 16.2 系统中,即便用户关闭了该应用访问位置的权限,但该应用依然可以利用上述 BUG 来追踪用户位置。  IT之家了解到,iFood 是巴西最大的外卖应用程序,公司估值 54 亿美元。该应用在关闭访问位置的权限之后,iFood 的应用程序依然可以获取用户的位置信息。  Arstechnica 安全作家 Dan Goodin 则提出了诸多...
            0 0 1016
            分享
          •   据《华尔街日报》报道,Meta 将于本周早些时候推出 Threads 的网络版,这是公司为 X(前身为 Twitter)量身打造的竞争产物。有趣的是,网页版的Threads自这一短消息社交平台服务开始以来一直缺失,令人沮丧。  Meta 首席执行官马克-扎克伯格(Mark Zuckerberg)在本月早些时候表示,公司正在努力增加这一功能,同时改进搜索功能(其实就是搜索功能--现在,你只能在该平台上搜索用户名),"未来几周内"就会准备就绪。  不过,《华尔街日报》称,消息人士透露,该功能的"推出计划尚未最终确定,可能会有变化"。莫塞里上周在 Thre...
            0 0 929
            分享
          • 接口测试和功能测试是软件测试中的两种常见测试类型,主要用于评估软件系统的质量。尽管这两种测试都是为了评估软件系统的性能,但它们有很多不同之处。接口测试和功能测试的区别目的接口测试的目的是评估两个系统间的互操作性,以确保这两个系统之间能够正常地传递信息。而功能测试的目的则是评估软件系统是否能够按照预期正常运行。测试范围接口测试仅仅关注两个系统间的接口,而功能测试则关注软件系统的整体功能。因此,接口测试的测试范围更狭窄,而功能测试的测试范围更广泛。测试方法接口测试通常通过模拟实际数据交换来评估两个系统间的互操作性。功能测试则通常通过手动执行测试用例或使用自动化测试工具来评估软件系统的功能。重要性接...
            0 0 1374
            分享
          • 前言例如:测试工程师面试题目1、软件的生命周期有哪些阶段?① 需求阶段分析和学习阶段,团队去查看这个需求是不是可测的。② 计划阶段辨别出哪些活动和资源和测试的目标时匹配的,辨别并追踪这些测试的指标、计划。③ 分析阶段通过需求文档等条件辨别测试条件,追溯到需求。④ 设计阶段概述测试条件;获取测试数据;搭建环境;跟踪测试指标。⑤ 编码阶段创建详细的测试用例,进行编码。⑥ 运行和维护阶段⑦ 总结阶段检验完成度和用户满意度。2、测试的整个流程有哪些① 需求评审阅读需求,理解需求,查看是否有不符合逻辑的需求,明确测试周期。② 测试计划根据项目计划和开发人员的时候指定测试计划,包含测试内容、测试规划、测试...
            1 1 2957
            分享
          •   据英媒 The Register 当地时间本周三报道,一位 IBM 员工向该媒体透露,IBM 云服务部门 IBM cloud 过去数日经历了一次大规模裁员,影响数千名员工。  此外本次裁员还是秘密进行的:受裁员工必须签署 NDA,不得对外谈论裁员具体细节。  具体而言,本次秘密裁员主要针对高级的程序、销售和支持人员,受影响的员工大多在 50~55 岁年龄段,工龄位于 20~24 年之间,职级集中在 L7、L8、L9,裁员前拥有相当高的薪资收入。  IBM 发言人向英媒表示,这家科技巨头今年早些时候披露了一笔劳动力再平衡费用,这笔资金将影响 IBM 整体员工团队中的“非常低个位数百分比”,I...
            0 0 36
            分享
      • 51testing软件测试圈微信