Ios 在Xcode 7.3的UITesting中启动参数不工作

Ios 在Xcode 7.3的UITesting中启动参数不工作,ios,xcode,ui-testing,Ios,Xcode,Ui Testing,我一直在用Xcode 7.3编写UI测试,最近想添加一个启动参数,以便在应用程序中启用一些测试代码。最初,我尝试设置xguiapplication()。启动arguments,就像一些人在不同的帖子中所做的那样,但它们不起作用 仔细研究一下,似乎launchArguments和launchEnvironment都不能在UI测试中设置,即使API文档说它们可以 此外,当我试图在UI测试方案中设置启动参数和环境变量时,它们也没有传递到应用程序,而在单元测试或运行应用程序时,它们是 这是我做的一个快速

我一直在用Xcode 7.3编写UI测试,最近想添加一个启动参数,以便在应用程序中启用一些测试代码。最初,我尝试设置
xguiapplication()。启动arguments
,就像一些人在不同的帖子中所做的那样,但它们不起作用

仔细研究一下,似乎
launchArguments
launchEnvironment
都不能在UI测试中设置,即使API文档说它们可以

此外,当我试图在UI测试方案中设置启动参数和环境变量时,它们也没有传递到应用程序,而在单元测试或运行应用程序时,它们是

这是我做的一个快速测试的副本来证明这一点,所有这些测试都失败了

import XCTest

class LaunchDebugUITests: XCTestCase {

    func testLaunchArgumentsSetting() {
        XCUIApplication().launchArguments = ["abc"]
        print("Arguments \(XCUIApplication().launchArguments)")
        XCTAssertTrue(XCUIApplication().launchArguments.contains("abc"))
    }

    func testLaunchArgumentsAppending() {
        XCUIApplication().launchArguments.append("abc")
        print("Arguments \(XCUIApplication().launchArguments)")
        XCTAssertTrue(XCUIApplication().launchArguments.contains("abc"))
    }

    func testLaunchEnvironmentSetting() {
        XCUIApplication().launchEnvironment = ["abc":"def"]
        print("Environment \(XCUIApplication().launchEnvironment)")
        XCTAssertEqual("def", XCUIApplication().launchEnvironment["abc"])
    }

    func testLaunchEnvironmentAppending() {
        XCUIApplication().launchEnvironment["abc"] = "def"
        print("Environment \(XCUIApplication().launchEnvironment)")
        XCTAssertEqual("def", XCUIApplication().launchEnvironment["abc"])
    }

} 

还有其他人遇到过这种情况吗?你有解决方法吗?

你还需要启动你的应用程序,并在应用程序中检查参数。我是这样做的

func testFooBar() {
    // given
    app.launchArguments = ["shouldDoBar", "shouldDoFoo"]

    // when
    app.launch()

    // then
}   
然后在你的应用程序中

int main(int argc, char *argv[]) {
    NSArray *arguments = [[NSProcessInfo processInfo] arguments];

    if ([arguments containsObject:@"shouldDoBar"]) {
       doBar();
    }

    if ([arguments containsObject:@"shouldDoFoo"]) {
       doFoo();
    }
    ...
}

您可能希望将参数检查放在更适合您使用的地方(也可能用
#ifdef DEBUG…#endif
包装,以避免发货)

苹果回复我,告诉我我使用的
xguiapplication()
不正确

不应多次调用
xguiapplication()

我读过的很多博客都多次打过这个电话,在大多数情况下,这并不重要。事实上,许多博客文章将函数视为访问单例。我有一种感觉,这是不正确的,因为它看起来是错误的,但我认为其他人会得到它的权利

但事实并非如此。它不是访问单例,而是在每次调用时创建一个新的XUIApplication实例。因此,我的代码失败了,因为我在一个实例上设置了启动参数,然后创建了另一个实例来启动

所以我的测试应该是这样的:

func testLaunchArgumentsSetting() {
    let app = XCUIApplication()
    app.launchArguments = ["abc"]
    print("Arguments \(app.launchArguments)")
    XCTAssertTrue(app.launchArguments.contains("abc"))
    app.launch()
}

是的。做了所有这些,没有传递的参数。这就是为什么我一开始就染上了这只虫子。我想在测试中设置arg,让应用程序检测并响应。在我的例子中,为了清除用户默认值,苹果给了我回复,你的答案是正确的。我在下面给出了一个更详细的解释,当我第一次读到它时,它不清楚为什么会起作用。救世主!他犯了同样的错误!谢谢加油!关键是启动()已设置launchArguments的局部变量。这让我咬了好几个小时的牙。这篇博客拯救了这一天:哦,我的上帝,谢谢你,把最后几个小时花在这个问题上这终于让我的fastlane快照在大约4个小时的调试后工作了。最后,通过手动修改SnapshotHelper.swift代码来打印参数,确保参数设置正确,然后意识到这些参数没有进入我的应用程序,从而解决了这个问题。啊。非常感谢。