移动应用测试自动化的那些事儿:一位老码农的实战经验分享

一人公司实验室
2025-06-17 18:07
阅读 280

大家好,我是小张,一名从业七八年的移动端开发工程师,现在负责公司App的整体质量保障和持续集成体系建设。今天想跟你聊聊我在移动应用测试自动化方面踩过的一些坑、攒下来的点子,以及一些真正落地的实践经验。

我并不是一开始就搞测试自动化的。刚入行的时候,我也觉得“写测试代码不如多写几个功能”,直到有一天下班前我改了个看似无关紧要的小功能,上线后直接导致用户无法登录,当天晚上被运营拉进群里狂喷……那一刻我决定好好研究下自动化测试,不能天天靠人肉保上线了。

这篇文章我会结合最近参与的一个真实项目——一个电商类混合 App(H5 + Native)的测试自动化体系搭建,来聊聊我们在实际开发中如何一步步实现自动化测试,以及过程中遇到的各种挑战和解决方案。


一、开篇背景:为啥我们急着搞自动化测试?

一、开篇背景:为啥我们急着搞自动化测试?

我们团队大概有20人左右,产品迭代节奏很快,平均每两周就要发一个版本,涉及iOS和Android两个平台。随着业务复杂度上升,单纯靠人工回归测试已经支撑不了快速上线的需求了。

特别是每次上线前都要花1-2天做回归测试,效率极低不说,还经常遗漏一些隐藏的边界问题。比如:

  • 用户在购物车页面点击收藏,跳转详情页再回到购物车时状态没变
  • 在弱网状态下提交订单失败,提示文案不友好
  • Android不同分辨率下UI布局错乱

这些问题如果都靠手动测,根本覆盖不过来。所以老大拍板:必须建立一套稳定可靠的测试自动化方案,尤其是UI自动化部分。


二、面临的问题与挑战

二、面临的问题与挑战

1. 平台差异大,代码重复高

我们的App支持iOS和Android,但很多核心路径是一样的,比如注册流程、下单、支付等。我们原本是为两个平台分别写了两套测试脚本,维护成本非常高,每次调整流程,两边都要改。

小插曲:我记得有次我们改了一个按钮的名字,结果忘了同步更新Android那侧的Selector标识符,整整跑了三天才发现用例断了。

2. H5混编带来的识别难题

这个项目是典型的混合架构,有些页面是WebView加载的H5页面。一开始我们尝试使用原生的UI元素识别方式,但根本定位不到H5里的控件。

3. 环境不稳定,设备资源管理混乱

刚开始测试时,我们随便拿几台设备跑一下,后来发现环境太不稳定:有时AppCrash、有时网络超时、有时候iOS模拟器突然卡死,自动化用例执行成功率不到70%,根本没法作为可靠的质量保障手段。

4. 测试报告不够直观,难以追踪缺陷

当时的测试日志就是简单的console输出,没有截图、录屏、错误堆栈分析,出问题时很难第一时间定位到底是哪里挂了。


三、我们的技术选型与整体方案设计

三、我们的技术选型与整体方案设计

面对以上痛点,我们开始系统地调研和选型,并最终确定了一套完整的测试自动化体系:

🧩 核心工具栈

工具/框架 平台支持 功能定位
Appium iOS/Android/H5 UI 自动化测试框架
WebDriverAgent iOS iOS驱动层
UiAutomator2 Android Android底层引擎
Pytest + Allure Python 用例组织+报告展示
Jenkins/GitLab CI - 持续集成调度
Docker + Selenium Grid 可选 多设备并行调度(后续扩展)

移动应用界面设计-1

✅ 解决思路简述

1. 统一语言与脚本结构(Python)

我们最终选择用 Python 来编写测试脚本,好处在于:

  • 支持跨平台,可以统一调用Appium进行iOS和Android的操作;
  • Python 社区活跃,生态丰富,对初学者也比较友好;
  • 用Pytest来做测试组织,Allure生成漂亮的测试报告,非常方便排查问题。

2. 解耦UI操作逻辑与测试场景

我们抽象出 Page Object Model(POM)模式,把每个页面的元素封装成对象方法,这样即使将来界面改动,也只需要修改对应页面的代码,不会影响到整个流程。

# 示例:首页页面对象
class HomePage:
    def __init__(self, driver):
        self.driver = driver

    @property
    def search_box(self):
        return self.driver.find_element(*SearchLocators.INPUT)

    def click_search_box(self):
        self.search_box.click()

3. 使用Hybrid Mode处理WebView内容

对于H5部分,我们开启了Appium的Hybrid模式,通过切换Context来访问WebView内部的内容。

def switch_to_webview(driver):
    contexts = driver.contexts
    for context in contexts:
        if 'WEBVIEW' in context:
            driver.switch_to.context(context)
            break

4. 使用Jenkins构建CI/CD流水线

我们配置了GitLab触发器,每当有Merge Request或主干有代码合并时,Jenkins自动触发一次UI测试任务。

同时,我们会将测试报告自动生成并通过钉钉机器人通知负责人,异常情况还会附上截图。


四、关键代码片段 & 实战示例

下面是一个简单的登录流程自动化测试例子,包含了等待元素、输入账号密码、点击登录按钮这些基本动作。

# test_login.py
from page_objects.home_page import HomePage
from utils import wait_for_element

def test_login_successfully(app_driver):
    driver = app_driver

    home_page = HomePage(driver)
    
    # 进入登录页
    home_page.open_login_page()
    
    # 输入账号密码
    login_page = LoginPage(driver)
    login_page.enter_username("test_user")
    login_page.enter_password("pass123456")
    
    # 点击登录
    login_page.tap_login_button()
    
    # 验证是否成功跳转主页
    assert wait_for_element(driver, HomePageLocators.USERNAME_LABEL).is_displayed()

小贴士:我们自己封装了一个wait_for_element方法,避免因为加载延迟而导致查找失败。


五、踩过的坑 & 我们是怎么填的

🔥 坑一:iOS真机连不上,WebDriverAgent反复崩溃

这个问题真的困扰了我们很久。一开始我们在Mac上本地运行Xcode调试没问题,但一旦放在CI环境中,driver就一直报错。

最后发现是因为:

  • WebDriverAgent没有正确签名;
  • Jenkins运行的用户权限不足,无法访问USB连接的设备;
  • Xcode的版本和iOS系统的兼容性也有影响;

解决办法:

  • 为 WebDriverAgent 单独配置签名证书;
  • 使用 libimobiledeviceidevice_id 来管理设备列表;
  • Jenkins上创建专属的build用户,给予足够权限;
  • 定期清理旧设备日志,防止log文件堆积。

🔥 坑二:Android端控件找不到或者找错

Android平台上的UI识别常常会出现如下问题:

  • 控件找不到,即使ID是对的;
  • 找到了控件但是点击无效;
  • 有些机型会误触其他控件。

解决办法:

  • 尽量优先使用resource-id而不是XPath(性能更好且更稳定);
  • 添加智能等待策略:比如等待元素可见、可点击后再操作;
  • 引入图像匹配机制处理特殊情况下的识别(如动态验证码);
  • 对于易变动的UI部分,抽象成通用模块,降低耦合。

🔥 坑三:H5页面识别慢,响应延迟大

早期我们直接用find_element去查H5内容,结果总是失败。后来我们做了几个优化:

优化点:

  • 切换context前加一个显式等待;
  • 对频繁交互的H5页面,使用JavaScript注入方式进行操作(例如input赋值、点击事件);
  • 在前端埋点,告诉测试脚本“当前页面准备好了”。

六、最终效果与收益总结

经过三个月的建设,我们完成了以下目标:

项目 成果说明
UI测试覆盖率 提升至80%以上,涵盖核心流程
测试执行周期 从原来的人工测试1~2天缩短到1小时
用例稳定性 准确率提升到92%以上
缺陷拦截能力 上线前发现的BUG数量提升了40%
报告可视化 Allure报告清晰明了,便于追溯问题

最重要的是,我们不再需要为了一个小版本发布而加班到凌晨三点,团队成员的心态也变得轻松了不少。


七、几点建议给正在踏上这条路的你

如果你也在考虑实施移动App测试自动化,我有几个亲身体验的经验想分享给你:

✅ 1. 别一开始就追求全覆盖,先从“高频+核心”流程入手

比如登录、下单、付款这几个流程,是值得优先做自动化的,它们直接影响用户体验和收入转化。

✅ 2. 架构设计一定要灵活,别硬编码一切

尽量用Page Object的方式组织代码,保持职责清晰,后期扩展和维护都很方便。

✅ 3. 跟产品和技术同学密切配合,确保测试逻辑跟需求一致

我们曾因为没有提前沟通,测试用例和产品文档不一致,导致白写一堆case,浪费了很多时间。

✅ 4. 把测试报告当成一种沟通语言

用Allure或其他报告工具生成图文并茂的结果,有助于你在团队中树立专业形象。

✅ 5. 别忘了性能测试和用户体验优化

UI自动化只是基础,还可以结合Monkey测试、弱网模拟、FPS检测等手段,全面保障用户体验。


结语:测试不是终点,而是起点

回想起最开始我们靠几个人熬夜手动测版本的日子,真的是又累又焦虑。但当我们建立起这套自动化体系之后,不仅产品质量有了明显提升,团队的工作氛围也变得更轻松了。

我觉得,真正的自动化,不只是写几段代码让机器帮忙点屏幕,更是构建一种高质量交付的基础设施能力。它能帮你省下大量时间去做更有创造性的事情,比如思考产品体验、重构代码、甚至写写博客分享经验 😄

希望我的这篇实战分享能对你有所帮助。如果你也在玩Appium,或者遇到了什么有意思的问题,欢迎留言交流,我们一起进步!


💡附注:目前我们这套测试框架已开源到内网,正在整理对外版本。如果你感兴趣,也可以留言,我可以发你一份Demo源码看看。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝