ios - 使用 XCUI 进行 UI 测试

标签 ios unit-testing swift3 xcode8 ios10

我正在尝试在 xCode 8 中对 View Controller 进行单元测试。我能够使用 XCUI 成功地记录、断言和运行它。但我想独立测试特定的 View Controller 。

就像有 4 个 Controller A、B、C 和 D 依次(A->B->C->D)。我想直接启动C Controller 并独立测试它。

我能够以这种方式进行测试,即默认 XCUIApplication 将打开 A Controller ,然后单击您将转到 B Controller 的内容,然后单击 B 中的按钮将带您到 C Controller 。然后你可以测试一下。但我不想按顺序。我想直接测试 C Controller 。

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

最佳答案

使用 Xcode 在 XCUITest 中

如果你现在使用UITestCase,是不能直接打开D Controller 的

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

testCase使用XCUI Test的补充方式

提供A、B、C的序列函数作为最小化重复代码的协议(protocol)

例如)定义登录协议(protocol)

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 功能

例如)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 Controller 设置rootViewController到窗口

关于ios - 使用 XCUI 进行 UI 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42130343/

相关文章:

ios NavigationBarHidden 在 vi​​ewDidLoad 中不起作用

objective-c - 防止将 UIButton 拖到其 UIView 之外

ios - 使用 Xib 的参数构建 UIView 的优雅方式

ios - getInitialLink 上的 Firebase 动态链接仅在 IOS 和生产链接(React Native)上为空

c# - 如何创建具有依赖关系的单元测试

swift - 在所有成员初始化之前被闭包自捕获

arrays - 将可选值添加到 [Any],得到编译器警告 - 从 Double 隐式强制表达式?去任何

c# - 无法使用 xunit 测试 mvc.controller 检查 returnType 是否为 HttpNotFoundResult

python - 在 Python 中模拟 Google App Engine 文件上传

ios - touchUpInside 事件未触发