存储XC UI测试的数据

时间:2016-08-25 12:17:46

标签: ios objective-c swift xcode-ui-testing

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

我不想继续我的网络服务器数据,我想为我的XCUITests存根数据。 因此,我将确保它在100%时间内返回正确的数据,有时我需要测试一些特定的(例如错误或空状态)情况,这些情况下Web服务器可能无法返回。 所以,我尝试过,它是在我的XCUITest中运行本地server然后存根一些请求,但事实证明它没有用,因为XC UI测试在完全独立的包中运行(甚至是单独的进程) )并且本地服务器无法绑定到localhost,因此我的主应用程序包无法连接到此服务器。

我尝试的另一个解决方案是通过XCUIApplication()。launchArguments传递一些参数,并基于这个参数 - 在主应用程序上运行存根,但随后 - 这有点问题:“我有本地 - 主应用程序中的代理服务器“,我只需要进行UI测试。

我知道,我也可以创建存根服务器并将其暴露给网络,所以说,创建一种仅用于UI测试的开发环境,但对我来说这似乎是极端的。因为在这种情况下,只为我的项目维护UI测试是一项很大的工作。

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

1 个答案:

答案 0 :(得分:1)

您可以使用SBTUITestTunnel。该库允许以简单的方式动态地存储网络请求(以及其他内容)。

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

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
    }
}

一旦你添加了它,你就准备好了。您可以向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
}