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

Cla*_*ges 12 xcode automated-tests ui-testing xcode7 xcode-ui-testing

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

在此输入图像描述

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

如前所述这里:

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

问题:

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

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

Joe*_*tti 7

黑盒测试

UI Testing是一个黑盒测试框架.您不必了解正在测试的代码的实现.

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

让它"工作"

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

有趣的是,您可以@testable import ModuleName在UI测试的顶部使用简单的方法创建应用程序对象的实例.请注意,您实际上无法通过.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()!
    }
}
Run Code Online (Sandbox Code Playgroud)