【问题标题】:How to import my App module into MyAppUITests file?如何将我的 App 模块导入 MyAppUITests 文件?
【发布时间】:2015-10-24 11:42:00
【问题描述】:

这是我的简单测试用例:

import XCTest
@testable import MyApp //it doesn't work

因为这个:

class TabBarControllerTests: XCTestCase {

    override func setUp() {
        super.setUp()

        let defaults = NSUserDefaults.standardUserDefaults()
        defaults.setObject([], forKey: DBTabBarOrderedIndexesKey) //key is undefined, because of lack of my app module
        defaults.synchronize()

        continueAfterFailure = false
        XCUIApplication().launch()
    }

    func testIsOrderOfTabsSaved() {

        XCUIApplication().tabBars.buttons["Catering"].tap()
        //what next?
    }
}

点击UITabBarItem 后,我会更改DBAppSettings.mode 的值,因此我想在这里访问我的DBAppSettings.mode 属性以检查它是否真的被更改了。

我注意到有一件奇怪的事情,当我构建我的应用程序并检查构建的内容时,我的 UITest 目标没有构建。重要吗?

【问题讨论】:

    标签: ios swift xcode import xcode-ui-testing


    【解决方案1】:

    这是来自 Apple 的回复:

    UI 测试与单元测试的执行方式不同 - 单元测试在您的应用程序进程中运行,因此它们可以访问您的应用程序代码。 UI 测试在应用程序之外的单独进程中执行,因此它们可以模拟用户与应用程序的交互方式。预计您将无法通过 UI 测试访问您的应用类。

    【讨论】:

      【解决方案2】:

      您需要在 UI 测试中访问的每个对象都必须是 UI 测试目标的一部分。这包括对象依赖性。这是一个滑坡,而且相当混乱。

      【讨论】:

        【解决方案3】:

        与其让您的测试了解您的应用,不如尝试扭转它并让您的应用知道它正在接受测试。一种方法是使用launchArguments 属性:

            app = XCUIApplication()
            app.launchArguments.append("TestMode")
            app.launch()
        

        然后在您的应用中:

            if NSProcessInfo.processInfo().arguments.contains("TestMode") {
                // I am running in test mode
            }
        

        在您的情况下,应用程序可以相应地设置 NSUserDefaults。

        【讨论】:

          【解决方案4】:

          由于 Apple 阻止您从 UI 测试访问您的主应用程序,您可能会考虑重新组织您的应用程序结构以将需要检查的相关数据存储到 UI 测试可访问的位置。

          您可能会考虑将定义和数据从您的主应用程序类移动到可由测试框架加载的单独类。

          【讨论】:

          • 这不是一个好主意,因为我需要访问我的应用程序,而不是某些课程。有问题key 有一个简单的案例,但通常我需要访问一些单身人士。
          • 我通常将单例放入应用程序共享实例外部的自己的类中。这对你的目的有用吗?
          • 会起作用,但这些单例中的对象是我类中的另一个对象,所以基本上我需要将我的应用程序目标中的每个文件都附加到测试目标:-) 这不是预期的......
          • @BartłomiejSemańczyk 你能找到解决方案来访问 UITest 文件中的单例吗?
          【解决方案5】:

          我通过将一些东西从我的应用目标中提取到两个框架(模型和视图模型)中解决了无法访问的符号问题,然后我可以将它们导入到我的 UI 测试中。

          至于访问可执行文件的实际内存,你不能,但你可以测试在该模式下应该出现在屏幕上的东西。我用这个断言来例如检查是否存在表格视图单元格:

          XCTAssertTrue(tables.cells.staticTexts["Cell title I expect to exist"].waitForExistence(timeout: 1))
          

          由于您可以使用辅助功能,因此您可以通过这种方式访问​​相当多的东西。我想你可以添加一个不可见的标签,只转储你的应用程序的内存测试模式!

          我也使用启动参数来配置我的应用程序以进行 UI 测试,正如 Michael 建议的那样:https://stackoverflow.com/a/34469136/4789448

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-04
            • 1970-01-01
            • 2018-01-04
            • 2019-12-28
            • 1970-01-01
            • 2020-04-15
            相关资源
            最近更新 更多