12

Xcode 7† 提供了一种直接测试 UI 的新方法,包括一个新的测试目标“iOS UI 测试包”(或“OS X”)。

在此处输入图像描述

在 UI 测试目标中,似乎没有对构成您的应用程序的模型或类的内置访问。例如[UIApplication sharedApplication],无法从您的 UI 测试中调用。这意味着“应用程序测试”和“UI 测试”存在于一个可能无法逾越的鸿沟中。

如此处所述:

问题是 Xcode 的 UI 测试不允许访问实际的应用程序。

问题:

  1. 这个鸿沟能被弥合吗?如果是这样,详细说明如何使用构建和链接器设置以及可能xcodeproj在 github 上工作。
  2. 在 Apple 文档中,哪里可以找到关于这种分歧的明确声明。

† 在撰写本文时,测试版软件。

4

1 回答 1

7

黑盒测试

UI 测试是一个黑盒测试框架。您不必知道有关您正在测试的代码的实现的任何信息。

例如,您应该只关心标签上的值发生变化,而不是控制器将正确的数据传递给视图。您可以从应用程序的用户角度考虑 UI 测试。她不在乎您的ItemsViewController工作方式(甚至它是否存在),那么为什么要进行 UI 测试呢?

让它“工作”

话虽如此,我理解你的沮丧。如果您可以启动一个视图控制器,然后使用 UI 测试并做出断言,那就太好了。但是,从 Beta 5 开始,这是不可能的。

但是,有趣的是,您可以@testable import ModuleName在 UI 测试的顶部使用简单的创建应用程序对象的实例。请注意,您实际上不能通过.tap()-like 方法与它进行交互,因为它是一个UI*类,而不是一个类XCUI*

考虑Donut是应用程序的模块名称。

import XCTest
@testable import Donut

class DonutUITests: XCTestCase {
    let app = XCUIApplication()

    override func setUp() {
        continueAfterFailure = false
        app.launch()
    }

    func testItemsViewController() {
        let controller = ItemsViewController()
        controller.addItemButton.tap() // <---- UIButton does not respond to tap()!
    }
}
于 2015-08-18T15:19:49.553 回答