首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Xcode 10和WireMock 10.14下启动XCTest UI测试?

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

Stack Overflow用户
提问于 2019-01-10 19:53:09
回答 1查看 470关注 0票数 3

我们使用一个独立的wiremock实例作为Xcode UI测试的模拟服务器。我们有一个测试观察者类,它负责旋转这个实例(如果需要的话),并在测试运行完成后将它撕毁。观察员的守则如下:

代码语言:javascript
复制
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以下一切都很顺利。我不清楚代码签名与启动模拟服务器有什么关系。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-25 21:22:35

我的问题没有得到直接的回答,但我找到了解决办法。与其使用TestObserver启动WireMock服务器,不如在测试中使用预操作。

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

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

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

代码语言:javascript
复制
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运行结束时,我们仍然关闭服务器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54136011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档