Я попытался протестировать набор REST-сервисов с помощью Citrus Java DSL. После аутентификации службы ожидают тот же действительный идентификатор сеанса первого запроса. На стороне сервера я вижу, что существует случайный идентификатор сеанса, но при втором запросе идентификатор сеанса равен нулю. Я попытался установить для handleCookies значение true в конфигурации конечной точки и попытался извлечь некоторую информацию заголовка (set-cookie), но безуспешно. EndpointConfiguration повторно используется во время различных запросов.
CitrusEndpoints.http()
.client()
.handleCookies(true)
Как я могу заставить конечную точку повторно использовать согласованный идентификатор сеанса или как я могу извлечь его из запроса / ответа?
Заранее благодарим за любые идеи и подсказки.
Ответ на ваш 1-й запрос должен иметь установленный заголовок
Set-Cookie: JSESSIONID=ABCDEFG;path=/api/foo
Вы можете извлечь эту информацию в своей операции получения
http()
.client(todoClient)
.receive()
.response(HttpStatus.OK)
.extractFromHeader("Set-Cookie", "cookie")
.payload("{ \"foo\": \"bar\" }");
После этого мы должны обработать новое значение ${cookie}
, чтобы извлечь фактическое имя и значение идентификатора сеанса в новую переменную ${sessionId}
.
createVariable("sessionId", "citrus:substringBefore(${cookie}, ';')");
Теперь у нас есть переменная ${sessionId}
, которая содержит только имя и значение идентификатора сеанса - в нашем примере это JSESSIONID=ABCDEFG
.
В дальнейших запросах вы можете использовать переменную для установки правильной информации заголовка Cookie
.
http()
.client(todoClient)
.send()
.get("/api/foo")
.header("Cookie", "${sessionId}")
.accept(ContentType.APPLICATION_JSON.getMimeType());
Это означает, что клиент создает идентификатор сеанса в самом первом запросе и должен продолжать его использовать? Если это так, вы можете просто создать значение переменной (используя функции randomString или randomUUID Citrus) и установить заголовок «Cookie» в первом и всех последующих запросах, как показано в последнем фрагменте кода моего ответа.
Да, это была проблема. Я решил это с помощью специальной конфигурации, так что в случае сценариев тестирования интеграции сервер добавляет sessionId в заголовок ответа. Другой вопрос, основанный на первом: я видел, что можно использовать переменные Глобальный. При использовании фрагмента createVariable("sessionId", "citrus:substringBefore(${cookie}, ';')");
можно ли повторно использовать переменную идентификатор сессии между разными тестовыми примерами @CitrusTest?
Думаю, я нашел решение проблемы с переменной. При использовании TestRunner вместо TestDesigner я могу ввести TestContext. После вызова функции createVariable я могу получить переменную из контекст и добавить ее как globalVariable в контекст. Делая это таким образом, я могу читать глобальную переменную из контекста также в других методах TestCase. createVariable("sessionId", "citrus:substringBefore('${cookie}', ';')"); String jSessionId= context.getVariable("sessionId", String.class); context.getGlobalVariables().put("jSessionId", jSessionId);
Спасибо, Кристоф, попробовал, но не вышло. После некоторого дополнительного тестирования, также вызывающего службы через браузер, кажется, что при использовании браузера JSESSIONID является частью заголовка запроса и не включается в ответ. Но когда я изменяю ваш код, чтобы извлечь cookie из запроса, Citrus всегда возвращает сообщение об ошибке, этот элемент заголовка не может быть найден в заголовке.