Тестирование REST API с Citrus/Cucumber

Я тестирую использование Cucumber для функционального/интеграционного тестирования в своей организации разработки и использую Citrus со стандартным клеем, который он предоставляет для тестирования API. Препятствие, с которым я столкнулся, заключается в том, как динамически изменять заданные переменные URL-адреса REST для сценария. Похоже, что эта возможность существует в Java DSL, но не раскрывается на шагах Cucumber. Я могу настроить citrus-http:client с заполнителями для системных свойств, но их, очевидно, необходимо разрешить, когда Spring загружает контекст приложения. То, что я хотел бы сделать в своем определении фонового сообщения, выглядит примерно так:

Given message todoListRequest
    And <todoListRequest> header Content-Type is "application/json"
    And <todoListRequest> header Accept is "application/json"
    And <todoListRequest> uri is "/todo/${item-number}"

а затем в сценарии:

Scenario: Gets expected item for specified item number
    Given variables 
        | item-number | 3 |
  When <todoListClient> sends message <todoListRequest>
  Then <todoListClient> should receive message <todoListResponse>

Имя хоста и порт службы все еще можно настроить в контексте приложения, а сконструированный URI добавить к этому значению для создания цели метода (в данном случае GET, хотя я не указал, и, возможно, это что-то еще, что необходимо добавлен?). Это кажется разумным? Очевидно, я мог бы написать свой собственный клей для этого, но я хотел посмотреть, есть ли готовые возможности для того, что кажется довольно очевидным сценарием REST, прежде чем идти по этому пути. Я понимаю, что интеграция с Cucumber появилась довольно недавно (начиная с версии 2.6?), поэтому она, возможно, все еще находится в стадии созревания. Это область, в которой я был бы заинтересован в помощи, если это приветствуется...

Спасибо


person Jim Cakalic    schedule 23.02.2017    source источник
comment
Вы правы, код склеивания Http по умолчанию в Citrus должен быть улучшен здесь. На самом деле, как вы сказали, это все еще развивающаяся область. До сих пор вам нужно было устанавливать внутренние заголовки Citrus (citrus_http_method и citrus_http_request_uri) в сообщении. Если вы хотите помочь улучшить удобство использования, добро пожаловать!   -  person Christoph Deppisch    schedule 27.02.2017


Ответы (1)


Вы можете использовать внутренние заголовки сообщений Citrus здесь:

And <todoListRequest> header citrus_http_method is "POST"
And <todoListRequest> header citrus_http_request_uri is "/todo/${item-number}"

HTTP-клиент Citrus прочитает эти специальные заголовки и автоматически удалит их перед отправкой сообщения.

Редактировать: начиная с Citrus 2.7.1 по умолчанию существует API шага REST Cucumber, который обеспечивает отличный доступ к отправке и получению сообщений по протоколу Http. Итак, вы можете написать

Given Content-Type: application/json
And Accept: application/json
When send POST /todo/${item-number}
Then receive status 200 OK

Подробнее об этом читайте здесь: http://www.citrusframework.org/reference/html/cucumber.html#http-steps

person Christoph Deppisch    schedule 27.02.2017
comment
Другой способ, который я нашел для этого, заключался в определении конечной точки http в citrus-context.xml с конечным распознавателем, ссылающимся на DynamicEndpointUriResolver, который был создан со значением свойства defaultEndpointUri базового пути, а затем с использованием заголовка citrus_request_path в сообщении. определение в файле функций, чтобы добавить оставшийся путь к ресурсу и параметры пути. Спасибо, Кристоф! - person Jim Cakalic; 15.06.2017