XCUITests - 通过命令行传递环境变量

Posted

技术标签:

【中文标题】XCUITests - 通过命令行传递环境变量【英文标题】:XCUITests - Passing in environment variables via command line 【发布时间】:2017-03-01 16:40:46 【问题描述】:

我正在尝试通过命令行向我的 XCUITest 传递一个值。我知道可以通过以下方式为 XCTest(非 UI)执行此操作:

xcodebuild -verbose test -workspace MyWorkspace.xcworkspace -derivedDataPath derivedData -scheme "MyScheme" -configuration Debug SYMROOT="$(pwd)"/build -destination platform="ios 模拟器",name="iPad Air",OS=10.2 -only-testing:UITests/UITests -resultBundlePath 日志文件 MY_SETTING="setting_value" MY_OTHER_SETTING="setting_value_2"

然而,这在我的 XCUITest 中似乎不起作用,因为代码没有进入 #ifdef MY_SETTING 块。有没有另一种方法可以通过命令行将值传递给我的 XCUITest,还是不可能?

【问题讨论】:

在调用xcodebuild...之前设置MY_SETTING @shallowThought 没用。 我错了。对不起。 【参考方案1】:

感谢您在下面的回答,我发现这个答案最终对我有用。 Applitools 的大佬们为我解答了这个问题,具体步骤如下:

最重要的一步是让 Xcode 知道我们使用的变量 将从命令行传递。

让我们调用我们的变量 TEST_VAR。为此,请按照以下步骤操作:

1) 打开 Xcode,选择 TEST TARGET(not target of application) https://www.evernote.com/l/AR0BF8Te8_hFGYON8jKqIkv3grnwFky16tc

2) 选择“Build Settings”并添加“Preprocessor Macros” 部分 TEST_VAR=$(TEST_VAR)

https://www.evernote.com/l/AR1b4QRysBlDRro3sbKH1hSy6s_2s_Qkxnw

3) 通过点击“+”按钮并选择添加新的用户定义设置 “添加用户定义的设置” https://www.evernote.com/l/AR0qflFqN2lIEoKVVzUUYRArM49Qb1d2TUE

4) 为您的新自定义设置设置默认值 https://www.evernote.com/l/AR32JBfPDhFIN76ZlJjq1eV7v8bry9WImfE

现在变量 TEST_VAR 可以使用了。

这是我如何通过测试的示例。我的测试项目是 工作空间内。所以我打开终端并前往目的地 我工作区的文件夹。

xcodebuild -workspace workspace_name\ workspace.xcworkspace/ -scheme YourSchemeName -sdk iphonesimulator -destination 'platform=iOS 模拟器,名称=iPhone 6,操作系统=10.2' -only-testing:TestTargetName/TestCaseName/testName TEST_VAR=1988 测试

在测试中,我可以以某种方式获取 TEST_VAR 变量的值 这个:NSLog(@"TEST_VAR %li", (long)TEST_VAR);

但是,我还需要定义另一个预处理器宏来解开我传入的值的字符串值,如下所述:Accessing the value of a Preprocessor Macro definition。

所以为了检索字符串值,我做了类似的事情:

NSLog(@"TEST_VAR %s", MACRO_VALUE(TEST_VAR))

【讨论】:

【参考方案2】:

如果您需要将 环境变量 从您的架构传递到 XCUITes,请在每个测试类上修改 XCTestCase -> app.launchEnvironment 对象:

斯威夫特 3

override func setUp()
    app.launchEnvironment = ProcessInfo.processInfo.environment

【讨论】:

【参考方案3】:

这是可以做到的,是的,不过你少了两个步骤。

    设置您的 Scheme 以将环境变量设置为 MY_SETTING 作为其值。 if let mySetting = ProcessInfo.processInfo.environment['MY_SETTING'] // do whatever you want because it is defined

有点像Accessing user defined variables passed in from xcodebuild command line的骗子

【讨论】:

【参考方案4】:

没有通过 xcodebuild 将值传递给 UI 测试的本地方法。在运行 UI 测试之前,您可以使用 perl 单行代码替换项目中的值:

perl -pi -e 's/valueToReplace/replacementValue/g' <path to file to modify>

我过去曾使用此方法替换项目中的基本 URL,以便针对模拟服务器运行 UI 测试。

【讨论】:

以上是关于XCUITests - 通过命令行传递环境变量的主要内容,如果未能解决你的问题,请参考以下文章

参数传递策略 - 环境变量与命令行

进程对应程序的命令行参数和环境变量

CMAKE 使用环境变量而不将它们作为命令行参数传递?

使用 `env` 命令和通过文件传递环境变量的最佳方式

无法将环境变量传递给 docker

将预处理器变量传递给 nmake 构建环境