将环境变量传递给 XCUITest

Posted

技术标签:

【中文标题】将环境变量传递给 XCUITest【英文标题】:Passing environment variables to XCUITest 【发布时间】:2020-10-26 23:27:39 【问题描述】:

我在 CI/CD 提供程序(如 CircleCI)上运行 UI 测试,我需要读取多个秘密环境变量(如测试用户名和密码)。我可以轻松设置它,但我不明白如何正确地将它们传递给测试用例。

我找到了两种方法:

    将其存储在共享方案中(在 XCode Arguments 中),这是一个坏主意,因为不应将机密存储在 git repo 中。 在 Swift / Obj-C / xconfig 文件(如小型 perl 脚本)中通过文本替换注入变量。我认为这不是 2020 年的好方法。

我使用 fastlane,但没有找到任何相关信息。

如何正确地做到这一点?

【问题讨论】:

您使用什么提供商?我认为这个功能应该站在他们这边。 【参考方案1】:

从 Xcode 7 开始,environment variables are no longer being passed on 到测试二进制文件。

但是,您可以将环境变量作为构建设置传递,然后使用 Xcode 测试方案配置将其重新定义为用于测试调用的环境变量。

例如,假设您定义了一个名为 YOUR_SECRET_ENV_VAR 的环境变量,以便从命令行将其作为构建设置传递给 Xcode:

xcrun xcodebuild test
    -workspace your-app.xcworkspace
    -scheme your-app
    -destination 'platform=ios,name=iPhone'
    YOUR_SECRET_BUILD_VAR=$YOUR_SECRET_ENV_VAR

然后,将此构建设置作为测试调用的环境变量输入到您的方案配置中。您必须取消选中 User the Run action's arguments and environment variables

最后,在你的测试代码中使用环境变量,使用:

let yourSecret = ProcessInfo.processInfo.environment["YOUR_SECRET_ENV_VAR"]

【讨论】:

如果不使用操作系统环境,我怎么能在本地机器上使用它呢?我可以在 CI 上运行xcodebuild,但在本地使用它会很不舒服。我无法在 XCode 方案中插入密钥,因为它将提交给 git。 我没有在最新的 Xcode 上尝试过这个,但显然你可以选择退出环境变量清理行为,使用 Xcode 应用程序的 defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO 或在调用时将 -UseSanitizedBuildSystemEnvironment=NO 传递给 xcodebuild从命令行。

以上是关于将环境变量传递给 XCUITest的主要内容,如果未能解决你的问题,请参考以下文章

将环境变量传递给 application.yml

如何将环境变量传递给pytest

将环境变量传递给多个命令

如何将环境变量传递给由 systemd 启动的服务

将主机环境变量传递给 dockerfile

如何将环境变量传递给前端 Web 应用程序?