我们使用一个独立的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以下一切都很顺利。我不清楚代码签名与启动模拟服务器有什么关系。
发布于 2019-01-25 21:22:35
我的问题没有得到直接的回答,但我找到了解决办法。与其使用TestObserver启动WireMock服务器,不如在测试中使用预操作。
为此,您需要编辑UI测试项目的方案:

Test旁边的公开箭头,然后单击Pre-actions+添加操作脚本/bin/sh)Provide build settings from下,选择您的测试目标对于脚本,我使用了以下代码:
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}" &下面是脚本的作用:
/tmp/preaction-log.txt以进行调试,因为预操作脚本不会被记录到构建日志中。现在,只要您运行测试用例,这个脚本就会运行。在TestObserver运行结束时,我们仍然关闭服务器。
https://stackoverflow.com/questions/54136011
复制相似问题