Xcode UI测试,开发语言,后备翻译和CI服务器

时间:2017-10-09 18:29:07

标签: ios xcode xcode-ui-testing fastlane fastlane-snapshot

以下情景:

我有一个iOS项目,可以在CI服务器(CircleCI)上的每个git push上自动获得单元和UI测试。测试使用fastlane执行,也用于自动为App Store创建屏幕截图。

现在,我的项目被翻译成多种语言。我希望fastlane能够处理所有语言(能够截取屏幕截图),所以我改变了UI测试:

app.navigationBars.buttons["Confirm"].tap()

let buttonTitle = NSLocalizedString("navbar.confirm", comment: "")   
app.navigationBars.buttons[buttonTitle].tap()

我认为这样做会有所作为,但事实并非如此。我不知道如何在CircleCI中配置模拟器,但UI测试现在失败了

  

[00:46:34]:▸testDashboard,未找到匹配的匹配项:匹配谓词的元素"" navbar.confirm" IN标识符'来自输入{(

因此,由于某些原因,使用CFBundleDevelopmentRegion设置的回退语言不受尊重,可能是因为该语言不在捆绑包的preferredLanguages列表中。这本身就是一个问题,因为我不想在任何情况下为最终用户显示密钥。我想确保永远不会发生这种情况。

所以我尝试通过编写NSLocalizedString的包装器来检查它,检查NSLocalizedString(..)是否返回密钥,如果是,则加载默认(en)包并获取字符串本地化。

然而似乎你无法在UI测试中加载另一个包。测试将崩溃并失败。所以我无法使用此解决方法。

我只是忽略了一些明显的解决方案吗?我不能成为唯一一个有这个问题的人,对吗?任何提示?

2 个答案:

答案 0 :(得分:2)

当您使用NSLocalizedString("navbar.confirm", comment: "")时,系统会尝试从主捆绑包中的字符串文件中检索该密钥的值。

运行UITests时主包不起作用,因为它为您提供了UITest Runner App而不是UITest包的捆绑。

为了能够在UITest中使用NSLocalizedString,您必须做两件事:

<强> 1。将Localizable.strings文件添加到您的UITest目标

<强> 2。通过UITest包访问该文件(您可以使用一个小帮助方法):

func localized(_ key: String) -> String {
    let uiTestBundle = Bundle(for: AClassFromYourUITests.self)
    return NSLocalizedString(key, bundle: uiTestBundle, comment: "")
}

您可以使用UITests中的任何类来访问UITest包。

现在您可以在UITest中使用NSLocalizedString,如下所示:

app.navigationBars.buttons[localized("navbar.confirm")].tap()

如果您对更多细节感兴趣,我前一段时间就写了一点blog post

答案 1 :(得分:1)

在UI元素上设置辅助功能标识符,并使用测试中的辅助功能标识符进行查询,而不是使用本地化的字符串值。这将使您的测试与语言无关,并且不需要操作访问不同的包。

有关如何设置和使用辅助功能标识符的示例,请参阅this answer