【问题标题】:How to add conditional wait for a response in karate?如何在空手道中添加条件等待响应?
【发布时间】:2018-10-07 23:36:32
【问题描述】:

对于我们的一个 DELETE 请求,所用时间超过 30 秒。如果测试时间超过 30 秒,有时测试会失败。我需要添加等待响应,直到某些 GET 调用通过。 我试过下面的代码。 但我想检查 GET 调用中的某些条件,然后我想断言 DELETE 调用。

 Feature:       

Background:
* def waitUntil = 
"""
function(x) {
  while (true) {

    var result = karate.call('classpath:ic/feature/soap/Common/getApplicationsList.feature');
    var res = result.response;
    karate.log('poll response in side java script', res.integration.serviceData.applicationsList.WmSOAPProvider['MyKarateSoap']);

    karate.log('Actual responseis in jacva script ---> ', res.integration.serviceData.applicationsList.WmSOAPProvider)
    var local = res.integration.serviceData.applicationsList.WmSOAPProvider['MyKarateSoap'];
    karate.log('local value is--->' +local)

    karate.log('res is ----->' +res)
    if (res.integration.serviceData.applicationsList.WmSOAPProvider['MyKarateSoap'] == null) {
      karate.log('condition satisfied, exiting');
      return;
    }
    karate.log('sleeping in else block');
    // uncomment / modify the sleep time as per your wish
    java.lang.Thread.sleep(3000);
  }
}
"""

Scenario: delete soap application

Given url appServer
And path '/integration/rest/application/WmSOAPProvider/' +'MyKarateSoap'

And header Accept = 'application/json'
And header Content-Type = 'application/json'
And header X-CSRF-TOKEN = lresult.response.csrfToken
* cookie JSESSIONID = lresult.responseCookies.JSESSIONID.value
* cookie route = lresult.responseCookies.route.value

When method delete

* call waitUntil 200

在上面的代码中,“waitUntil”只有在“delete”调用通过时才会被调用。

但我只想在 DELETE 调用响应失败/超过 30 秒时才调用“waituntil”

我关注了 How to retry a request until i get a valid dynamically generated value in response using karate dsl

但没有多大帮助

【问题讨论】:

  • 嗨彼得,你提供的链接我无法解决问题。请提供有关条件等待的更多详细信息。我的场景是'如果 DELETE 调用失败,我不希望测试用例失败。我想等到我的 GET 调用返回 true'
  • 我现在接受了我之前的问题。你能提供这个问题的解决方案吗?
  • 我会尝试解释更多。第 10 行 当方法删除时,第 11 行 * 调用 waitUntil 200.. 这里第 11 行只有在第 10 行通过时才会执行。我的问题是,如果第 10 行也失败,我想拨打第 11 行。希望我能消除你的疑虑。
  • 我尽我所能理解文档中的条件等待。但我不清楚彼得。
  • 我要通过添加 karate.configure('readTimeout', 60000); 来解决问题;在 karate.config 文件中。但是对于有条件的等待,我仍然有疑问,我会看看是否有人在这里提供帮助。谢谢彼得

标签: karate


【解决方案1】:

根据您的问题,我相信您正在尝试进行 DELETE 调用(用于删除某些记录),然后进行 GET 调用(以验证该记录已被删除)。

从你的例子: 删除 'MyKarateSoap' 记录并验证 'MyKarateSoap' == null

答案 1: 如果您的删除服务需要更多时间来响应,您可以通过将其添加到您的删除调用来本地调整连接和读取超时,

* configure connectTimeout = 30000    
* configure readTimeout = 30000

这个配置会让空手道在抛出任何失败前等待 30 秒。 (仅当您提到的失败是由请求的连接或响应超时引起的)

通过反复试验选择最佳超时(或从 POSTMAN 或您的浏览器执行相同操作并获取平均响应时间)

答案 2:

您的删除服务可能会按预期响应,但有时系统中可能会存在延迟来修正您的删除,如果这种情况您可以使用类似下面的逻辑进行池化,这可能会导致您的 GET 调用失败

* def waitUntil =
"""
function(waitTime) {
    var poolTime = 5;
    var counter = 1;
    // should pool for every 5 seconds until it exceeds your input wait time
    while (true) {
        if( (counter*poolTime) > waitTime){
            karate.log('condition not satisfied for a long time, exiting');
            return false;
        }
        var result = karate.call('getApplicationsList.feature');
        var WmSOAPProvider = result.response.integration.serviceData.applicationsList.WmSOAPProvider
        if (WmSOAPProvider['MyKarateSoap']) {
            karate.log('condition satisfied, exiting');
            return true;
        }
        // pool every 5 seconds
        java.lang.Thread.sleep(poolTime*1000);
        counter++;
    }
};
"""
* def result = waitUntil(30)
* def assert result == true

这应该每 5 秒汇集一次你的 get 服务,直到它超过你的输入时间。

【讨论】:

  • 嗨,Babu,Answer1 正是我想要的。 Answer1 运行良好,您正确理解了问题空间。谢谢你的准确回复:)
  • @Anupama 如果您首先粘贴了错误消息,其他人会“理解问题空间”:P 很高兴您得到了答案,感谢 Babu Sekaran - 所以我在这里可以不那么活跃
  • 即使我对这个问题也有点怀疑,这就是为什么 2 个答案:P,@PeterThomas 我得到了这个;)
猜你喜欢
  • 2018-11-13
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 2011-08-17
  • 1970-01-01
相关资源
最近更新 更多