Xcode 7:app测试和UI测试之间的鸿沟是不可架断的?

时间:2015-07-20 16:08:02

标签: xcode automated-tests xcode7 ui-testing xcode-ui-testing

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

enter image description here

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

如上所述here

  

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

问题:

  1. 这个鸿沟可以弥合吗?如果是这样,详细说明如何使用构建和链接器设置以及可能在github上运行xcodeproj
  2. 在Apple文档中可以找到明确说明这种鸿沟的地方。
  3. †在撰写本文时,测试版软件。

1 个答案:

答案 0 :(得分:7)

黑盒测试

UI测试是一个black-box testing框架。您不必了解正在测试的代码的实现。

例如,您应该只关心标签上的值是否更改,而不是控制器将正确的数据传递给视图。您可以从应用程序的用户角度考虑UI测试。她并不关心你的ItemsViewController是如何工作的(甚至是它存在的),为什么UI测试呢?

进入"工作"

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

有趣的是,您可以使用UI测试顶部的简单@testable import ModuleName创建应用程序对象的实例。请注意,您无法通过类似.tap()的方法与其进行实际互动,因为它是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()!
    }
}