15

这是我的简单测试用例:

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 目标没有构建。那很重要么?

在此处输入图像描述

4

5 回答 5

8

这是来自苹果的回应:

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

于 2015-08-16T20:58:02.823 回答
1

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

于 2015-09-19T04:53:59.820 回答
1

与其让你的测试知道你的应用,不如试着把它转过来,让你的应用知道它正在被测试。一种方法是使用该launchArguments属性:

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

然后在您的应用程序中:

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

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

于 2015-12-26T06:41:37.403 回答
0

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

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

于 2015-08-23T12:07:02.273 回答
0

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

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

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

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

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

于 2017-12-02T05:22:15.367 回答