xcode构建命令行变量无法传递给UI测试和App

时间:2017-08-24 05:37:37

标签: ios swift xcode xctest xcode-ui-testing

我从终端运行以下命令:

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,因为我必须在Edit Scheme下取消“使用Run操作的参数和环境变量”,以便识别我的命令行环境变量。

问题:如何将命令行变量传递给XCTest和目标应用程序?

上下文: CI服务器将运行多个iOS模拟器和多个Wiremock服务器。每个模拟器将一次执行一个测试类。我将构建应用程序一次(xcodebuild build-for-testing),模拟器将使用环境变量的这一个构建。测试需要端口来管理模拟服务器并将应用程序指向正确的模拟服务器。

2 个答案:

答案 0 :(得分:3)

如果我理解你的问题可能会有所帮助:

您可以通过修改scheme.xcscheme文件将命令行变量传递给XCTest和App,该文件可以通过浏览.xcodeprojxcshareddata的包内容找到。

自定义python脚本可以在运行scheme.xcscheme命令之前修改xcodebuild,并以下面提到的格式添加环境变量。然后将app配置为在您想要的端口上进行测试。

<CommandLineArgument argument = "-WIREMOCK_PORT" isEnabled = "YES"> </CommandLineArgument>

将上述格式的LaunchArgs或Env变量添加到.xcscheme文件中。

答案 1 :(得分:0)

您是否可以将端口作为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