使用 XCUI 进行 UI 测试

Posted

技术标签:

【中文标题】使用 XCUI 进行 UI 测试【英文标题】:UI Testing with XCUI 【发布时间】: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控制器。

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于使用 XCUI 进行 UI 测试的主要内容,如果未能解决你的问题,请参考以下文章

一起使用 XCUI 测试和 XC 测试

打开 url 外部浏览器时是不是可以测试 uitest (XCUI)?

如何编写 XCUI 测试以确定我是不是导航到正确的屏幕?

使用 AWS 设备场进行 XC UI 测试时出现错误“跳过设置测试:找不到足够的套件来执行”?

使用 XCUI 测试用例测试 UICollectionView 无限滚动

Xcode 8:UI 测试远程按钮错误:找不到焦点元素