iOS 自动化测试 - XCTest 与 Appium

2023-12-20

我正在寻求测试工程师和 iOS 开发人员对特定问题的意见。

我已经使用 Appium 一年多了,在真实设备上运行移动 Web 测试时遇到了各种困难。每次 Apple 在 XCTest 或 Safari 中进行更改时,Appium 都会直接受到影响(即使他们修复了某些问题,一些其他问题也会在其位置弹出),并且已经到了我花更多时间解决 Appium 相关问题的地步:与 AUT 的相反。

此外,无论如何,您都需要一台 Apple 计算机来开发和执行 Appium iOS 测试。所以我想为什么不直接使用 XCTest 来使用 Swift 或 XCTest 支持的任何语言编写测试呢?

我非常感谢那些具有 Appium 和 XCTest(Swift 等)自动化测试经验的人的评论和意见。

与 XCTest 相比,使用 Appium 自动化 iOS 本机和 Web 应用程序测试有哪些优势?


正如您已经发现的,Appium 的最大缺点之一是它是一个第三方框架,每次 Apple 发布 Xcode 时它都会崩溃。这不太可能改变,因为苹果现在维护着自己的 UI 测试框架。

使用 Appium 还有一些其他优点 - 您可以从多种语言(Java、Ruby、Python、C#...)中进行选择,这使得任何可以使用其中一种非常流行的语言进行编程的人都可以使用它,并且您可以可以想象,在 iOS 和 Android 上同一应用程序的测试之间共享代码。

根据我的经验,虽然有很多人使用 Appium,但社区支持水平并不能弥补令人失望的维护水平;除了 Appium 与 Xcode 的兼容性脆弱之外,我发现一些关键功能在某些绑定中仍未实现,例如在 Python 中滚动。

对于 UI 测试,可靠性是框架最重要的方面。如果没有可靠性,您就不能相信测试能够标记问题,如果没有信任,您的测试对您和您的团队几乎没有任何价值。这就是为什么我推荐 XCTest 而不是任何第三方框架的原因。

使用 XCTest,您永远不必担心无法更新您的 Xcode 版本,并且该框架按照 Apple 的发布标准进行维护。与所有 iOS UI 测试框架一样,也存在一些错误(特别是在选择器方面),但我发现该框架的稳定性以及它由 Apple 拥有的事实超​​过了奇怪错误的缺点。

获得 Apple 的认可对于使用 XCTest 来说是一个重要的好处,因为 Apple 可以删除对 Appium 所依赖的 API 的访问,并且 Appium 可能会在一夜之间永远停止工作。从历史上看,苹果不会在没有至少一年通知的情况下简单地取消对自己框架的支持。

要直接使用XCTest,您需要使用Swift(推荐)或Objective-C。虽然没有 Appium 提供的语言选择那么多,但对两种语言的支持是一致的,因为它们都使用相同的实现。 Swift 是一种强有力的语言选择,特别是对于较大的项目,因为它的类型安全性允许您在运行之前注意到许多编程错误。这两种语言还在 Xcode 中为您提供了强大的智能感知(自动完成)支持,这是 Python 或 Ruby 等“动态”语言所不提供的开箱即用的功能。

随着有关将 XCTest 用于 UI 测试的更多信息的出现,以及越来越多的人觉得能够采用它,围绕 XCTest 的社区正在不断发展。用于 UI 测试的框架的许多部分多年来一直用于单元测试,因此在许多方面,在添加 UI 测试支持之前,已经有很多有关使用它的信息。

两个框架都使用相似的概念 - XCUIApplication 类似于 Appium 的 Driver,它使您可以访问屏幕上的内容。两个框架提供的功能级别可以说非常相似,因此这取决于您的优先事项 - 可靠性(XCTest)或跨其他平台的可重用性和语言可访问性(Appium)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 自动化测试 - XCTest 与 Appium 的相关文章

随机推荐

  • 从 File.OpenRead() 返回流

    我正在编写一个 WCF 服务 该服务将允许 ASP Net 网站检索文件 基于本文 http msdn microsoft com en us library ms789010 aspx Y912 我的问题是 当我返回流时 它是空白的 为简
  • WordPress wp_localize_script 是做什么的? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人可以解释一下吗wp localize script 做 即使我在 WP Codex 中读过它 我一开始也不明白它的作用 它允许您通过打
  • 如何在使用插件时将域添加到 next.config.js 的“next/image”

    这是我当前的设置 next config js const withImages require next images module exports withImages webpack config options return con
  • 使用 Promise 在 Node.js + Express 中进行错误处理

    使用 Node js Express 4 Mongoose 使用 Promise 而不是回调 我不知道如何整理我的错误处理 我得到的 相当简化的 是 app get xxx id function request response Xxx
  • 使用reduce在Javascript中构建过滤函数

    在一次采访中 有人向我提出了一个让我摸不着头脑的问题 我不想花周末担心结果 而是想尝试解决问题 但我无法弄清楚 使用下面的reduce函数 构建一个过滤函数 该函数将一个数组和一个测试函数作为参数 并返回一个新数组 该数组已根据测试函数过滤
  • SQL ORDER BY(序列)[重复]

    这个问题在这里已经有答案了 我有一个我想要的sql语句ORDER BY特定的顺序 SELECT FROM UserDB ORDER BY Role 我怎样才能将数据带到我的GridView表从顶部的 管理员 列出 然后是 用户 和 来宾 所
  • 如何在程序中获取 _GLOBAL_OFFSET_TABLE_ 地址?

    我想在我的程序中获取 GLOBAL OFFSET TABLE 的地址 一种方法是使用nm http linux about com library cmd blcmdl1 nm htmLinux 中的命令 可能会将输出重定向到文件并解析该文
  • 传递结构数组时遇到问题

    我一生都无法弄清楚如何在整个程序中传递这个结构数组 有人可以帮忙吗 现在我在 main 中收到一个错误 内容是 标记之前预期的主要表达式 Header ifndef HEADER H INCLUDED define HEADER H INC
  • 处理数据库中的层次结构数据

    我很想知道在数据库设计方面处理层次结构的最佳方法 最佳实践 是什么 这是我通常如何处理它们的一个小例子 节点表 NodeId int PRIMARY KEY NodeParentId int NULL DisplaySeq int NOT
  • 土耳其语字符上的 Postgres upper 函数未返回预期结果

    看起来像 postgresupper lower函数不处理土耳其语字符集中的选择字符 select upper Aa lower Aa from mytable 返回 AA aa 代替 AAI aai 请注意 正常的英语字符可以正确转换 但
  • 如何使用 Canvas Jetpack Compose 绘制曲线图

    有谁知道如何在 Jetpack Compose 中使用画布绘制每个角都弯曲的线条 我已经实现了这个使用Canvas drawPoints 但我想让每个角都弯曲成这样 非常感谢任何帮助 None
  • Flutter 和 Firestore 请求中没有用户信息

    Using flutter http flutter io 我已经安装了firebase 身份验证 https pub dartlang org packages firebase auth and 火库 https pub dartlan
  • 如何根据 AngularJS 中的过滤结果更改类?

    我无法弄清楚如何根据过滤器的状态 结果更改类的样式 我的代码 div div style margin top 30px a class item item recipe img class thumbnail src images thu
  • VS 2017 不会隐式将 const char* 转换为 char* [重复]

    这个问题在这里已经有答案了 我最近安装了 VS 2017 并遇到了一种奇怪的问题 基本上 如果不将硬编码字符串显式转换为 char 我就无法使用它们 如果我说类似的话Function test 它只会抛出一个错误 指出 const char
  • 优化 SELECT ... WHERE IN (...)

    我从外部系统收到一系列产品 ID 我必须显示保留序列的产品信息 我使用以下选择来执行此操作 SELECT FROM products WHERE prodid in 10331 11639 12127 ORDER BY Field prod
  • 多个独立的 mariadb 用法:多个容器还是一个?隔离与效率?

    我有一个建筑问题 假设我们有一个具有多个子系统的系统 A B 等等 每个子系统都需要保存其数据 并且它们都使用MariaDB 子系统A可能需要一个database as in create database 称为a db 和子系统B可能需要
  • 忘记放置常规图像,但它有 Retina @2x 图像

    我已经提交了我的应用程序 它支持常规版本和视网膜显示版本 我忘记放置一个常规图像文件 a png 但它有 电子邮件受保护 cdn cgi l email protection 视网膜图像 普通 iPhone 是否能够显示 电子邮件受保护 c
  • 挂钩事件时 C# 中的 COMException

    当尝试挂钩 COM 对象上的事件时 我收到 COM 异常 这是我试图执行的代码 COMClass a IComClass as ComClass a SomeEvent new SomeEvent EventHandler MethodNa
  • WebAPI CORS 和 Ninject

    我有一个 C WebAPI 项目 它具有 ninject 并且所有 get 函数都可以工作 然而 每次我尝试发布时 我都会收到来自 api 的 方法不允许 响应 我读过一些地方 这是 api 拒绝跨源调用的原因 所以我使用包管理器控制台并安
  • iOS 自动化测试 - XCTest 与 Appium

    我正在寻求测试工程师和 iOS 开发人员对特定问题的意见 我已经使用 Appium 一年多了 在真实设备上运行移动 Web 测试时遇到了各种困难 每次 Apple 在 XCTest 或 Safari 中进行更改时 Appium 都会直接受到