一、自动化测试的不稳定因素有哪些?
由于 iOS 设备本身的特性,对 iOS 应用做自动化测试天然得会比 PC、Android 等端多出诸多不稳定的因素。
1. WDA 连接不稳定
Facebook WebDriverAgent(WDA)是一个用于 iOS 设备的 WebDriver 服务器,它允许我们通过 WebDriver 协议进行远程控制和自动化测试。它基于 Apple 的 XCTest 框架构建,可以在模拟器和真实设备上运行。我们的 iOS 自动化测试基于 WDA 来实现对控件的识别、点击、输入值、读取值等操作。

WDA 启动后,会通过以下的代码向 iOS 设备发送一个 status 请求,检查连接是否成功,设备是否完成了测试前的准备。此时,有一定的概率 status 请求不能及时响应,用例还未执行就抛错退出了,具体的示例如图 1 所示。
def is_ready(self) -> bool:
try:
self.http.get("status", timeout=3)
return True
except Exception as e:
return False
2. 测试资源不稳定
测试资源即测试过程中所需的一切资源,以下列举一些常见的测试资源不稳定情形:
- 测试账号: 有的测试账号有时效,过期了就没法登录使用,导致自动化测试任务全部失败。
- 测试环境: 前端/后台的测试环境可能经常处于变更部署中,无法提供服务;或者包含开发人员新引入的严重Bug,导致自动化测试任务大量失败。
- 测试文件: 有的测试用例需要操作一些提前构造好的文件、文档。这些重要的物料有时会被不知情的人、设计不合理的前置/后置步骤改写或删除,导致自动化测试任务部分失败。
- 测试框架: 例如笔者近期遇到的一个问题,新版的Flutter中引入了这个Bug:自动化测试进行到一定界面的一定步骤时,会使APP发生Crash,但人工执行这些步骤不会Crash。
- …
像这样的问题多如牛毛,几乎每天都有新的情况发生。但在正常的软件开发流程中,上述的大部分问题是测试/测开人员无法控制和避免的(除了第3条,可以妥善保存测试文件),因此也不是本文重点要解决的问题。
3. 高频变更的业务需求引入了很多控件定位的不稳定因素
随着业务和功能越来越完善和丰富,传统的自动化测试脚本基于XPath来定位控件,在这种APP高频变更的场景下显得岌岌可危,维护成本陡然增加。
下面在iOS端上,选择一个功能比较复杂的APP——企业微信——作为对象,举几个例子来说明:
3.1 图标控件的 XPath 变更导致无法识别

如图2所示,高频变更的图标控件已用红色的方框标出。由于开发人员的代码变更,使得这些控件在整个页面的 DOM 树中位置层级、或者 class、id 等常用于定位控件的属性频繁发生变化,进而导致在自动化测试脚本中使用传统的通过 XPath 定位控件的方法经常失效。
- 例如一某个控件的原始的XPath为:
//div[@class="tool_bar"]/div[3]/div[1]/span
变更后变成了:
//div[@class="tool_bar"]/div/div[2]/div[1]/span
- 又例如某个控件的原始XPath为:
//span[@id="at"]
变更后变成了:
//span[@id="mention"]
这是我们每天都在经历的真实事件。对于维护自动化测试脚本的人来说,可能前一秒刚用n
号安装包写好自动化脚本,下一秒换到n + 1
号安装包就报错跑不了了。
但令人无法接受的是:这些图标现在清清楚楚的出现在屏幕中间,肉眼可见,自动化测试代码却无法定位和点击它们。
3.2 文字控件的 XPath 变更导致无法识别

如图 3 所示&