使用带有 UI 测试的 Cucumberish 从情节提要加载控制器

Posted

技术标签:

【中文标题】使用带有 UI 测试的 Cucumberish 从情节提要加载控制器【英文标题】:Load controller from storyboard using Cucumberish with UI Testing 【发布时间】:2018-12-25 23:13:16 【问题描述】:

我正在尝试使用 Cucumberish 框架通过 BDD 实现 UI 测试。 我非常了解功能文件解析系统,并且我设法测试了主屏幕的一些 UI 元素。

但是,我想在相应屏幕上使用 UI 测试之前从情节提要加载任何控制器。

这是我的初始化代码:

@objc class CucumberishSwiftInit: NSObject 
@objc class func CucumberishSwiftInit()

    var application : XCUIApplication!
    //A closure that will be executed just before executing any of your features
    beforeStart  () -> Void in
        application = XCUIApplication()
    
    //A Given step definition
    Given("the app is running")  (args, userInfo) -> Void in
        application.launch()
        let bundle = Bundle.main

        // I double checked the storyboard name and I can access it in my Unit Tests target
        // application crashes here
        let storyboard = UIStoryboard(name: "Main", bundle: bundle)

        // never executed 
        Swift.print("storyboard \(storyboard)")
    
    let bundle = Bundle(for: CucumberishSwiftInit.self)

    Cucumberish.executeFeatures(inDirectory: "Features", from: bundle, includeTags: nil, excludeTags: ["skip"])


一些功能文件:

@run @welcome
Feature: Some feature
Some feature desc

Scenario: Can load screen
    Given the app is running
    ...

应用程序在 UIStoryboard init 语句中崩溃,捕获“NSInvalidArgumentException”,“在捆绑包 NSBundle(已加载)中找不到名为 'Main' 的故事板。我不知道为什么它正在与我的单元测试一起使用。

【问题讨论】:

【参考方案1】:

您遇到的错误是由于您尝试加载的 .storyboard 文件不是您正在运行的应用程序包的一部分。

发生这种情况的原因是,当您运行 UI 测试时,您的代码与您的应用程序不在同一进程中运行,它只能通过 XCUIApplication 代理与其交互。 (机制可能略有不同,但这是要点,不幸的是,我可以链接的文档很少。

UI 测试是一种不同于 XCTest 的测试方式。无法以编程方式从 .storyboard 加载屏幕实例。

换句话说,您不能在 UI 测试中使用应用中的任何代码,而必须像真实用户一样与之交互,并为屏幕上的内容编写断言。

【讨论】:

感谢您的帮助!因此,如果我无权访问 .storyboard 文件,我必须手动转到特定屏幕。这里还有一个使用启动参数的有趣替代方法:***.com/questions/49020329/…。如果 UI 测试旨在测试屏幕的内部工作,这是一种有趣的方法,因为它与应用程序如何演变无关。 很高兴有用@michael-martinez :) 链接问题中的方法很巧妙,但在生产代码中会产生大量开销以支持运行 UI 测试的能力。我会鼓励任何考虑实施它的人来评估他们生产代码库中额外代码的成本。代码是一种负担,我们写得越少越好。

以上是关于使用带有 UI 测试的 Cucumberish 从情节提要加载控制器的主要内容,如果未能解决你的问题,请参考以下文章

使用 Realm 进行 Swift XCTest UI 测试

带有本地化 app.staticTexts 的 UI 测试 (XCTest)

带有 unicode 的字符串在新的 XCode UI 测试中不匹配并且测试失败

如何在 Xcode UI 测试中获得授权部分

从 C# UI 应用程序关闭阻止 webscokettpp 客户端的客户端连接

使用啥控件从相机捕获图像并在 ui 上显示为带有事件 xamarin ios 的缩略图