- 首页
- /
- Appium vs XCUITest
Appium vs XCUITest
Appium 和 XCUITest 是自动化 iOS UI 测试的两种主流方式。Appium 是一个基于 W3C WebDriver 协议的跨平台、黑盒框架;XCUITest 是 Apple 推出的快速原生框架,仅适用于 iOS。本指南将对它们进行全面比较,并提供代码示例和结论,让您在五分钟内即可付诸行动。
- 浏览器和设备
- 6100+
- 云并行
- 100×
- 正常运行时间服务级别协议
- 99.99%
被世界上一些最具创新性的公司所信任
你应该选哪一个?
您希望使用一套测试套件同时在 iOS 和 Android 上运行,您的团队使用 Java、Python、JavaScript、Ruby 或 C# 工作,或者您测试的应用无法通过测试 target 重新构建。
您仅测试 iOS,您在 Xcode 中拥有应用,并且您希望获得最快、最可靠的原生 UI 测试,使用 Swift 或 Objective-C 与您的应用一同编写。
您使用 XCUITest 进行快速的仅 iOS 原生测试,并使用 Appium 实现跨平台的端到端覆盖。TestingBot 可以在同一个真实设备网格上并行运行两者。
Appium 和 XCUITest 是什么?
两种设计相反的 iOS UI 自动化框架。一个是跨平台和黑盒的,另一个是 Apple 原生并与 Xcode 紧密耦合的。
Appium
发布于 2012 年 · OpenJS Foundation · Apache 2.0
Appium 是一个开源的跨平台测试框架,适用于原生、混合和移动 Web 应用。它实现了 W3C WebDriver 协议,因此同一个客户端库可以使用 Java、Python、Node.js、Ruby、C# 等语言同时驱动 iOS 和 Android。
Appium 以黑盒方式从外部驱动应用,因此它不需要应用源代码。在 iOS 上,它在底层使用 Apple 的 XCUITest(通过 WebDriverAgent);在 Android 上,它使用 UiAutomator2。正是这一层使得一个测试可以跨平台复用。
- Java / Python / Node.js / Ruby / C# / PHP
- 跨平台,原生、混合和移动 Web
- 黑盒,无需应用源代码
XCUITest
发布于 2015 年 · Apple · Xcode 的一部分
XCUITest 是 Apple 的 UI 测试框架,是随 Xcode 一同提供的更大的 XCTest 框架的一部分。测试使用 Swift 或 Objective-C 编写,并通过 XCTest 在设备上运行,对 iOS 辅助功能树拥有一流的访问能力。
由于 XCUITest 是原生的并由 Apple 维护,它速度快、可靠,并且始终与最新的 iOS 保持同步。其权衡之处在于:它仅适用于 iOS,使用 Swift 或 Objective-C 编写,并且需要一个 Xcode 测试 target。
- Swift 和 Objective-C
- 原生 XCTest,辅助功能树访问
- 仅限 iOS · 需要 Xcode 测试 target
Appium 与 XCUITest:并排比较
在 iOS UI 测试和跨平台覆盖方面需要考虑的各个重要维度。
| 方面 |
|
|
|---|---|---|
| First release | 2012 | 2015 |
| Maintained by | Open source (OpenJS Foundation) | Apple |
| Platforms | iOS + Android | iOS only |
| Languages | Java, Python, JS, Ruby, C#, PHP | Swift, Objective-C |
| Protocol | W3C WebDriver | XCTest / XCUITest (native) |
| iOS engine | XCUITest via WebDriverAgent | XCUITest (direct) |
| Speed | Slower (extra layers) | Faster (native) |
| App source needed | No (black-box) | Yes (Xcode test target) |
| Tooling | Any IDE / CI | Xcode |
| Cross-platform reuse | Same test on iOS + Android | iOS only |
| Web / hybrid apps | Yes | Limited |
| Flakiness | Good | Excellent (native sync) |
| On TestingBot | Upload app, WebDriver hub | Upload app + test zip, CLI |
| Free for open source on TestingBot | ✓ | ✓ |
两者均运行在 TestingBot 的真实 iPhone 和 iPad 上。Appium 使用上传的应用连接到 WebDriver hub;XCUITest 通过 TestingBot CLI 运行。
在 iOS 上登录
由 Appium 以黑盒方式驱动、由 XCUITest 以原生方式驱动的登录流程。两者均在 TestingBot 上同一批真实 iPhone 上运行。
# real iPhone on TestingBot from appium import webdriver from appium.options.ios import XCUITestOptions from appium.webdriver.common.appiumby import AppiumBy opts = XCUITestOptions().load_capabilities({ 'platformName': 'iOS', 'appium:app': 'tb://APP_ID', 'tb:options': { 'realDevice': True }, }) d = webdriver.Remote('https://hub.testingbot.com/wd/hub', options=opts) d.find_element(AppiumBy.ACCESSIBILITY_ID, 'username').send_keys('jane') d.find_element(AppiumBy.ACCESSIBILITY_ID, 'sign_in').click() assert d.find_element(AppiumBy.ACCESSIBILITY_ID, 'welcome').is_displayed()
// runs via the TestingBot CLI func testLoginRedirectsToDashboard() { let app = XCUIApplication() app.launch() app.textFields["username"].typeText("jane@example.com") app.secureTextFields["password"].typeText("secret") app.buttons["sign_in"].tap() XCTAssertTrue(app.staticTexts["welcome"].exists) }
Appium 测试使用上传的应用连接到 WebDriver hub;XCUITest 套件通过 TestingBot CLI 运行。两者都在真实 iPhone 和 iPad 上运行。
何时选择哪个
选择 Appium 时
- 您需要一套测试套件无需重写即可同时在 iOS 和 Android 上运行。
- 您的团队使用 Java、Python、JavaScript、Ruby 或 C# 编写代码,而非 Swift。
- 您测试的应用无法通过测试 target 重新构建,或者是第三方或混合应用。
- 您已经在使用 Selenium 或 WebDriver,并希望在移动端使用相同的协议。
- 您使用一个工具测试原生、混合和移动 Web 流程。
选择 XCUITest 时
- 您仅测试 iOS 并在 Xcode 中拥有应用,因此测试 target 没有问题。
- 您希望获得最快、最可靠且紧跟最新 iOS 的原生 iOS 测试。
- 您的团队使用 Swift 或 Objective-C 编写代码,并希望测试与应用代码放在一起。
- 您需要深度访问 iOS 辅助功能树和原生组件。
- 您从第一天起就将 UI 测试作为 Xcode 构建和 CI 的一部分运行。
停止选择,在同一网格上运行两者
上传您的应用并通过 WebDriver hub 使用 Appium 以黑盒方式驱动它,或者通过 TestingBot CLI 运行您的 XCUITest 套件。两者都在同一批真实 iPhone 和 iPad 上运行,使用相同的仪表板、并行槽位、视频录制和欧盟数据驻留。
- 真实的 iPhone 和 iPad
- 两个框架的并排测试历史记录
- 免费开源,这两个框架都是如此
--device "iPhone 16" --real-device
常见问题解答
团队在选择(或组合)这些框架之前会提出的问题。
XCUITest 比 Appium 快吗?
是的,在 iOS 上如此。XCUITest 是 Apple 的原生框架,通过 XCTest 在设备上运行,因此它避免了 Appium 额外增加的 WebDriver 和 WebDriverAgent 层。这使得 XCUITest 更快且非常可靠。其权衡之处在于,XCUITest 仅适用于 iOS 并使用 Swift 或 Objective-C 编写,而 Appium 以您选择的语言在 iOS 和 Android 上运行相同的测试。
在 iOS 上我应该使用 Appium 还是 XCUITest?
这取决于您的目标。对于您拥有 Xcode 项目的仅 iOS 测试,XCUITest 提供最快、最可靠的原生运行。对于跨平台覆盖、使用非 Swift 语言编写的测试,或者您无法重新构建的应用,Appium 是更合适的选择。请注意,Appium 在底层通过 XCUITest 驱动 iOS,因此您选择的是抽象级别,而不是不同的引擎。
Appium 内部使用 XCUITest 吗?
是的。在 iOS 上,Appium 使用一个名为 WebDriverAgent 的组件通过 Apple 的 XCUITest 框架驱动应用。因此,Appium 的 iOS 测试最终运行在 XCUITest 之上,而 Appium 在其上添加了跨平台的 WebDriver API。这就是为什么 Appium 能够为 iOS 和 Android 提供相同的测试接口,同时在底层仍然使用每个平台的原生自动化。
XCUITest 可以测试 Android 应用吗?
不可以。XCUITest 是 Apple 推出的仅适用于 iOS 的框架。要测试 Android,您需要 Espresso(Google 的原生框架)或 Appium,后者通过 UiAutomator2 驱动 Android。Appium 是其中唯一能在两个平台上运行相同测试的工具。TestingBot 可在真实设备上运行所有这些工具。
我可以在 iOS 和 Android 上复用相同的测试吗?
使用 Appium 可以。由于 Appium 实现了 W3C WebDriver 协议并抽象了原生驱动程序(iOS 上的 XCUITest,Android 上的 UiAutomator2),单个测试只需进行少量能力变更即可针对两个平台。XCUITest 无法做到这一点;它仅适用于 iOS。如果跨平台复用很重要,那么 Appium 是值得选择的框架。
XCUITest 需要 Mac 和 Xcode 吗?
您需要一台装有 Xcode 的 Mac 来在本地编写和构建 XCUITest 测试。要大规模运行它们,您不需要自己的 Mac 机群:只需构建一次应用的 .ipa 和 XCUITest 的 .zip,然后将两者都上传到 TestingBot,并在云端的真实 iPhone 和 iPad 上运行。Appium 测试在您这边完全不需要 Xcode。
我可以在 TestingBot 上运行 Appium 和 XCUITest 吗?
是的,两者都运行在同一个 TestingBot 网格上。Appium 将您的应用上传到 TestingBot Storage,然后使用值为 tb://APP_ID 的 appium:app 能力连接到 https://hub.testingbot.com/wd/hub。XCUITest 通过 TestingBot CLI 运行:testingbot xcuitest app.ipa app-test.zip --device "iPhone 16" --real-device。两者共享相同的仪表板、并行槽位和欧盟数据驻留,并且对开源项目免费开放。