移动端回归测试人手不够,我落地了一套 VLM 真机自动化方案,想听听大家意见 - V2EX
爱意满满的作品展示区。
ZhaokunZhang

移动端回归测试人手不够,我落地了一套 VLM 真机自动化方案,想听听大家意见

  •  
  •   ZhaokunZhang 16h 9m ago 760 views

    最近在公司里落地了一套移动端 AI 自动化回归方案,想拿出来和大家交流一下,也听听有没有类似场景的同学。

    先说背景。

    我们这边移动端有 Android 、iOS ,现在还有鸿蒙。业务迭代比较快,每次发版前都要做一些主流程回归。

    比如:

    • 登录
    • 内容浏览
    • 内容发布
    • 视频播放
    • 核心页面跳转
    • 多端基础兼容验证

    问题是,测试资源并不是特别充足。

    不是没人测,而是没有一个专门的人长期维护复杂自动化。很多时候是测试同学过一遍主流程,开发自己再补一遍。

    时间紧的时候,大家其实都知道一些边角路径覆盖不到,但也只能先保核心链路。


    之前也看过传统自动化方案,比如 Appium 、xpath 、坐标、录制回放这些。

    实际落下来,问题基本差不多:

    页面一改,脚本就容易挂。

    Android 、iOS 、鸿蒙三端表现不完全一样。

    弹窗、权限、加载中、toast 、偶现卡顿这些情况,都要额外处理。

    最关键的是,如果没有专门自动化测试同学长期维护,这套东西很容易变成:

    刚开始能跑,过一段时间没人敢动。

    所以我后来尝试了另一条路:

    能不能把 case 写成人话,然后让模型看真实手机截图,自己判断下一步怎么操作。

    比如一个 case 可能就是:

    打开 App ,登录账号,进入首页,确认能看到推荐列表。

    系统拿到这个 case 后,分配一台真机。

    执行过程中,每一步截图给 VLM ,让模型判断当前页面状态、下一步点哪里、输入什么、是否已经完成。


    这个方向我一开始也只是想验证一下。

    但后面做着做着,发现单纯做一个本地 demo 意义不大。因为公司里真正要用,光能跑起来还不够。

    所以后面我把它补成了一个偏平台化的东西,目前已经在公司内部落地使用。

    大概流程是:

    外部系统投递一批 case ↓ 平台根据端类型寻找空闲设备 ↓ 真实手机开始执行 ↓ 每一步记录截图、模型判断、操作结果 ↓ 执行结束后生成报告 ↓ case 结果和批次结果回传给业务系统 

    现在它可以覆盖 Android 、iOS 、鸿蒙三端真机。

    不过我自己的感受是,这个东西真正有价值的地方,不是“AI 能点手机”。

    单纯让模型看图点一下,其实很容易做成 demo 。

    真正落地的时候,麻烦的反而是这些:

    • 页面是否已经稳定下来
    • 模型是不是一直卡在同一个页面
    • 弹窗、权限、广告、toast 这种临时 UI 怎么处理
    • 失败以后怎么复盘
    • 多台设备怎么调度
    • 结果怎么让内部系统消费
    • 怎么让开发和测试愿意相信这个报告

    所以我后面做的时候,重点其实放在了执行链路上,而不只是模型本身。


    当然,现在这个方案也不是没有问题。

    稳定性肯定还不如写死脚本。

    同一个 case 多跑几次,偶尔会出现模型判断不一致。

    起始状态也很重要。账号状态、权限状态、弹窗状态如果不干净,模型很容易被带偏。

    成本也要算。因为每一步都调 VLM ,跑多了肯定不是免费的。

    另外像验证码、人脸、安全键盘、强风控这些场景,我也不觉得它适合硬做。

    所以我现在对它的定位不是替代测试,也不是替代传统自动化。

    更像是个兜底工具。

    比如:

    • 开发提测前,先跑一遍主流程
    • 发版前,跑几条核心冒烟
    • 晚上定时跑一批基础回归
    • Android 、iOS 、鸿蒙三端做主链路对比
    • 没有专门自动化测试岗位的团队,先把最痛的几个流程托管起来

    目前我们内部已经用它跑了一些真实场景,确实能减少一部分重复点点点的工作。

    但我也知道这个方向还不算成熟,所以想听听大家意见。


    我比较想请教几个问题:

    1. 你们公司移动端回归一般是怎么做的?
    2. 如果没有专门自动化测试岗位,自动化最后通常是谁维护?
    3. VLM 看图操作真机这种方式,你们觉得最大的问题会是稳定性、成本,还是失败复盘?
    4. 如果只是用来兜底主流程冒烟,而不是做完整测试,你们觉得有没有价值?
    5. 这种方案要接进公司内部测试平台,你们最关心的是报告可信度、执行稳定性,还是环境隔离?

    我把目前整理出来的版本开源了,项目叫 ai-phone:

    https://github.com/dongxinsuperman/ai-phone.git

    目前主力分支是 next/server-brainmain 分支已经归档冻结。

    发出来主要不是想说这个方案已经多完善,而是因为它确实在公司里跑起来了,也踩到了一些传统自动化和 VLM 落地之间的问题。

    想听听大家怎么看这个方向,欢迎提建议,也欢迎拍砖。

    9 replies    2026-05-21 02:22:04 +08:00
    clemente
        1
    clemente  
       15h 7m ago
    钝刀秀刀功

    不如做全套 hook + ai
    beimenjun
        2
    beimenjun  
    PRO
       14h 58m ago
    之前有做 iOS 的自动化测试,其实我想的这种方案应该往外接机械设备实现现实的点击 + 摄像头来实时采集数据 + 大模型根据摄像头内容来决定点击的方向走。

    这类方案需要同时满足,“稳定、快、可复制、便宜”,感觉才有比较大的前途。

    你这一套不知道在“快”和“便宜”上不知道是如何解决问题的。
    jinxgogo
        3
    jinxgogo  
       14h 5m ago
    测试人员:“做个人吧,别再造轮子,测试都要步前端后尘了”
    cthunter
        4
    cthunter  
       13h 25m ago
    试用了一下,很不错的工作!
    前几天跑了一段时间 Midscene ,跑常规用例太慢,token 太耗了,你这个如果能和 Appium 结合起来就好了,跑完直接生成 Appium 脚本。
    ZhaokunZhang
        5
    ZhaokunZhang  
    OP
       12h 34m ago
    @jinxgogo 不是的,从我之前在杭州的经历,这个是减负的。
    edsion996
        6
    edsion996  
       11h 33m ago
    钝刀秀刀功 +1
    pipasese
        7
    pipasese  
       7h 44m ago via iPhone
    可以让你的这套流程写 UITest ,把流程固定下来。
    WebKit
        8
    WebKit  
       5h 17m ago
    直接用 codex ,把测试用例给他,让他测试就好了。界面什么的,自己通过源码找跳转方法和路径。目前测试没啥问题
    kkwwuuww
        9
    kkwwuuww  
       4h 24m ago
    安装 app 的部分怎么处理?
    About     Help     Advertise     Blog     API     FAQ     Solana     1071 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 50ms UTC 22:46 PVG 06:46 LAX 15:46 JFK 18:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86