【问题标题】:UI Testing with XCUI使用 XCUI 进行 UI 测试
【发布时间】:2017-02-09 07:08:47
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios unit-testing swift3 xcode8 ios10


    【解决方案1】:

    在 XCUITest 中使用 Xcode

    如果你现在使用UITestCase,你不能直接打开D控制器

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

    使用XCUI Test for testCase的补充方式

    提供A、B、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 功能

    例如)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 到窗口

    【讨论】:

    • 感谢克鲁兹。您的解决方案看起来很有帮助。我会实施的。非常感谢。
    • @GopeshGupta ?
    【解决方案2】:

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

    urbanairshipkamyacademymedium.com

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多