贝博恩创新科技网

iOS自动化教程,小白也能轻松上手吗?

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

iOS自动化教程,小白也能轻松上手吗?-图1
(图片来源网络,侵删)

目录

  1. iOS 自动化简介
    • 什么是 iOS 自动化?
    • 为什么需要 iOS 自动化?
    • 自动化的主要类型
  2. 工具对比:Xcode vs. Appium
    • Xcode UI Testing (原生的、强大的)
    • Appium (跨平台的、灵活的)
  3. 使用 Xcode 进行 UI 自动化 (初学者入门)
    • 步骤 1: 创建新项目并启用 UI Test Target
    • 步骤 2: 录制你的第一个测试用例
    • 步骤 3: 查看并理解生成的代码
    • 步骤 4: 运行测试
    • 步骤 5: 编写一个简单的手动测试用例
  4. 使用 Appium 进行跨平台自动化
    • 步骤 1: 环境准备 (安装 Appium, JDK, Android Studio)
    • 步骤 2: 启动 Appium Server
    • 步骤 3: 配置并启动 iOS 模拟器/真机
    • 步骤 4: 使用 Appium Inspector 定位元素
    • 步骤 5: 编写第一个 Appium Python 测试脚本
  5. 进阶主题
    • 元素定位策略 (ID, Name, Accessibility, XPath)
    • 处理等待 (Implicit vs. Explicit Waits)
    • 处理弹窗和权限请求
    • 参数化测试与数据驱动
    • 集成到 CI/CD 流程 (如 Jenkins, GitHub Actions)
  6. 学习资源与最佳实践

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

  1. 打开 Xcode,选择 File > New > Project...
  2. 选择 iOS > App,然后点击 Next。
  3. 填写项目信息(Product Name: MyCalculator),确保语言是 Swift
  4. 在创建项目后,右键点击你的项目文件夹,选择 New > Target...
  5. 选择 iOS > UI Test,点击 Next。
  6. 给你的测试 Target 命名(如 MyCalculatorTests),然后点击 Finish。

现在你的项目结构中会有一个 MyCalculatorTests.swift 文件。

iOS自动化教程,小白也能轻松上手吗?-图2
(图片来源网络,侵删)

步骤 2: 录制你的第一个测试用例

  1. 打开 MyCalculatorTests.swift 文件。
  2. testExample() 函数中,将光标放在函数体内。
  3. 点击 Xcode 编辑器左下角的 "Record" 按钮(一个红色的圆形按钮)。
  4. Xcode 会启动你的 App 模拟器。
  5. 在模拟器中进行你想要录制的操作,
    • 点击数字 "5"。
    • 点击 "+" 号。
    • 点击数字 "3"。
    • 点击 "=" 号。
  6. 操作完成后,回到 Xcode,点击 "Stop" 按钮。
  7. 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: 运行测试

  1. 在 Xcode 左上角的 Scheme 选择器中,确保选的是 "MyCalculatorTests"
  2. 选择一个模拟器(如 iPhone 15)。
  3. 点击运行按钮(▶️)或使用快捷键 Cmd + U

Xcode 会构建并运行你的测试,你可以在 Navigator Area"Test" 标签页中查看测试结果。

步骤 5: 编写一个简单的手动测试用例

我们不用录制,而是手动编写代码来测试减法。

iOS自动化教程,小白也能轻松上手吗?-图3
(图片来源网络,侵删)
  1. 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: 环境准备

  1. 安装 Appium Server:

    • 最简单的方式是使用 npm: npm install -g appium
    • 或者下载 Appium Desktop 并安装。
  2. 安装 JDK:

    Appium 需要 Java Development Kit,请确保已安装并配置好环境变量。

  3. 安装 Android Studio (用于获取 adb):

    • 即使你不做 Android 测试,Android Studio 也提供了 adb (Android Debug Bridge) 工具,Appium 在某些情况下会用到它。
  4. 安装 Python 和 Appium-Python-Client:

    pip install Appium-Python-Client

步骤 2: 启动 Appium Server

  1. 打开 Appium Desktop。
  2. 点击 "Start Server" 按钮。

步骤 3: 配置并启动 iOS 模拟器/真机

  1. 在 Xcode 中,确保你的 MyCalculator App 可以在模拟器上运行。
  2. 打开 iOS Simulator,然后从顶部菜单栏选择 "Device > Manage Devices..."
  3. 确保有一个可用的模拟器(如 iPhone 15),并点击 "Boot" 启动它。

步骤 4: 使用 Appium Inspector 定位元素

这是 Appium 的核心功能,用于找到 UI 元素。

  1. 在 Appium Desktop 中,点击 "Start Inspector Session"
  2. 在弹出的配置窗口中,填写以下信息:
    • 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
  3. 点击 "Start Session"
  4. 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)上的相关文章。

最佳实践

  1. 稳定性第一:优先使用 Accessibility ID 定位元素。
  2. 清晰的测试结构:遵循 Arrange (准备) -> Act (执行) -> Assert (断言) 的结构。
  3. 可维护性:将测试数据和元素定位器(如 By.ACCESSIBILITY_ID, "login_button")提取到配置文件或常量中。
  4. 编写可读性高的测试:测试代码本身也是代码,要写得清晰易懂。
  5. 不要过度自动化:不是所有测试都适合自动化,优先自动化重复性高、价值大的回归测试。

希望这份详细的教程能帮助你顺利开启 iOS 自动化之旅!祝你学习愉快!

分享:
扫描分享到社交APP
上一篇
下一篇