我们将涵盖从最基础的 “录制与回放” 到专业级的 “代码编写”,包括最主流的工具和框架。

目录
- iOS 自动化简介
- 什么是 iOS 自动化?
- 为什么需要 iOS 自动化?
- 自动化的主要类型
- 工具对比:Xcode vs. Appium
- Xcode UI Testing (原生的、强大的)
- Appium (跨平台的、灵活的)
- 使用 Xcode 进行 UI 自动化 (初学者入门)
- 步骤 1: 创建新项目并启用 UI Test Target
- 步骤 2: 录制你的第一个测试用例
- 步骤 3: 查看并理解生成的代码
- 步骤 4: 运行测试
- 步骤 5: 编写一个简单的手动测试用例
- 使用 Appium 进行跨平台自动化
- 步骤 1: 环境准备 (安装 Appium, JDK, Android Studio)
- 步骤 2: 启动 Appium Server
- 步骤 3: 配置并启动 iOS 模拟器/真机
- 步骤 4: 使用 Appium Inspector 定位元素
- 步骤 5: 编写第一个 Appium Python 测试脚本
- 进阶主题
- 元素定位策略 (ID, Name, Accessibility, XPath)
- 处理等待 (Implicit vs. Explicit Waits)
- 处理弹窗和权限请求
- 参数化测试与数据驱动
- 集成到 CI/CD 流程 (如 Jenkins, GitHub Actions)
- 学习资源与最佳实践
iOS 自动化简介
什么是 iOS 自动化?
iOS 自动化是指使用脚本或工具来自动化地与 iOS 应用程序进行交互,模拟用户的操作(如点击、输入、滑动等),并验证应用的行为是否符合预期。
为什么需要 iOS 自动化?
- 提高测试效率:将测试人员从重复、繁琐的手动测试中解放出来。
- 提升测试覆盖率:可以执行大量手动测试难以覆盖的场景(如并发操作、极限数据量测试)。
- 快速反馈:集成到 CI/CD 流程中,每次代码提交后自动运行测试,快速发现回归问题。
- 保证质量:减少人为错误,确保应用版本迭代的稳定性。
自动化的主要类型
- UI (用户界面) 自动化:模拟真实用户操作,从外部测试应用的 UI 功能,这是最常见的形式。
- 单元测试:测试代码中最小的可测试单元(如一个函数或方法),不依赖 UI。
- 集成测试:测试多个模块或组件组合在一起时的工作情况。
- 性能测试:测试应用的响应时间、内存占用、CPU 使用率等。
本教程主要聚焦于 UI 自动化。
工具对比:Xcode vs. Appium
| 特性 | Xcode UI Testing | Appium |
|---|---|---|
| 开发语言 | Swift / Objective-C | 多种语言 (Java, Python, JavaScript, Ruby, C# 等) |
| 平台支持 | 仅限 Apple 生态 (iOS, macOS) | 跨平台 (iOS, Android, Windows) |
| 学习曲线 | 较低 (如果你熟悉 Swift/Xcode) | 较高 (需要学习 Appium 协议和所选语言) |
| 灵活性 | 较高,与 Xcode 深度集成,调试方便 | 极高,可使用任何语言和测试框架 |
| 适用场景 | Apple 开发者首选,项目完全基于 Apple 技术 | 需要跨平台测试,或团队使用非 Apple 技术栈 |
| 核心优势 | 原生支持,性能好,调试体验佳 | 一次学习,多端测试,社区庞大 |
- 如果你是一名 iOS 开发者,或者你的项目 只运行在 iPhone/iPad 上,Xcode UI Testing 是最自然、最高效的选择。
- 如果你是一名 QA 工程师,需要同时测试 iOS 和 Android 应用,或者你的团队主要使用 Python/Java 等语言,Appium 是不二之选。
教程一:使用 Xcode 进行 UI 自动化 (初学者入门)
我们将创建一个简单的计算器应用,并为其编写自动化测试。
步骤 1: 创建新项目并启用 UI Test Target
- 打开 Xcode,选择 File > New > Project...。
- 选择 iOS > App,然后点击 Next。
- 填写项目信息(Product Name:
MyCalculator),确保语言是 Swift。 - 在创建项目后,右键点击你的项目文件夹,选择 New > Target...。
- 选择 iOS > UI Test,点击 Next。
- 给你的测试 Target 命名(如
MyCalculatorTests),然后点击 Finish。
现在你的项目结构中会有一个 MyCalculatorTests.swift 文件。

步骤 2: 录制你的第一个测试用例
- 打开
MyCalculatorTests.swift文件。 - 在
testExample()函数中,将光标放在函数体内。 - 点击 Xcode 编辑器左下角的 "Record" 按钮(一个红色的圆形按钮)。
- Xcode 会启动你的 App 模拟器。
- 在模拟器中进行你想要录制的操作,
- 点击数字 "5"。
- 点击 "+" 号。
- 点击数字 "3"。
- 点击 "=" 号。
- 操作完成后,回到 Xcode,点击 "Stop" 按钮。
- Xcode 会自动生成 Swift 代码来重放你刚才的操作。
步骤 3: 查看并理解生成的代码
你会看到类似这样的代码:
import XCTest
final class MyCalculatorTests: XCTestCase {
let app = XCUIApplication()
var calc: XCUIApplication!
override func setUpWithError() throws {
try super.setUpWithError()
app.launch()
// 在这里可以添加一些启动前的设置
}
override func tearDownWithError() throws {
// 在这里可以添加一些清理工作
try super.tearDownWithError()
}
func testAddition() {
// 这是录制生成的代码
app.buttons["five"].tap()
app.buttons["plus"].tap()
app.buttons["three"].tap()
app.buttons["equals"].tap()
// 验证结果
let resultLabel = app.staticTexts["8"] // 假设结果标签的 identifier 是 "8"
XCTAssertTrue(resultLabel.exists, "The result should be 8")
}
}
代码解读:
let app = XCUIApplication(): 获取对被测应用的引用。app.buttons["five"].tap(): 通过元素的 Accessibility Identifier ("five") 找到按钮,并执行tap()(点击) 操作。XCTAssertTrue(resultLabel.exists, "..."): 断言(验证)结果标签存在,如果不存在则测试失败并打印后面的信息。
步骤 4: 运行测试
- 在 Xcode 左上角的 Scheme 选择器中,确保选的是 "MyCalculatorTests"。
- 选择一个模拟器(如 iPhone 15)。
- 点击运行按钮(▶️)或使用快捷键
Cmd + U。
Xcode 会构建并运行你的测试,你可以在 Navigator Area 的 "Test" 标签页中查看测试结果。
步骤 5: 编写一个简单的手动测试用例
我们不用录制,而是手动编写代码来测试减法。

- 在
MyCalculatorTests.swift中,创建一个新的测试函数:
func testSubtraction() {
// 点击 9
app.buttons["nine"].tap()
// 点击 -
app.buttons["minus"].tap()
// 点击 4
app.buttons["four"].tap()
// 点击 =
app.buttons["equals"].tap()
// 验证结果
let resultLabel = app.staticTexts["5"] // 假设结果是 5
XCTAssertTrue(resultLabel.exists, "The result should be 5")
}
再次运行测试,看看新添加的测试用例是否通过。
教程二:使用 Appium 进行跨平台自动化
我们将使用 Python 和 Appium 来测试同一个计算器应用。
步骤 1: 环境准备
-
安装 Appium Server:
- 最简单的方式是使用
npm:npm install -g appium。 - 或者下载 Appium Desktop 并安装。
- 最简单的方式是使用
-
安装 JDK:
Appium 需要 Java Development Kit,请确保已安装并配置好环境变量。
-
安装 Android Studio (用于获取
adb):- 即使你不做 Android 测试,Android Studio 也提供了
adb(Android Debug Bridge) 工具,Appium 在某些情况下会用到它。
- 即使你不做 Android 测试,Android Studio 也提供了
-
安装 Python 和 Appium-Python-Client:
pip install Appium-Python-Client
步骤 2: 启动 Appium Server
- 打开 Appium Desktop。
- 点击 "Start Server" 按钮。
步骤 3: 配置并启动 iOS 模拟器/真机
- 在 Xcode 中,确保你的
MyCalculatorApp 可以在模拟器上运行。 - 打开 iOS Simulator,然后从顶部菜单栏选择 "Device > Manage Devices..."。
- 确保有一个可用的模拟器(如 iPhone 15),并点击 "Boot" 启动它。
步骤 4: 使用 Appium Inspector 定位元素
这是 Appium 的核心功能,用于找到 UI 元素。
- 在 Appium Desktop 中,点击 "Start Inspector Session"。
- 在弹出的配置窗口中,填写以下信息:
- Platform Name:
iOS - Device Name: 你的模拟器名称(如
iPhone 15) - App Path: 点击 "Choose...",然后选择你 Xcode 项目中编译好的
.app文件路径,通常在~/Library/Developer/Xcode/DerivedData/MyCalculator-.../Build/Products/Debug-iphonesimulator/MyCalculator.app。 - Automation Name:
XCUITest
- Platform Name:
- 点击 "Start Session"。
- Inspector 窗口会打开,并显示你的 App 界面,你可以点击界面上的元素(如 "5" 按钮),右侧会显示该元素的详细信息,包括它的
identifier,label,value等。identifier是最稳定、最推荐使用的定位方式。
记下你需要的元素的 identifier,"five", "plus", "result"。
步骤 5: 编写第一个 Appium Python 测试脚本
创建一个名为 test_appium.py 的文件,并写入以下代码:
from appium import webdriver
from appium.webdriver.common.by import By
from appium.webdriver.common.appiumby import AppiumBy
import time
# 配置 Desired Capabilities
caps = {
"platformName": "iOS",
"deviceName": "iPhone 15", # 确保和模拟器名称一致
"automationName": "XCUITest",
"app": "/Users/your_username/Library/Developer/Xcode/DerivedData/MyCalculator-.../Build/Products/Debug-iphonesimulator/MyCalculator.app", # 替换为你的 .app 文件路径
"noReset": True,
"wdaStartupRetries": 4
}
# 初始化 WebDriver
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
try:
# 查找元素并执行操作
# 使用 AppiumBy.ACCESSIBILITY_ID 来定位元素
driver.find_element(AppiumBy.ACCESSIBILITY_ID, "five").click()
driver.find_element(AppiumBy.ACCESSIBILITY_ID, "plus").click()
driver.find_element(AppiumBy.ACCESSIBILITY_ID, "three").click()
driver.find_element(AppiumBy.ACCESSIBILITY_ID, "equals").click()
# 验证结果
# 假设结果的 accessibility identifier 是 "result"
result_element = driver.find_element(AppiumBy.ACCESSIBILITY_ID, "result")
assert result_element.text == "8"
print("测试通过!加法结果正确。")
finally:
# 一定要关闭 driver
driver.quit()
运行脚本: 在终端中执行:
python test_appium.py
Appium 会启动你的 App,执行脚本中的操作,并打印结果。
进阶主题
元素定位策略
- ID (Accessibility Identifier): 首选,最稳定,不受语言和文本变化影响。
- Name (Accessibility Label): 元素的文本描述,容易受文本变化影响。
- XPath: 强大的定位语言,可以写非常复杂的表达式,但性能较差,且容易因 UI 变化而失效。
- Class Name: 元素的类名,如
XCUIElementTypeButton,不够精确,通常需要和其他策略结合使用。
处理等待
UI 元素可能不会立即出现,直接操作会导致失败。
-
隐式等待: 全局等待,在查找元素时,如果找不到,会等待指定的时间再重试。
driver.implicitly_wait(10) # 最多等待10秒
-
显式等待: 针对特定元素等待,更推荐使用,因为它更精确,可以避免不必要的等待。
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待最多10秒,直到 id 为 "result" 的元素可见 result_element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((AppiumBy.ACCESSIBILITY_ID, "result")) )
处理弹窗和权限请求
- 在测试脚本中,可以预先判断弹窗是否存在,然后执行点击操作。
# 点击 "允许" 按钮 try: allow_button = driver.find_element(AppiumBy.ACCESSIBILITY_ID, "Allow") allow_button.click() except: print("没有找到权限弹窗")
集成到 CI/CD
将自动化测试脚本集成到持续集成/持续部署流程中(如 Jenkins, GitLab CI, GitHub Actions),可以实现每次代码提交后自动运行测试,快速发现回归问题,是现代软件开发的最佳实践。
学习资源与最佳实践
学习资源
- 官方文档:
- 社区和教程:
- Appium 官方 GitHub 仓库和示例。
- YouTube 上的 "Appium Tutorial" 和 "Xcode UI Testing" 视频教程。
- 各大技术博客(如 Medium, InfoQ)上的相关文章。
最佳实践
- 稳定性第一:优先使用
Accessibility ID定位元素。 - 清晰的测试结构:遵循
Arrange (准备) -> Act (执行) -> Assert (断言)的结构。 - 可维护性:将测试数据和元素定位器(如
By.ACCESSIBILITY_ID, "login_button")提取到配置文件或常量中。 - 编写可读性高的测试:测试代码本身也是代码,要写得清晰易懂。
- 不要过度自动化:不是所有测试都适合自动化,优先自动化重复性高、价值大的回归测试。
希望这份详细的教程能帮助你顺利开启 iOS 自动化之旅!祝你学习愉快!
