使用XCUI进行UI测试

时间:2017-02-09 07:08:48

标签: ios unit-testing swift3 xcode8 ios10

我正在尝试在xCode 8中对视图控制器进行单元测试。我能够使用XCUI成功记录,断言和运行它。但我想独立测试特定的视图控制器。

类似于顺序存在4个控制器A,B,C和D(A-> B-> C-> D)。我想直接启动C控制器并独立测试它。

我能够以这种方式进行测试,即默认XCUIApplication将打开一个控制器然后点击你将进入B控制器的东西然后点击B中的按钮将你带到C Controller。然后你可以测试一下。但我不想按顺序。我想直接测试C控制器。

如果其他人做过同样的工作,你能帮忙吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

XCUITest with Xcode

如果您现在使用UITestCase,则无法直接打开D控制器

每次都应该执行序列(A-> B-> C-> D),因为所有测试用例规范都会导致应用程序启动特定SignIn,每次都需要为UITest使用SignOut

对testCase使用XCUI Test的补充方法

提供A,B,C&C序列功能作为最小化重复代码的协议

ex)定义登录协议

protocol Loginable {
    var app: XCUIApplication! { get }
    func login()
}

extension Loginable {
    func login() {
        //do login ... typting textfield , tap login button
    }
}

使用Loginable扩展您的A,B,C,D UITestCase以删除重复的代码(因为每个D uitest案例都应该在示例中登录)

对序列函数进行扩展以重用每个案例

替代解决方案是

使用KIF Functional Test framework

KIF可以基于XCTest而不是XCUITest来测试UITest

KIF可以像单元测试那样访问你的课程,这意味着

您可以将D ViewController显示到窗口(直接设置rootViewController)并测试KIF UItest函数

ex)KIF

import XCTest

@testable import YourApp
class DViewControllerTests: XCTestCase {

    var sut: DViewController!
    var window: UIWindow!

    override func setUp() {
        super.setUp()

        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        window = appDelegate.window

        sut = //Initialize your D ViewController
        window.rootViewController = sut
        RunLoop.current.run(until: Date()) // cause viewDidLoad
    }

    func testSomeCase() {
        tester().tapView(withAccessibilityIdentifier: "someIdentifier")
        ...
    }
}

KIF可以直接启动D控制器设置rootViewController到窗口

答案 1 :(得分:0)

由于XCUI测试是集成测试,因此您必须遵循流(A->B->C->D)。您可以改为执行必要的步骤(例如登录),然后为您的应用创建深层链接。 深度链接是一种允许应用程序打开到特定UI或资源的技术,以响应某些外部事件。 因此,您不必重复(A->B->C->D)的序列,而是可以实现直接将您带到D的深层链接。这样,特定测试仅检查D视图控制器的功能。 以下是一些有用的链接:

urbanairship kamyacademy medium.com