XC UI 测试的存根数据

Stub data for XC UI Tests

所以,让我先解释一下我的问题。

我不想中继我的网络服务器数据,我想为我的 XCUI测试存根数据。 所以,我会确保它 return 100% 正确数据,有时我需要测试一些特定的(例如错误,或空状态)情况,而网络服务器可能不会 return 就在那一刻。 所以,我尝试过的是 运行 我的 XCUITest 中的本地 server 然后存根一些请求,但事实证明它没有成功,因为 XC UI 测试 运行 在完全独立的包(甚至是独立的进程)中进行,本地服务器无法绑定到本地主机,因此我的主应用程序包无法连接到该服务器。

我尝试过的另一个解决方案是通过 XCUIApplication().launchArguments 传递一些参数,并基于此参数 - 运行 主应用程序存根,但随后 - 它有点问题:"I have local-proxy server in main app",我只需要 UI 测试。

我知道,我也可以创建存根服务器并将其公开到网络上,也就是说,为 UI tesitng 创建一种开发环境,但对于我。因为在那种情况下,只为我的项目维护 UI 个测试是一项巨大的努力。

所以,我的问题是,有没有人有更好的解决方案?有没有办法在不修改主应用程序和 运行 宁外部网络服务器的情况下解决这个问题?

您可以使用 SBTUITestTunnel。这个库允许以简单的方式动态存根网络请求(除其他外)。

添加库的最简单方法是使用 cocoapods,然后覆盖 AppDelegate 的初始化方法:

import UIKit
import SBTUITestTunnel

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    override class func initialize() {
        SBTUITestTunnelServer.takeOff()
        super.initialize()
    }

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        return true
    }
}

添加完后,您就可以开始了。您可以 add/remove 存根到您的 UI 测试的网络请求,如下例所示:

func testThatSomethingStubbedWorks() {
  let app = SBTUITunneledApplication()
  app.launch()

  let stubId = app.stubRequestsMatching:SBTRequestMatch(SBTRequestMatch.URL("google.com"), returnJsonDictionary: ["key": "value"], returnCode: 200, responseTime: SBTUITunnelStubsDownloadSpeed3G)

  // from here on network request containing 'google.com' will return a JSON {"request" : "stubbed" }
  ...

  app.stubRequestsRemoveWithId(stubId) // To remove the stub either use the identifier
  app.stubRequestsRemoveAll() // or remove all active stubs
}