Xcode 7.3 中 UITesting 中的 launchArguments 不起作用

Posted

技术标签:

【中文标题】Xcode 7.3 中 UITesting 中的 launchArguments 不起作用【英文标题】:launchArguments in UITesting in Xcode 7.3 not working 【发布时间】:2016-04-12 07:45:25 【问题描述】:

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

似乎launchArgumentslaunchEnvironment 都不能在 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"])
    

 

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

【问题讨论】:

【参考方案1】:

Apple 回复我并告诉我我错误地使用了XCUIApplication()

您不应调用XCUIApplication()多次

我读过的许多博客都多次调用此调用,大多数情况下都没有关系。事实上,许多博客文章都将函数视为访问单例。我有一种感觉这是不正确的,因为它看起来是错误的,但我认为其他人会做对的。

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

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

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

【讨论】:

救世主!犯了同样的错误!谢谢! 加油!关键是 launch() 已经设置了 launchArguments 的局部变量。这让我咬牙切齿了好几个小时。这个博客拯救了一天:drekka.ghost.io/xcuiapplication-youre-probably-doing-it-wrong 天哪,谢谢你,花了最后几个小时来解决这个问题 经过 4 小时的调试后,我的 fastlane 快照截图终于可以正常工作了。最后通过手动修改 SnapshotHelper.swift 代码来打印参数,确保它们被正确设置,然后意识到这些参数没有进入我的应用程序。啊。谢谢!【参考方案2】:

然后,您还需要启动应用程序并在应用程序中检查参数。这是我的做法...

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 中以避免发送它)。

【讨论】:

是的。做了所有这些,没有通过的论点。这就是我最初遇到这个错误的方式。我想在测试中设置一个 arg 并让应用程序检测到它并做出响应。在我的情况下,清除用户默认值。 Apple 回复了我,您的回答是正确的。我在下面给出了更详细的解释,因为我第一次阅读它时,不清楚它为什么会起作用。

以上是关于Xcode 7.3 中 UITesting 中的 launchArguments 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Xcode UITesting - 如何移动 UISlider?

XCode7 UITesting - 如何添加从 UITestCase 可用的主要目标类(未定义符号错误)?

Xcode Bots 从单个 Xcode 服务器在多个 iOS 项目上运行 UITesting

XCode UITesting Issue TrackList

Swift UITesting 错误:文字中的转义序列无效。 \U201c

XCode UITesting 检查文本字段是不是存在