【问题标题】:Stub data for XC UI TestsXC UI 测试的存根数据
【发布时间】:2016-08-25 12:17:45
【问题描述】:

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

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

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

我知道,我也可以创建 stub-server 并将其公开给网络,也就是说,创建一种开发环境,只是为了 UI 测试,但对我来说似乎是极端的。因为在这种情况下,只为我的项目维护 UI 测试是一项很大的工作。

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

【问题讨论】:

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


【解决方案1】:

您可以使用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
    }
}

添加后,您就可以开始使用了。您可以向 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
}

【讨论】:

    猜你喜欢
    • 2016-09-25
    • 2019-04-03
    • 1970-01-01
    • 2017-09-04
    • 2017-04-22
    • 1970-01-01
    • 2011-01-10
    • 2014-11-06
    • 1970-01-01
    相关资源
    最近更新 更多