Мы используем автономный экземпляр wiremock в качестве фиктивного сервера для наших тестов пользовательского интерфейса XCode. У нас есть класс тестового наблюдателя, который отвечает за раскрутку этого экземпляра (если требуется) и разрыв его после завершения тестового прогона. Код для наблюдателя выглядит следующим образом:
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. Мне неясно, какое отношение имеет подписывание кода к запуску фиктивного сервера.