☰
ARTEMIS:LLM驱动的Android真机测试Agent实践指南
2026/11/3 8:30:18 网站建设 项目流程

1. 从“点点点”到“让Agent自己点点点”

做Android开发的这几年,我越来越觉得真机测试是个体力活。自动化测试框架解决了一部分重复劳动,但脚本的维护成本一点都不低。UI只要稍微改一下ID或者布局层级,测试就断给你看,只能卷起袖子去改定位器。而探索性测试、异常路径的验证、回归测试之前的冒烟流程,这些仍然靠人工手指头戳屏幕。

所以当看到Google开源ARTEMIS的时候,我的第一反应是:这可能是把AI Agent真正接进Android真机测试链路的一个重要节点。它意味着我们不再只是用LLM去生成测试用例文本,而是让Agent直接操作真实设备,通过视觉和UI层级信息来理解局面、决策动作、执行操作,然后观察结果,继续下一步。

这篇文章就围绕ARTEMIS展开,聊聊它到底怎么工作、本地怎么跑起来、和传统测试方案比有什么优势,以及我在结合Android Studio真机调试和日常测试实践中的一些具体体会和踩坑记录。

2. ARTEMIS的核心设计:LLM驱动的Agent循环

2.1 先搞清楚它解决的是什么问题

传统自动化测试用了很多年,核心思路是“脚本驱动”:我们先分析页面结构,写清楚元素的定位方式,然后编写操作步骤,再通过框架去执行。这种模式非常稳定,但有一个致命缺陷:它无法应对未知情况。页面弹窗、权限请求、网络异常、A/B测试中出现的不同文案和布局,脚本一旦没覆盖到,就直接失败。

ARTEMIS的思路换了一个方向,它把测试变成了一个由大模型驱动的决策循环。测试人员只需要用自然语言描述意图,比如“打开设置,进入WiFi列表,连接名为TestAP的网络,验证连接状态”,ARTEMIS中的Agent就会自己去看屏幕、分析UI结构、选择合适动作、执行操作,并根据执行结果调整下一步。整个过程不再依赖固定的元素定位器,而是理解“当前界面怎么样了,我该干什么”。

这个能力对应到实际测试场景里就是:不管你UI怎么改版,只要功能还在,Agent大概率能找到新的入口路径。

2.2 “观察-思考-行动”的运行循环

ARTEMIS的底层运行逻辑是一个经典的Agent循环,可以拆成四步:

第一步,观察。Agent从Android设备上获取当前界面的信息。它有两种感知手段:屏幕截图(视觉信息)和UI层级XML(结构信息)。截图让LLM理解页面长什么样,XML则提供精确的控件属性,比如text、resource-id、 bounds等。

第二步,思考。获取到的信息被一并交给LLM。模型基于用户给出的任务目标,结合当前页面状态,产出一个决策。这个决策通常是结构化的,比如“在坐标(x, y)处执行点击”、“在某个输入框中输入文本”、“向上滑动屏幕”。

第三步,行动。决策结果传给执行器。执行器通过ADB或设备端服务把动作真正作用到设备上。这一步和人类手指头点屏幕本质上是等价的,但由程序控制,可以做更精确的位置指定和更快的重复操作。

第四步,反馈。动作执行完之后,Agent重新回到观察阶段,获取新界面信息,判断上一步操作是否生效,然后继续下一轮循环。整个过程不用人工干预,Agent会一直跑到任务完成或触发终止条件。

这个循环里最关键的是“思考”这个环节。因为LLM在这里不只是生成一串静态测试脚本,而是根据动态变化着的界面状态,不断产生新的动作序列,这让测试用例天然拥有了“感知-反馈-调整”的能力。

2.3 为什么选择视觉+UI结构双通道

我在实际测试过程中对比过纯视觉方案和纯XML方案。纯视觉方案,也就是只靠截图让模型判断,界面改动对它的影响很小,但它对坐标位置的敏感度极高,分辨率改变、窗口缩放都可能导致点击偏差,而且对页面信息量很大的界面,模型容易忽略关键控件。纯XML方案则刚好相反,控件属性非常精确,但遇到自定义控件、WebView渲染的内容、或者很多属性缺失的页面,模型能拿到的有用信息就很少。

ARTEMIS的双通道设计正好互补。真实执行时,视觉信息负责“看懂页面格局”,XML负责“精确定位控件”,模型把两者结合起来做决策。用生活化的类比,这就好比一个熟练的测试人员,既能看到整个页面的布局,又知道每个按钮的技术属性,自然操作起来又快又准。

2.4 有根和无根:两种工作模式的设计取舍

ARTEMIS区分了根设备和非根设备两种运行方式。这个设计我非常认可,因为在日常开发中,很多团队的测试机就是普通零售版设备,没有解锁Bootloader,也不想为了测试Root手机。这两种模式的核心差别在于执行动作的权限层级。

无根模式下,Agent通过Android官方支持的UI Automator服务来驱动设备,对普通应用进行操作,比如点击按钮、输入文字、滑动列表,这些完全够用。但遇到系统级弹窗,比如权限请求、系统更新弹窗,无根模式可能就无能为力了,因为UI Automator对系统界面和某些受保护窗口的控制是受限的。

有根模式则通过Shell权限执行更多底层操作,可以突破一部分系统级限制,但代价是需要一台已Root的设备,并承担相应的稳定性和风险。

对这个设计,我的选择建议是:自动化回归测试以无根模式为主,系统级权限测试和特殊弹窗处理单独准备一台Root设备。这样既保持了日常测试的覆盖度,又能在需要的时候拿出Root设备做关键场景验证。

3. 环境搭建与本地运行:在Android Studio生态中跑通ARTEMIS

3.1 准备工作项的核对清单

在动手搭建之前,先把环境清单列出来,因为ARTEMIS对依赖项有一定要求,缺一个后面跑起来就报错。

  • JDK 17:编译和运行的基本前提,低于这个版本会直接编译失败
  • Android SDK:Platform Tools和Build Tools都要装好,建议用Android Studio最新稳定版来管理SDK
  • Android设备:Android API 35(Android 15)或更高版本,且必须开启开发者选项和USB调试
  • Gradle:建议直接用项目内置的Gradle Wrapper,避免本机Gradle版本不匹配
  • 一个模型服务商:需要一个兼容OpenAI协议的大模型API地址,本地跑推荐使用DeepSeek这类性价比比较高的国产模型

这些条件整体来说并不苛刻,只要是在做Android开发,前几项基本都满足。真正关键的是设备版本,因为ARTEMIS用到了一些较新的API,老版本Android机型可能跑不起来。

3.2 拉取代码和构建项目的实际操作

项目拉取下来之后,先看项目结构,再动编译。执行:

git clone git@github.com:google/artemis.git cd artemis ./gradlew build -x test

第一次构建会比较慢,需要下载不少依赖。这里有一个经验:如果你的网络环境访问Maven仓库速度较慢,可以提前配置阿里云镜像,能节省大量时间。构建成功后,在app模块下会生成可安装的APK,这就是需要装到测试设备上的应用组件。

设备端和Agent端的连接是通过ADB完成的。确保设备已经连接,执行:

adb devices

能看到设备序列号且状态是device,才算准备好。

3.3 运行一个最简单的测试任务

环境就绪后的第一次实跑建议选一个非常简单的任务,比如“打开计算器,执行2+3,验证结果”。用命令行方式启动,大致逻辑是给ARTEMIS传入任务描述、设备标识和模型配置参数:

./gradlew :app:run --args="--device=<serial> --task='打开计算器并计算2+3' --model=<model_name>"

这里有一个很容易踩的坑:任务描述不要写得太复杂。第一次跑建议控制在“一个动作加一个验证”的粒度。我的建议是,Agent的每个任务指令,都按“目标页面-操作动作-预期结果”三段式描述,比如“打开系统时钟应用,切换到秒表功能,点击启动,验证秒表开始计时”。这样描述的好处是,给LLM的任务边界非常清晰,Agent不会因为目标模糊而绕圈子操作。

3.4 模型选择和API配置的经验

ARTEMIS作为LLM驱动的框架,底层模型的实力几乎决定了测试效果的上限。用不同的模型跑同一批任务,表现差异会非常明显。

从成本角度考虑,在验证框架能力的前期阶段,DeepSeek-V3已经能完成大部分基础UI操作任务,价格也友好。但遇到复杂操作链和模糊指令,比如“取消某个对话框然后确认设置保存”,开源模型的决策能力就容易掉链子,会出现南辕北辙的操作路径。这时候换用更强的模型,比如GPT-4系列或Claude 3.5 Sonnet,稳定性会明显提升。

配置API信息时,复制项目里的示例配置,填入Base URL、API Key和模型名称即可。有一个细节要留意:不少模型服务商提供了多个接口别名,如果模型名称填错,会在调用时立刻报错,但对不上号的情况排查起来比较隐蔽,建议用一个简单的对话请求先验证API配置是否正确。

4. 与主流真机测试方案的全面对比

4.1 横向对比:UI Automator、Appium与ARTEMIS

我自己多年下来用过UI Automator、Appium,也曾经维护过一套基于图像识别的自研工具。这三种方案加上ARTEMIS,形成了一个很鲜明的进化图谱。

方案驱动方式对UI改版的抗性需要脚本维护上手难度适用深度
UI Automator控件定位低,改ID即断高低冒烟与基础回归
Appium协议转译中高中跨平台自动化
图像识别方案像素匹配中高,换图即断中中游戏与特殊控件
ARTEMISLLM决策高,无固定定位器极低中高探索性测试、复杂流程回归

这张表的关键差异在第2列。传统方案的前提是“页面里有可靠的定位锚点”,而ARTEMIS的前提是“模型能看懂页面并做出正确决策”,锚点变成了语义级别的理解,UI大改之后依然能运作。

这就是我在实际项目中感知最明显的地方:传统脚本对UI改版的抗性太差了,小到一句话文案的变化都可能让断言失败,大到页面布局重构则基本重写。ARTEMIS则把维护成本从“改脚本”转移到“改自然语言任务描述”,变化不涉及功能本身时,很多情况下描述都无需修改。

4.2 传统脚本的不可替代场景

尽管ARTEMIS代表了新的方向,但如果直接断言它能取代UI Automator和Appium,还言之过早。

首先,稳定压倒一切的场景仍然需要脚本。比如支付流程、抢购活动这类对操作时序极其敏感的场景,脚本的确定性要比LLM的概率性可靠得多。每次点击、每次等待都是毫秒级执行和精确控制,这一点LLM的决策间隙达不到。

其次,接口自动化场景必须用脚本,ARTEMIS在这块完全帮不上忙。后端接口的请求校验、数据层的异常注入、数据库状态验证,这些不是UI层面的操作。

所以在实际项目中,合适的策略是分层的:核心链路用脚本保证稳定,探索性测试、兼容性测试、版本回归初期的冒烟测试,交给ARTEMIS来跑。两者各管一段,互为补充。

4.3 探索性测试:ARTEMIS最闪光的场景

我对这套框架最看好的应用场景是探索性测试。传统探索性测试要么靠资深测试人员的经验和直觉,要么靠Monkey随机点击碰运气。前者成本高且不可复制,后者覆盖率提升但脑残操作太多,产出结果难以分析。

ARTEMIS能做什么呢,它可以同时结合“随机性”和“智能性”。给它一个任务方向,它会在完成任务的过程中自然触发各种路径,遇到权限弹窗会尝试处理,遇到异常状态会绕行,而不会像Monkey一样重复点击无意义区域。跑完一轮之后,它能给出操作日志、屏幕记录和动作序列,这些是真正可以复盘,可以复现缺陷的信息。

我拿一个日常场景试过:让ARTEMIS执行“完成一次完整的应用内购买流程,但不要真的支付”。Agent会自己完成浏览商品、加入购物车、进入结算页面、走到支付确认前停止。全程不需要预埋任何测试数据,也无需编写步骤脚本,这对电商应用日常回归来说价值非常大。

5. 真实环境中的实操记录与问题排查

5.1 安装和连接阶段的高频报错

跑通ARTEMIS的过程中,我遇到最郁闷的问题集中在安装和设备连接阶段。第一个常见问题是APK安装失败,错误信息通常是INSTALL_FAILED_UPDATE_INCOMPATIBLE。这个一般是设备上已经装过其他签名的同名应用,卸载掉旧的就能解决,但我第一次遇到时绕了好久的弯路。

第二个高频问题是设备连接不稳定。很多USB线只有充电功能,没有数据传输通路,插上电脑后adb devices看不到设备。排查思路是先换线、换USB口,然后检查开发者选项里的USB调试是否开启,USB配置是否选择了“文件传输/MTP”模式而不是“仅充电”。

第三个问题比较隐蔽:Windows环境下,设备驱动老版本可能导致ADB无法识别机型。解决方案是安装OEM的USB驱动,或者升级到最新版Google USB Driver。

5.2 任务执行中的逻辑错乱和操作路径异常

跑真实任务时,Agent表现不稳定的情况更多。

我遇到过Agent在任务执行到一半时“忘了”最终目标,开始去点击不相干的模块。排查下来,这种情况多半和上下文窗口不够有关系。长任务执行过程中,历史操作记录和初始任务描述被截断。解决办法是降低任务复杂度,把长任务拆分成多个短任务串行执行,或者换用上下文窗口更大的模型。

还有一个常见问题是,Agent对页面是否加载完成“没有耐心”。页面还在加载时它就开始找目标控件,结果找不到就误判为任务失败。这个问题的应对方法是调整Agent的执行参数,增加操作间隔,或者给任务描述里加一句“等待页面加载完成后再操作”。

设备端方面,ARTEMIS偶尔会卡在某个动画过长的页面,反复尝试动作但无法继续。这和Agent的视觉反馈机制有关,动画会造成严重的截图状态变化,让模型误判页面还在变换。手动干预方式是等动画结束后再点击继续,自动化处理方式是增加动作间的固定延时。

5.3 效果提升的几点做法

在多次实操之后,我沉淀了一些提升ARTEMIS执行效果的技巧。

第一个技巧是为任务描述补充约束条件。比如不仅仅是说“删除一个联系人”,而是说“打开通讯录,搜索联系人张三,进入详情页,执行删除操作,删除后验证联系人列表中没有张三”。LLM对明确约束的遵循能力比模糊指令好一个数量级。

第二个技巧是凡是涉及输入文本的任务,都在描述中指明具体的输入值。比如“在搜索框中输入product_sn_10001”,而不是“输入一个商品编号”。模型对占位符的理解容易出现偏差,直接给具体值最省心。

第三个技巧是建立方便复盘的日志体系。ARTEMIS运行过程中产出的截图、动作XML和决策日志不要轻易清掉,这既是排查问题的材料,也是评估模型表现的一手证据。

5.4 如何根据自己的应用定制Agent能力

ARTEMIS不是应用好就能直接服务任意App的。它能完成任务的前提是模型对应用界面有足够理解。对于非常小众或者专业领域极强的应用,模型可能看不懂某些图标的含义,自然也就没法正确操作。

这种情况下的处理思路是针对性地给Agent补充上下文。比较简单的做法是把应用的关键页面截图和对应操作说明写进任务描述,让模型在尝试操作前有额外的背景知识。更系统的做法是积累一批应用专属的操作案例,形成一个“领域经验库”,在Agent决策时作为参考上下文输入。

从长远来看,应用团队维护一份自己的“UI词典”,把特殊控件、自定义手势、业务路径都整理成自然语言说明,逐渐把这套框架打造成团队专属的测试Agent,这里的想象空间很大。

6. 关于ARTEMIS的现状边界和后续想象力

6.1 目前的局限与适用前提

说句客观的话,ARTEMIS离“AI完全接管真机测试”还有距离。目前它的适用前提是你必须有一个足够智能且稳定的底层大模型,并且这个模型对你的应用场景有足够理解。便宜的小模型短期内扛不起复杂任务。

性能开销也是实际考量因素。一次Agent操作的延迟通常在数秒到数十秒不等,这个速度跑冒烟测试和兼容性遍历还说得过去,但要跑几千条用例的完整回归,时间成本会让人无法接受。策略上应该让ARTEMIS优先覆盖脚本写起来成本高、维护代价大的场景,而不是把现有脚本一锅端替换掉。

设备生态适配也是个现实问题。对Android系统版本的要求,意味着一些老旧测试机型无法使用。双通道机制对页面的感知,在某些自定义渲染引擎的界面上依然会有信息盲区,这些都需要实际操作中才能发现和针对性地补充处理。

6.2 从“执行指令”到“发现缺陷”的进化

我现在最关注的是ARTEMIS能否成长为不只是一个“指令执行器”。如果Agent不仅能执行自然语言描述的任务,还能从操作结果中识别出异常,比如页面崩溃、ANR、信息丢失、布局错乱,然后自动生成缺陷报告,那测试工程师的日常才会真正发生质变。

这个能力在架构上并不是遥不可及的。只要在Agent的“思考”环节加入“预期结果比对”的步骤,让模型在每次操作后评估当前状态是否合理,再辅以少量的规则校验,比如检查崩溃日志、截屏对比、控件重叠检测,就可以实现一部分缺陷自动发现的能力。

ARTEMIS目前还没有做到这一步,但它已经提供了正确的底层框架。谁先把这个闭环补完整,谁就有机会体会到“AI测试工程师”真实工作的一角。

6.3 我在实际使用中的一个体会

跑了ARTEMIS一段时间之后,我感受最深的变化是对“测试用例资产”看法的转变。传统的自动化测试资产是脚本,脚本和UI实现强绑定,UI一变资产就要返工。而用ARTEMIS之后,测试资产变成了“自然语言描述的业务意图”,这些描述基本不受UI重构的影响,反而随着业务理解的加深越来越精炼,越来越接近“一份真正可执行的业务验收清单”。

这个转变对于团队的意义是,它可以逐渐把测试资产从维护泥潭里解放出来,让测试构思本身回归业务理解,而不是把大量精力消耗在脚本的调试和修复上。

将来团队里测试工程师的重心或许会从写代码转移到“定义高质量任务描述”和“审核Agent的测试路径”上来,这更像一份带有技术性质的编辑工作,而不是机械化的执行。沿着这个方向扩展下去,真机测试会变得更像一场人与AI的协作探险,而ARTEMIS是这条路线上值得认真投入的一环。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询