使用 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 测试的主要内容,如果未能解决你的问题,请参考以下文章
打开 url 外部浏览器时是不是可以测试 uitest (XCUI)?
使用 AWS 设备场进行 XC UI 测试时出现错误“跳过设置测试:找不到足够的套件来执行”?