SoapUI макет асинхронных сервисов - PullRequest
3 голосов
/ 26 октября 2011

Мы используем SoapUI для имитации веб-сервисов, чтобы протестировать наше приложение (APP), прежде чем мы получим доступ к реальным веб-сервисам.

Создать синхронную Mock Service, которая будет возвращать предопределенный ответ, просто. Однако я должен смоделировать некоторые асинхронные сервисы, в которые APP отправляет запрос, SoapUI немедленно отвечает подтверждением (например, SUCCESS), а затем через заданный интервал SoapUI перезвонит нашему приложению (APP затем выступая в роли сервера). Мне удалось сделать это с помощью контрольного примера, где первый шаг - MockResponse, затем задержка, а затем MockRequest (для вызова нашего приложения).

Вышеописанное работает нормально, но я бы хотел сделать это, написав сценарий прямо в Mock Reponse, чтобы избежать использования тестовых случаев. Мне удалось написать скрипт, который, когда Mock Service получает запрос, запускает обратный вызов.

def project = result.mockOperation.mockService.project
// The API documentation doesn't say what finish is supposed to do but I try (doesn't help)
result.finish()
// Request that will be returned back - THE CALLBACK
def request = project.interfaces["LocationServicesOperation"].operations["ackLocation"].getRequestByName("Request 1")
sleep(4000)
request.submit(new com.eviware.soapui.impl.wsdl.WsdlSubmitContext(  ), false)

Проблема с вышеупомянутым состоит в том, что он вызовет обратный вызов ПЕРЕД отправкой ответа на начальный запрос. Я пытался использовать обработку событий в SoapUI PRO, но я не могу заставить это работать. В Wireshark я вижу такое сообщение:

1) APP request -> SoapUI 
2) SoapUI callback -> APP
3) APP confirms 2) -> SoapUI 
4) SoapUI confirms 1) -> APP

Однако это должно быть:

1) APP request -> SoapUI 
2) SoapUI confirms 1) -> APP
3) SoapUI callback -> APP
4) APP confirms 2) -> SoapUI 

Приведенный выше код фактически взят из события MockRunListener.onMockResult в SoapUI Pro. result.finish() не работает.

Спасибо за любые советы!

1 Ответ

2 голосов
/ 27 октября 2011

Я наконец нашел решение в http://www.eviware.com/forum/viewtopic.php?f=5&t=3542&p=12474&hilit=asynchronous#p12474

Хитрость заключалась в том, чтобы вместо отправки запроса непосредственно из скрипта ответа добавить запрос обратного вызова в тест, а затем вызвать тест. Это приведет к тому, что фиктивный бегун сначала отправит ответ на запрос, а затем запустит контрольный пример.

Преимущество заключается в том, что контрольный пример запускается динамически и не требует выполнения все время.

...