如何重试请求,直到我使用空手道dsl获得有效的动态生成的值作为响应

时间:2018-09-10 07:14:44

标签: dsl karate

我正在发送一个从后端获取API ID的请求,但是由于我的后端很慢,因此无法一次性返回ID,这使我的测试用例在第一次尝试中失败了。虽然如果我再试一次,它会通过,但这并不是理想的方法。我试着睡一觉,但这看起来也不是很有希望。

我的测试用例是:

给出URL storeURL

参数查询=

方法获取时

然后状态为200

  • 调用read('Sleep.feature')

  • def APIIDStr = response.list [0] .id

  • 从商店打印'APIID是:',APIIDStr

我可以在这里做些什么,以便如果APIIDStr在第一次执行时为空,它将尝试再次获取直到获得有效值?

2 个答案:

答案 0 :(得分:1)

是的。请参考有关如何使用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);
  }
}

答案 1 :(得分:0)

以下代码现在可以正确运行:

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

非常感谢!