测试MacOS应用程序
本文档描述了如何为macOS应用UI测试配置CircleCI。
概述
CircleCI支持在macOS执行器上测试macOS应用程序,通过使用Fastlane和macOS权限orb,可以快速轻松地设置。
通过在Circleci上设置自动麦斯科斯应用程序测试,您可以轻松地针对不同版本的宏测试应用程序,并为您的开发管道添加自动化。
概念
为了测试macOS应用程序,Xcode Runner需要能够控制被测试应用程序,以允许它欺骗用户交互。随着时间的推移,苹果已经提高了macOS的安全性,现在触发macOS应用UI测试将导致一个弹出的权限对话框,询问你是否希望允许控制。但是,在本地开发机器上这不是问题,在无头CI环境中,不可能与UI交互。
Apple不提供基于替代命令行的工具,用于授予权限,但存在解决方法。通过手动修改权限数据库,我们可以插入新的权限,这将允许Xcode帮助程序与Apps进行交互。此文件,调用TCC.DB.
,负责保存有关已请求和授予或拒绝的权限的信息。
有两个独特的TCC.DB.
文件在使用。第一个副本位于主目录中〜/库/应用程序支持/ com.apple.tcc / tcc.db
第二个是/图书馆/应用支持/ com.apple.TCC / TCC.db
。添加或修改,我们需要编辑两个文件以确保运行时可用的权限。
虽然可以写入位于主目录中的副本,但不可能写入/图书馆/应用支持/ com.apple.TCC / TCC.db
启用系统完整性保护(自macOS Mojave)。在CircleCI上,所有来自Xcode 11.7及以上的图像都禁用了系统完整性保护。试图写信给TCC.DB.
在具有系统完整性保护的图像上,启用将导致作业失败。
添加权限时可以用CirCleci配置手动编写sqlite3.
命令,Circleci提供了一个ORB为了简化这个问题。
支持的Xcode和MacOS版本
测试macOS应用程序只支持Xcode 11.7图像和更新版本,因为它需要禁用系统完整性保护(SIP)。较旧的图像没有禁用SIP,因此不适合测试macOS应用程序。
如需更多资料,请参阅支持的Xcode版本列表。
设置MacOS UI测试项目
配置Circleci以运行MacOS应用程序的UI测试发生在两部分。首先,Circleci配置需要添加正确的权限并设置环境以运行测试。其次,需要配置Fastlane以执行测试。
配置Circleci.
在circleciconfig.yml
我们需要包括circleci / macos.
orb并打电话给MacOS / Add-Mac-Uitest权限
的一步。这一步确保添加了正确的权限来在macOS应用程序上运行Xcode UI测试。
如果需要其他权限,您可以了解如何将这些设置在其中麦斯科斯许可证ORB文档。
样本config.yml
用于测试MacOS应用程序:
版:2.1绿色原子:MAC权限:circleci / macos.职位:建立测试:苹果系统:Xcode.:11.7.0.脚步:-结帐-运行:回声'Chruby Ruby-2.7'>>〜/ .bash_profile-mac-permissions / add-mac-uitest-permissions-运行:捆绑安装-运行:Bundle Exec Fastlane TestandBuild工作流程:验证:职位:-建立测试
配置Fastlane.
FastLane允许您避免手动调用冗长的Xcode命令,然后编写一个简单的配置文件以启动MacOS应用程序测试。使用Fastlane您可以构建,签名(用于测试)并测试麦斯科座应用程序。
下面可以找到一个简单的配置。注意,此配置依赖于被配置为“Sign to Run local”的项目,因此您不需要设置Fastlane Match。如果您的应用程序需要签名才能测试,请遵循代码签名文档(代码签名文档会谈论iOS,但它也适用于麦克斯)。
# fastlane / Fastfiledefault_platform.:苹果平台:苹果做before_all做setup_circle_ci结束desc“测试运行”车道:TestandBuild.做扫描结束结束
可以找到完全配置的示例项目在GitHub上。
使用MacOS Orb
该TCC.DB.
文件只是一个SQLite数据库,因此这使得这使得在作业期间可以轻松注入新的权限,或修改现有权限。
同时也可以手动将其写入sqlite3.
命令,我们鼓励使用麦斯卡斯山为了简化这个问题。本节中的示例都基于orb的使用。
列出当前权限
要列出用户和系统数据库中的当前定义的权限,请调用列表权限
由ORB提供的命令,例如在此示例中:
版:2.1绿色原子:MAC权限:circleci / macos.职位:建立测试:苹果系统:Xcode.:11.7.0.脚步:-结帐-MAC权限/列表权限
样例输出:
客户服务允许-----------------------------------------------------------COM.APPLE.TERMINAL KTCCSERVICESYSTEMPOLICEALLFILES 1 COM.APPLE.TERMINAL KTCCServiceDevelopertool 1 / USR / SBIN / SSHD KTCCServiceAccessibility 1 Com.Apple.SESTEMEV KTCCServiceacisibility 1 Com.Apple.Terminal KTCCServiceAccesibility 1
该命令生成两个步骤;一种是列出用户的内容TCC.DB.
一个列出了系统TCC.DB.
。
上市许可类型
要授予权限,需要传递权限类型的正确类型的密钥。苹果公司没有清楚地记录这些,但可以通过运行来找到列表权限类型
命令,正如此示例所示:
版:2.1绿色原子:MAC权限:circleci / macos.职位:建立测试:苹果系统:Xcode.:11.7.0.脚步:-结帐-mac-permissions / list-permission-types
样例输出:
中文大意:图书馆网址:http://www.ktccservicesiri网址:kTCCServiceSpeechRecognition
为macOS应用程序测试授予默认权限
对于大多数开发人员118金宝博娱乐城来说,只需要几个终端和Xcode Helper的标准权限来为MacOS应用UI测试设置环境。这些可以通过调用来设置add-uitest-permissions
命令,例如在这个例子中:
版:2.1绿色原子:MAC权限:circleci / macos.职位:建立测试:苹果系统:Xcode.:11.7.0.脚步:-结帐-MAC-PREMISSIONS / ADD-UITEST-权限
授予新的权限
ORB可用于添加自定义权限添加许可
命令。下面的示例将屏幕捕获权限授予终端。Bundle ID和允许类型都是必需的参数:
版:2.1绿色原子:MAC权限:circleci / macos.职位:建立测试:苹果系统:Xcode.:11.7.0.脚步:-结帐-MAC-PREMISSIONS /添加权限:捆绑id.:“com.apple.Terminal”权限类型:“ktccservicescreencapture“
删除许可
如果在作业期间不太可能需要删除权限,则使用删除权限
命令。在下面的示例中,我们将从终端删除屏幕捕获权限。Bundle ID和允许类型都是必需的参数:
版:2.1绿色原子:MAC权限:circleci / macos.职位:建立测试:苹果系统:Xcode.:11.7.0.脚步:-结帐-MAC权限/删除权限:捆绑id.:“com.apple.Terminal”权限类型:“ktccservicescreencapture“