目录
作者简介
引言
一、UI自动化的现状
二、行为驱动开发BDD的引入
三、当前AI在UI自动化中的应用
四、AI全自动的来编写有效的测试脚本
五、系统实现
六、后续的发展
首页 科技周边 人工智能 通过实时调试,让AI编写有效的UI自动化

通过实时调试,让AI编写有效的UI自动化

Mar 15, 2024 pm 03:46 PM
ai 携程

作者简介

Thales Fu,携程高级研发经理,致力于寻找更好的方法,结合AI和工程来解决现实中的问题。

引言

在快速迭代的软件开发周期中,用户界面(UI)的自动化测试已成为提高效率和确保产品质量的关键。然而,随着应用程序变得日益复杂,传统的UI自动化方法逐渐显露出局限性。 AI驱动的UI自动化出现了,但仍面临着准确性和可靠性的挑战。在这个背景下,本文提出一个创新的视角:通过实时调试技术,显着提升AI编写的UI自动化脚本的有效性。

这个问题不仅仅是技术上的挑战,它关系到如何在保证软件质量的同时加速软件的交付。 本文将探讨实时调试如何帮助AI更准确地理解和执行UI测试脚本,以及这种方法如何能够为软件开发带来革命性的改变。

一、UI自动化的现状

UI自动化经历了长足的发展,从最初简单的记录与回放工具发展到如今的复杂脚本编写框架。尽管技术不断进步,但传统的UI自动化方法在处理快速变化的应用界面时仍面临挑战。随着应用程序变得更加复杂和动态,传统方法可能无法满足需求。因此,工程师们正在寻找更灵活、可靠的解决方案来提高UI自动化的效率和可靠性。新一代的UI自动化工具和技术不断涌现,以

根据行业调查结果显示,手动编写测试脚本效率低下,而且在应用更新时需花费大量时间进行重新工作。调研显示,维护UI自动化测试脚本可能占整个测试工作的60%至70%。在敏捷开发环境中,每次应用更新可能要花费超过100小时来重新编写和测试现有的自动化脚本。这种高昂的维护成本凸显了传统UI自动化方法的低效性和资源消耗。

二、行为驱动开发BDD的引入

行为驱动开发(BDD)是一种敏捷软件开发的实践,它鼓励软件项目的开发者、测试人员和非技术利益相关者之间进行更有效的沟通。 Cucumber是实现BDD方法论的一个流行工具,它允许团队成员使用自然语言编写明确的、可执行的测试用例。

Cucumber使用一种名为Gherkin的领域特定语言(DSL),这种语言极易阅读,使得非技术人员也能理解测试的目的和内容。测试场景以一系列Given-When-Then语句的形式书写,清晰地描述了系统在特定条件下应该做出何种响应。

例如,一个在线购物网站的购物车功能可能有如下的Gherkin场景:

通过实时调试,让AI编写有效的UI自动化

这种方法利用自然语言描述功能,促进技术和非技术团队之间更好的沟通和理解。同时,自然语言测试场景还扮演了项目文档的角色,帮助新团队成员快速了解项目功能。这使得非技术人员能够直接参与测试用例的编写和验证过程,确保开发工作与业务需求紧密契合。

但是它也存在着局限性,尽管测试场景用自然语言编写,每个步骤背后的实现(步骤定义)仍然需要技术人员使用编程语言来编写。这意味着实现测试逻辑可能涉及复杂的代码编写工作。随着应用程序的发展和变化,维护和更新与之相对应的测试步骤可能会变得繁琐。特别是在UI频繁更改的情况下,相关的步骤定义也需要相应地进行更新。还有灵活性和适应性限制:Cucumber测试脚本依赖于预定义的步骤和结构,这可能限制测试的灵活性。对于一些复杂的测试场景,实现特定的测试逻辑可能需要创造性地规避框架的限制。

通过实时调试,让AI编写有效的UI自动化

三、当前AI在UI自动化中的应用

近年来,AI技术被集成到UI自动化中,特别是以GPT为代表的大模型出现后,因为它本身就有代码生成能力。业界也开始试着通过大模型来直接把Gherkin的测试用例描述语言生成成测试代码。

通过实时调试,让AI编写有效的UI自动化

不过,当前大模型生成的测试代码并不能完全达到预期,主要有几个问题:首先,生成出来的脚本,因为语法错误可能无法运行;其次,也可能没有准确的覆盖到测试用例需要它去测试的校验点。在我们的实践下,真正能第一次就成功的比例不超过5%。

它生成失败后,接着就需要人介入再进行一些补救的工作。包括:调试,修改用例重新生成,或者直接修改生成的脚本。

通过实时调试,让AI编写有效的UI自动化

而这些工作本身也需要消耗不少的人力,和我们系统通过AI来自动生成测试脚本的初衷相违背。

四、AI全自动的来编写有效的测试脚本

为了解决这个问题,我们重新思考了AI生成测试脚本的整个过程。

通过实时调试,让AI编写有效的UI自动化

我们把人的工作也放在里面一起考虑。人在系统中做了调试和修改的工作,那这部分工作是不是可以让AI来做呢,让系统自己运行生成的代码,让AI来调试和修改自己生成的错误代码。

因此,我们调整了系统设计,让AI代替人自主地来做这些工作。最终,对于携程酒店订单详情页的全部用例,在无人参与的情况下,生成可以执行成功的占全部的83.3%,在生成脚本过程中,有8%的case就已经发现了Bug。我们连续生成这些用例三次,成功率分别在84.3%,81.4%和83.3%,系统是稳定有效的。

通过实时调试,让AI编写有效的UI自动化

具体的测试用例和代码如下:

通过实时调试,让AI编写有效的UI自动化

首先,需要滑动到订单详情页下放的用户权益模块,然后点击订房优化区域,来弹出价格浮层。

通过实时调试,让AI编写有效的UI自动化

然后再看,费用明细里面是否包含黑钻贵宾。

通过实时调试,让AI编写有效的UI自动化

最终生成的测试代码如下:

通过实时调试,让AI编写有效的UI自动化

五、系统实现

整个系统的核心架构示意图如下。系统的核心部分是一个langchain框架的程序。它会去访问大模型,我们给它配备了多个工具,主要分成两类,一类是页面信息的获取工具,一类是调试工具。

Langchain会自动根据需要,使用页面信息获取工具,去拿页面的数据,来判断当前的操作需要具体哪个控件,来生成代码。然后再使用调试工具在手机中真实的执行代码,基于调试的反馈来判断自己生成的代码是否正确。

通过实时调试,让AI编写有效的UI自动化

5.1 提示词

有了基本的架构后,我们需要提示词,来把这些工具粘合起来,让AI理解它该如何工作。我们的提示词从结构上来说包含了几部分内容:首先告诉AI它该如何思考和工作,其次告诉它一定要通过Debug调试它每一句生成的语句,再次告诉它输出格式是什么,最后是告诉AI要处理的完整用例文本。

对于告诉AI它该如何思考和工作,展开包含以下部分:首先看页面有哪些模块,我要操作的这个步骤应该是哪个模块,这个模块里有哪些控件和组件,我当前要操作的是哪个控件或组件,我要操作的动作是什么,以及我可以用的特殊的语法是什么,然后生成语句。

通过实时调试,让AI编写有效的UI自动化

5.2 调试工具

调试工具的本质是通过adb工具远程连接到手机上。连接后,我们就可以把AI生成的指令发送给手机去运行,并且读取到运行后的结果给到AI,让AI去判断自己生成的指令是否正确。

5.3 页面信息获取工具

页面信息获取工具的最终目的是帮助AI判断出,BDD的用例上面写得要操作的内容,它具体要操作的控件的ID是什么,有了ID才能基于ID生成后续的程序指令。而为了拿到ID,我们需要有个控件和组件库,这个库里面的核心是每个控件和组件的ID以及它们的描述。有了这两项内容后,才能帮助AI看了BDD用例后,基于控件的描述去猜需要的是哪个控件。

为了达到这个目的,我们建立了一个页面控件库。这个库除了包含页面上每个控件的ID和描述外,还包含了页面和组件的关系,以及组件和控件的关系。能方便AI一步步的进行查询。

通过实时调试,让AI编写有效的UI自动化

而这个控件库本身是基于我们通过job对代码进行静态分析来生成的。不过实际应用中,因为页面当前真正展示的控件会根据场景状态的不同而不同,在某些场景下页面上的控件会隐藏。因此页面信息获取工具会把页面当前真实存在的控件和控件库中查询出来的控件做交集,从而获取到当前页面真实展示出的控件和它的描述信息。

5.4 进一步拆分AI

通过实时调试,让AI编写有效的UI自动化

当做了这些工作后,AI基本上已经可以把上面这张图黄色的部分,也就是人的工作自动去做了。生成成功率也从5%提升到了55%,但是55%的成功率还是不够的。

我们进一步分析了失败的case。发现主要问题是AI的幻觉,虽然提示词已经比较详细了,但是AI有时会没有按照要求处理,有的时候会自己胡说八道。

我们的结论是,给AI的责任太多了,它要考虑的东西太多。倒不是说它的Token不够,而是让它做的事情太多,会遗忘,无法精准完成要求。因此我们考虑进行拆分,还是利用了langchain的function的功能,既然AI能通过工具去完成功能,那这个工具为什么本身不能也是个AI呢。

通过实时调试,让AI编写有效的UI自动化

甚至还可以把它再进行拆分。

通过实时调试,让AI编写有效的UI自动化

通过这些拆分,我们让每一个AI需要考虑的工作变得更少更简单,也让它处理得更加精准,最终生成成功率提升到了80%以上。

六、后续的发展

当前,通过我们的工作,能让AI在无人参与下以80%左右的成功率去生成自动化测试的代码,很让人振奋,但还有很多问题需要继续去解决。

1)大模型的调用成本还是不低,是否有更好的办法,更低的成本去完成工作。

2)当前还有些比较难处理的操作或者校验,成功率80%还有不小的提升空间,以及目前最后还是需要人来复核生成结果。

3)除此之外,其他方面也都有提高的空间,值得我们继续去完善。

以上是通过实时调试,让AI编写有效的UI自动化的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1422
52
Laravel 教程
1316
25
PHP教程
1267
29
C# 教程
1239
24
如何理解C  中的DMA操作? 如何理解C 中的DMA操作? Apr 28, 2025 pm 10:09 PM

DMA在C 中是指DirectMemoryAccess,直接内存访问技术,允许硬件设备直接与内存进行数据传输,不需要CPU干预。1)DMA操作高度依赖于硬件设备和驱动程序,实现方式因系统而异。2)直接访问内存可能带来安全风险,需确保代码的正确性和安全性。3)DMA可提高性能,但使用不当可能导致系统性能下降。通过实践和学习,可以掌握DMA的使用技巧,在高速数据传输和实时信号处理等场景中发挥其最大效能。

C  中的chrono库如何使用? C 中的chrono库如何使用? Apr 28, 2025 pm 10:18 PM

使用C 中的chrono库可以让你更加精确地控制时间和时间间隔,让我们来探讨一下这个库的魅力所在吧。C 的chrono库是标准库的一部分,它提供了一种现代化的方式来处理时间和时间间隔。对于那些曾经饱受time.h和ctime折磨的程序员来说,chrono无疑是一个福音。它不仅提高了代码的可读性和可维护性,还提供了更高的精度和灵活性。让我们从基础开始,chrono库主要包括以下几个关键组件:std::chrono::system_clock:表示系统时钟,用于获取当前时间。std::chron

量化交易所排行榜2025 数字货币量化交易APP前十名推荐 量化交易所排行榜2025 数字货币量化交易APP前十名推荐 Apr 30, 2025 pm 07:24 PM

交易所内置量化工具包括:1. Binance(币安):提供Binance Futures量化模块,低手续费,支持AI辅助交易。2. OKX(欧易):支持多账户管理和智能订单路由,提供机构级风控。独立量化策略平台有:3. 3Commas:拖拽式策略生成器,适用于多平台对冲套利。4. Quadency:专业级算法策略库,支持自定义风险阈值。5. Pionex:内置16 预设策略,低交易手续费。垂直领域工具包括:6. Cryptohopper:云端量化平台,支持150 技术指标。7. Bitsgap:

怎样在C  中处理高DPI显示? 怎样在C 中处理高DPI显示? Apr 28, 2025 pm 09:57 PM

在C 中处理高DPI显示可以通过以下步骤实现:1)理解DPI和缩放,使用操作系统API获取DPI信息并调整图形输出;2)处理跨平台兼容性,使用如SDL或Qt的跨平台图形库;3)进行性能优化,通过缓存、硬件加速和动态调整细节级别来提升性能;4)解决常见问题,如模糊文本和界面元素过小,通过正确应用DPI缩放来解决。

C  中的实时操作系统编程是什么? C 中的实时操作系统编程是什么? Apr 28, 2025 pm 10:15 PM

C 在实时操作系统(RTOS)编程中表现出色,提供了高效的执行效率和精确的时间管理。1)C 通过直接操作硬件资源和高效的内存管理满足RTOS的需求。2)利用面向对象特性,C 可以设计灵活的任务调度系统。3)C 支持高效的中断处理,但需避免动态内存分配和异常处理以保证实时性。4)模板编程和内联函数有助于性能优化。5)实际应用中,C 可用于实现高效的日志系统。

怎样在C  中测量线程性能? 怎样在C 中测量线程性能? Apr 28, 2025 pm 10:21 PM

在C 中测量线程性能可以使用标准库中的计时工具、性能分析工具和自定义计时器。1.使用库测量执行时间。2.使用gprof进行性能分析,步骤包括编译时添加-pg选项、运行程序生成gmon.out文件、生成性能报告。3.使用Valgrind的Callgrind模块进行更详细的分析,步骤包括运行程序生成callgrind.out文件、使用kcachegrind查看结果。4.自定义计时器可灵活测量特定代码段的执行时间。这些方法帮助全面了解线程性能,并优化代码。

C  中的字符串流如何使用? C 中的字符串流如何使用? Apr 28, 2025 pm 09:12 PM

C 中使用字符串流的主要步骤和注意事项如下:1.创建输出字符串流并转换数据,如将整数转换为字符串。2.应用于复杂数据结构的序列化,如将vector转换为字符串。3.注意性能问题,避免在处理大量数据时频繁使用字符串流,可考虑使用std::string的append方法。4.注意内存管理,避免频繁创建和销毁字符串流对象,可以重用或使用std::stringstream。

MySQL批量插入数据的高效方法 MySQL批量插入数据的高效方法 Apr 29, 2025 pm 04:18 PM

MySQL批量插入数据的高效方法包括:1.使用INSERTINTO...VALUES语法,2.利用LOADDATAINFILE命令,3.使用事务处理,4.调整批量大小,5.禁用索引,6.使用INSERTIGNORE或INSERT...ONDUPLICATEKEYUPDATE,这些方法能显着提升数据库操作效率。

See all articles