Как обрабатывать параллельные запросы к разным URL на сервере Citrus? - PullRequest
0 голосов
/ 29 марта 2019

Я делаю интеграционное тестирование для пары микросервисов с Citrus Framework .Пример теста примерно такой:

  1. Отправка запроса от клиента Citrus HTTP на один из микросервисов
  2. Несколько микросервисов отправляют запросы на один и тот же удаленный хост (который я хочу смоделироватьодновременно с сервером Citrus HTTP), вызывая разные URL-адреса на этом удаленном хосте (например, "http://server.com/A/" и" http://server.com/Z/E/F/") или один и тот же URL с другими параметрами запроса (например, "http://server.com/A?param=1")и "http://server.com/A?param=great")
  3. . Сервер Citrus должен возвращать различные ответы, динамически рассчитанные на основе определенного URL-вызова, на который он отвечает
  4. . Все последующие шаги проверки не требуют взаимодействия с сервером Citrus.

Я не могу понять, как настроить это так, чтобы тест не был уязвим к условиям гонки. Я пробовал варианты решений, предложенных в этом потоке github , которые ямог придумать, но не могу понять, как настроить его в моем случае использования. Я пытаюсь поместить различные пары запрос-ответ в отдельные async () -контейнеры, но ответы заканчиваются переключением при неправильных условиях гонки, и мои тесты часто терпят неудачу.Я пытаюсь смоделировать каждую пару запрос-ответ следующим образом:

private void serverReceiveCallAndRespond(String path, Resource response) {
    async().actions(
        http().server(citrusHttpServer)
            .receive()
            .get(path),
        http().server(citrusHttpServer)
            .send()
            .response(HttpStatus.OK)
            .contentType("application/json")
            .messageType(JSON)
            .payload(response)
    );
}

TLDR: как я могу сказать серверу Citrus отвечать на вызовы разных URL-адресов с разными ответами асинхронно?

1 Ответ

0 голосов
/ 28 мая 2019

Я предлагаю использовать message selectors для решения этой проблемы. Сервер Citrus отправляет все входящие запросы на внутренний канал сообщений. Вы можете выбрать сообщение, явно формирующее этот канал, используя селекторы сообщений.

http().server(citrusHttpServer)
            .receive()
            .get(path)
            .selector(Collections.singletonMap(HttpMessageHeader.HTTP_REQUEST_URI, "/Z/E/F/"))

Таким образом, вы всегда можете сначала получить запрос на /Z/E/F/ в своем тесте и ответить на него правильным ответом. После этого вы можете добавить второй прием, используя другой селектор, и предоставить правильный ответ на этот вызов.

Последовательность входящих запросов больше не связана с условиями гонки.

Не уверен насчет заголовка HttpMessageHeader.HTTP_REQUEST_URI. Вам может понадобиться использовать полный URI запроса здесь в качестве значения.

...