首页 文章

如何在空手道中添加条件等待响应?

提问于
浏览
-1

对于我们的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

在上面的代码中,只有在传递'delete'调用时才会调用'waitUntil' .

但我只想在DELETE呼叫响应失败/超过30秒时调用'waituntil'

我跟着How to retry a request until i get a valid dynamically generated value in response using karate dsl

但没有多大帮助

1 回答

  • 2

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

    从您的示例:删除“MyKarateSoap”记录并验证“MyKarateSoap”== null

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

    * configure connectTimeout = 30000    
    * configure readTimeout = 30000
    

    这种配置会让空手道等待30秒然后再输出任何失败 . (仅当您提到的故障是由请求的连接或响应超时引起时)

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

    Answer 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秒汇集一次获取服务,直到它超过您的输入时间 .

相关问题