如何在Xcode 10和macOS 10.14下启动WireMock for XCTest UI测试?

RehcsifWith

我们正在使用独立的Wiremock实例作为Xcode UI测试的模拟服务器。我们有一个测试观察者类,负责分解该实例(如果需要),并在测试运行完成时将其拆解。观察者的代码如下:

import AppKit
import XCTest
import WiremockClient

class SSUITestObserver: NSObject, XCTestObservation {

    enum TestObserverError : Error {
        case MockServerStartupError(String)
    }

    lazy var testBundleURL: URL = Bundle(for: SSUITestCase.self).bundleURL
    lazy var testBundleBinURL: URL = self.testBundleURL.appendingPathComponent("..", isDirectory: true)
    lazy var mockServerHomeURL: URL = self.testBundleURL.appendingPathComponent("Contents/Resources/", isDirectory: true)
    lazy var mockServerJarURL: URL = self.mockServerHomeURL.appendingPathComponent("wiremock-standalone-2.18.0.jar", isDirectory: false)

    override init() {
        super.init()

        NSLog("UI Test Observer Initialized")
        XCTestObservationCenter.shared.addTestObserver(self)
    }

    func testBundleWillStart(_ testBundle: Bundle) {
        NSLog("***Test Bundle starting")
        do {
            // Start the Wiremock server
            try ensureMockServerIsRunning()
        } catch {
            fatalError("\n Failed during test bundle setup: \(error)\n")
        }


    }

    public func testBundleDidFinish(_ testBundle: Bundle) {
        NSLog("***Test Bundle completed")
        stopMockServer()
    }

    func ensureMockServerIsRunning() throws {
        WiremockClient.baseURL = SSUIIntegrationTestCase.mockServerAddress

        guard !WiremockClient.isServerRunning() else { return }

        let args = ["-jar",
                    self.mockServerJarURL.path,
                    "--port", "3000",
                    "--root-dir", self.mockServerHomeURL.path]

        _ = Process.launchedProcess(launchPath: "/usr/bin/java", arguments: args)

        for _ in 1...9 {
            if WiremockClient.isServerRunning() { return }
            sleep(1)
        }

        throw TestObserverError.MockServerStartupError("Error staring up the mock server instance!")
    }

    func stopMockServer() {
        WiremockClient.shutdownServer()
    }

    func resetMockServerStubs() {
        WiremockClient.reset()
    }
}

一切顺利,直到我移至macOS 10.14。以前,我们不是在代码上签名UITest目标。移至10.14后,运行测试现在会因启动错误而失败,甚至无法开始运行测试。我发现在测试中打开自动代码签名可以解决此问题。

但是,这导致了第二个问题:在launchedProcess上面行中,启动Wiremock服务器的尝试将失败java.lang.RuntimeException: java.net.SocketException: Operation not permitted如果在执行测试之前启动了服务器(例如,在命令行上),则一切正常。

那么,如何才能使自己摆脱22号陷阱?在10.13以下,一切正常。我不清楚启动模拟服务器与代码签名有什么关系。

RehcsifWith

我没有直接收到问题的答案,但确实找到了解决方法。不必使用TestObserver来启动WireMock服务器,而是可以对测试使用预操作。

为此,您想要编辑UI测试项目的方案:

编辑方案

  1. 点击旁边的披露箭头Test,然后点击Pre-actions
  2. 点击+添加操作脚本
  3. 使用您选择的外壳(我保留了默认值/bin/sh
  4. 在下Provide build settings from,选择您的测试目标
  5. 输入启动模拟服务器的脚本。

对于脚本,我使用以下代码:

exec > /tmp/preaction-log.txt 2>&1

# Attempt to connect to an existing wiremock server, and exit if we succeed:
curl http://localhost:3000/__admin/mappings > /dev/null 2>&1 && exit 0 || echo "Attemmpting to spin up a Wiremock Server:"

# No existing server, so spin one up:
WIREMOCK_DIR=${BUILT_PRODUCTS_DIR}/${EXECUTABLE_NAME}-Runner.app/Contents/PlugIns/${TARGET_NAME}.xctest/Contents/Resources/

/usr/bin/java -jar "${WIREMOCK_DIR}"wiremock-standalone-2.18.0.jar --port 3000 --root-dir "${WIREMOCK_PATH}" &

这是脚本的作用:

  1. 将所有输出记录到/tmp/preaction-log.txt进行调试,因为操作前脚本不会记录到构建日志中。
  2. 检查所需端口(在本例中为3000)上正在运行的服务器。我使用了WireMockClient所使用的相同方法:尝试访问“映射” API。如果成功,则退出脚本。
  3. 如果到了这一点,我们可以假设我们需要启动服务器。因此,我们使用一些XCode环境变量来指向我们在项目中存储服务器可执行文件的位置(如果您的系统上始终安装了WireMock客户端,则可以将路径更改为所需的路径)。

现在,此脚本将在您运行测试用例时运行。在运行结束时,我们仍将在我们的TestObserver中关闭服务器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

XCTest UI测试-如何在不重新启动的情况下关闭和打开应用程序?

如何在Xcode中配置和运行目标C测试用例--XCTest

Xcode 6中的XCTest和异步测试

XCTest(UI测试)中查询的父母和兄弟姐妹

无法使用XCTest启动测试

在XCTest UI测试中给定索引的情况下,如何验证表视图行中文本的存在?

Xcode 10 UI测试原因:Cocoapods找不到图像

macOS 10.14(测试版)如何安装Command_Line_Tools_macOS_10.14_for_Xcode_10_Beta

如何为UI测试包启用网络流量?(XCTest,XCode-DNSServiceCreateConnection失败)

XCTest UI测试UIElements大小

是否可以在不使用Xcode的情况下使用XCTest单元测试?

如何在iOS XCTest中测试UIImageView元素?

如何在XCTest中运行“单个测试用例”?

在XCTest UI测试中,如何检查按钮,标签,视图的背景颜色?

Xcode UI测试:如何测试应用程序的首次启动

如何在Xcode 5.1中运行XCTest

复制拉动以刷新XCTest UI测试

获取文本从TextView的在UI测试中XCTest

如何双启动Windows 10和Ubuntu

如何在iOS Xcode UI测试用例中启动系统应用

Windows 10-如何在没有触摸屏的情况下测试触摸事件?

使用XCTest在Xcode中测试计时器

如何在使用Xcode 11和iOS 13进行UI测试期间关闭UIActivityViewController

如何在Xcode UI测试脚本中执行点击和拖动?

Xcode UI测试-如何在WebView中查找和点按()元素

Crashlytics和Xcode 10

如何在没有安装的情况下双重启动Windows 10和Windows Server

如何在已经安装了Windows 10和Ubuntu 15.10的情况下三次启动Windows XP?

使用XCTest测试RACSignals