Как повторить запрос до тех пор, пока я не получу в ответ действительное динамически сгенерированное значение, используя karate dsl

Я отправляю запрос на получение идентификатора API из серверной части, но поскольку мой сервер работает медленно, он не возвращает идентификатор за один раз, и это приводит к сбою моего тестового примера с первой попытки. Хотя это пройдет, если я попробую еще раз, но это не в идеале, это должно сработать. Я попытался заснуть, но это тоже не выглядело многообещающим.

Мой тестовый пример:

Указанный URL storeURL

И param query =

Когда метод получить

Тогда статус 200

  • вызов читать ('Sleep.feature')

  • def APIIDStr = список ответов [0] .id

  • print 'APIID из магазина:', APIIDStr

Могу ли я сделать здесь что-нибудь, чтобы если APIIDStr был пуст с первого раза, он пытался выполнить выборку снова, пока не получит допустимое значение?

1
0
864
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

да. Пожалуйста, обратитесь к документации о том, как реализовать опрос с помощью JavaScript: https://github.com/intuit/karate#polling

function(x) {
  while (true) {
    var result = karate.call('get.feature');
    var greeting = result.response;
    karate.log('poll response', greeting);
    if (greeting.id == x) {
      karate.log('condition satisfied, exiting');
      return;
    }
    karate.log('sleeping');
    // uncomment / modify the sleep time as per your wish
    // java.lang.Thread.sleep(1000);
  }
}

РЕДАКТИРОВАТЬ - также см .: https://stackoverflow.com/a/55823180/143475

может добавить повтор на фреймворке? потому что, если вернуть 5xx, этот пользователь захочет повторить попытку несколько раз, спасибо!

thinkerou 14.11.2018 10:33

Следующий код теперь может работать правильно:

Feature:
  Background:
  * url 'url'

  Scenario:
  * def input =
  """
  {
    'form': {},
    'query': {},
  }
  """
  * path '/rest/n/test'
  * params input.query
  * form fields input.form
  * method post
  * status 200
  * math response contains { result: 1 }
  * eval if (response.result != 1) karate.call('delete-user.feature'))

Итак, я надеюсь, что метод retryPost, который может повторить попытку публикации сценария (он может автоматически проверять статус).

или:

...
* eval if (responseStatus == 5xx) retryPost/retryGet/retryPut
* eval if (response.result != 1) retryPost/retryGet/retryPut

Здесь retryPost/retryGet/retryPut только повторно запускает код раздела.

Например:

Feature:
  Background:
  * url 'url'

  Scenario:
  # section 1
  ...
  * method post
  * eval if () retryPost # only re-run section 1

  # section 2
  ...
  * method post
  *eval if () retryPost # only re-run section 2

Большое спасибо!

интересно, можете ли вы открыть новый запрос функции - я думаю, что идея указать 2 вещи а) логическое / предикатное выражение и б) интервал опроса - кажется, имеет смысл

Peter Thomas 15.11.2018 11:13

еще одна вещь - в каратэ возможен вызов karate.match() JS - обычно я не поощряю его - но, возможно, он подходит для этого требования

Peter Thomas 15.11.2018 11:14

@PeterThomas, хорошо, я согласен.

thinkerou 15.11.2018 11:44

Другие вопросы по теме