xcode build 命令行变量不能同时传递给 UI 测试和 App
Posted
技术标签:
【中文标题】xcode build 命令行变量不能同时传递给 UI 测试和 App【英文标题】:xcode build command line variables cannot be passed to both UI tests and App 【发布时间】:2017-08-24 05:37:36 【问题描述】:我从终端运行以下命令:
xcodebuild test-without-building \
-workspace 'MyProject.xcworkspace' \
-scheme 'QA Automation' \
-destination 'OS=11.0,name=iPhone 6' \
-derivedDataPath /Users/me/Library/Developer/Xcode/DerivedData \
-only-testing:UITesting/testA \
WIREMOCK_PORT='9090'
在我的 XCTest 代码中,我可以按如下方式访问 WIREMOCK_PORT:
var port = ProcessInfo.processInfo.environment["WIREMOCK_PORT"]!
然后我可以启动应用程序并传递如下值:
app.launchEnvironment = ["WIREMOCK_PORT": port]
app.launch()
但是该应用无法访问 WIREMOCK_PORT,因为我必须取消选中“编辑方案”下的“使用运行操作的参数和环境变量”才能识别我的命令行环境变量。
问题:如何将命令行变量同时传递给 XCTest 和目标应用程序?
上下文: CI 服务器将运行多个 ios 模拟器和多个 Wiremock 服务器。每个模拟器一次将执行一个测试类。我将构建一次应用程序(xcodebuild build-for-testing),模拟器将使用这个带有环境变量的构建。测试需要端口来管理模拟服务器并将应用程序指向正确的模拟服务器。
【问题讨论】:
【参考方案1】:如果我正确理解您的问题,它可能会有所帮助:
您可以通过修改您的scheme.xcscheme
文件将命令行变量传递给XCTest 和App,该文件可以通过浏览xcshareddata
下的.xcodeproj
的包内容找到。
自定义 python 脚本可以在您运行xcodebuild
命令之前修改scheme.xcscheme
,并以下面提到的格式添加环境变量。然后将应用配置为在您想要的端口上进行测试。
<CommandLineArgument
argument = "-WIREMOCK_PORT"
isEnabled = "YES">
</CommandLineArgument>
将上述格式的 LaunchArgs 或 Env 变量添加到 .xcscheme
文件中。
【讨论】:
它是一样的,但是如果您需要使用不同的配置从 CI 准备您的应用程序,例如添加新的 Launch arg 或启用一个,那么它会很有帮助,特别是如果您的项目有多个测试目标并且您想要测试其中任何一个。【参考方案2】:您能否将端口作为launchArgument
而不是环境变量传递?
app.launchArguments.append("--WIREMOCK_PORT=\(port)"
app.launch()
在您的应用中:
let argument = ProcessInfo.processInfo.arguments.filter( $0.hasPrefix("--WIREMOCK_PORT=") ).first
let port = argument?.components(separatedBy: "=").last
【讨论】:
我认为这不会有什么不同——无论我使用环境变量还是参数。我最终将模拟器命名为“iPhone6_9090”并使用了 SIMULATOR_DEVICE_NAME,它可以从测试和应用程序代码中访问。然后取最后 4 个字符作为端口。 如何获取 SIMULATOR_DEVICE_NAME? 运行instruments -s devices
列出所有可用设备以上是关于xcode build 命令行变量不能同时传递给 UI 测试和 App的主要内容,如果未能解决你的问题,请参考以下文章
用于开源编译/构建的 Apple 命令行工具和 XCode?
TeamCity Xcode Build Runner 配置(命令行)
Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数