С Websocket вы обычно не открываете и не закрываете соединения непрерывно, поэтому я пытаюсь использовать один и тот же Websocket для всех тестов в моем файле возможностей + это также требуется моей логикой программирования для этого, так как в настоящее время я не поддерживаю логические сеансы наначало веб-сокета.
Я пробовал различные варианты (call
и callonce
) следующего, но у меня это не работает.
Feature: Notify about created fixtures
Background:
* def openWs = call read ('classpath:openWebsocket.js')
* def ws = callonce openWs
Scenario: Request a new session
* def createSessionRequest = { 'action': 'POST', 'resource': 'sessions', 'requestId': 'df9a64de-3c22-40f8-807a-7eba5a432c95', 'version': 1 }
* string createSessionRequest = createSessionRequest
* eval ws.send(createSessionRequest)
* json response = karate.listen(5000)
* match response == { requestId: 'df9a64de-3c22-40f8-807a-7eba5a432c95', status: 201, version: 1, payload: { sessionId: '#string' } }
Scenario: Subscribe for fixture updates
* def subscribeFixtureRequest = { 'action': 'SUB', 'resource': 'fixtures', 'requestId': 'fa9eb7a5-d658-4f4b-bfa5-bc3bf2909cf3', 'version': 1 }
* string subscribeFixtureRequest = subscribeFixtureRequest
* eval ws.send(subscribeFixtureRequest)
* json response = karate.listen(5000)
* match response == { requestId: 'fa9eb7a5-d658-4f4b-bfa5-bc3bf2909cf3', status: 200, version: 1 }
Похоже, что он кешируетсяэкземпляр websocket, но он все еще закрывает его после первого сценария, и, следовательно, второй отказывает.
Журналы выглядят так (с некоторыми удаленными несвязанными строками):
19:42:13.003 [main] TRACE com.intuit.karate - callonce waiting for lock: openWs
19:42:13.003 [main] INFO com.intuit.karate - >> lock acquired, begin callonce: openWs
19:42:13.083 [nioEventLoopGroup-3-1] DEBUG c.i.k.netty.WebSocketClientHandler - websocket client connected
19:42:13.083 [main] INFO com.intuit.karate - << lock released, cached callonce: openWs
19:42:13.092 [main] TRACE c.i.karate.netty.WebSocketClient - sent: {"action":"POST","resource":"sessions","requestId":"df9a64de-3c22-40f8-807a-7eba5a432c95","version":1}
19:42:13.093 [main] TRACE com.intuit.karate - entered listen wait state
19:42:13.169 [nioEventLoopGroup-3-1] TRACE c.i.k.netty.WebSocketClientHandler - websocket received text
19:42:13.169 [nioEventLoopGroup-3-1] TRACE com.intuit.karate - signal called: {"payload":{"sessionId":"ee542db6-808c-4100-b009-f9e22dce28db"},"requestId":"df9a64de-3c22-40f8-807a-7eba5a432c95","status":201,"version":1}
19:42:13.170 [main] TRACE com.intuit.karate - exit listen wait state, result: {"payload":{"sessionId":"ee542db6-808c-4100-b009-f9e22dce28db"},"requestId":"df9a64de-3c22-40f8-807a-7eba5a432c95","status":201,"version":1}
19:42:13.203 [nioEventLoopGroup-3-1] DEBUG c.i.k.netty.WebSocketClientHandler - websocket closing
19:42:13.204 [nioEventLoopGroup-3-1] DEBUG c.i.k.netty.WebSocketClientHandler - websocket client disconnected
19:42:13.249 [main] TRACE com.intuit.karate - callonce cache hit for: openWs
19:42:13.256 [main] TRACE c.i.karate.netty.WebSocketClient - sent: {"action":"SUB","resource":"fixtures","requestId":"fa9eb7a5-d658-4f4b-bfa5-bc3bf2909cf3","version":1}
19:42:13.257 [main] TRACE com.intuit.karate - entered listen wait state
19:42:18.257 [main] TRACE com.intuit.karate - exit listen wait state, result: null
Есть лиспособ самому управлять открытием и закрытием веб-сокета?
РЕДАКТИРОВАТЬ: я проверил исходный код и, к сожалению, он очень тесно связан с ScenarioExecutionUnit
, и это закрывает его в конце Scenario
.Кажется, для поддержки этого необходимы изменения кода в каратэ.