首页 > 解决方案 > 邮递员在测试失败并转移到下一个请求之前进行有限次数的轮询

问题描述

我正在为 Async GET 请求编写测试。此测试需要每 5 秒重试一次,最长持续 120 秒,然后才会失败并继续下一个请求。

目前,作为一种快速修复,我会在没有限制器的情况下继续重试,这意味着它将永远重试,直到在响应中看到预期的结果。

在下面找到我的代码:

var jsonData = pm.response.json(); 
tests["Assert id is a string"] = typeof(jsonData.id) === "string";

if (jsonData._async.status !== "done" && 
globals.async_inv_byAddress == jsonData.id){
  postman.setNextRequest("E2E get_Async_current_request");
} else {
    pm.test("Async Test Passed");
    postman.setNextRequest("E2E post_Async_next_request")
}

上面的代码可以运行几个小时而不会失败。

如果它无法在 120 秒内找到预期的输出,我需要找到一种使测试失败的方法,并且它需要每 5 秒重试一次

标签: javascriptautomated-testspostmanpostman-collection-runnerpostman-testcase

解决方案


你可以试试这个:

var moment = require('moment');
var timeStamp = pm.globals.get("timeStamp");

if (!timeStamp) {
    timeStamp = moment().add(2, 'minutes');
    pm.globals.set("timeStamp", timeStamp);
}

if (moment() < moment(pm.globals.get("timeStamp"))) {
    console.log("retry");
} else {
    console.log("stop");
    postman.setNextRequest(null);
    pm.globals.unset("timeStamp");
}

要定义您的 120 秒限制并添加此

setTimeout(function(){}, 5000);

给您预先请求脚本来定义每次重试之间 5 秒的延迟。

结合您的代码,您的测试将如下所示:

var jsonData = pm.response.json();
var moment = require('moment');
var timeStamp = pm.globals.get("timeStamp");

if (!timeStamp) { //create new Timestamp (now + 120 seconds)
    timeStamp = moment().add(120, 'seconds');
    pm.globals.set("timeStamp", timeStamp);
}

tests["Assert id is a string"] = typeof(jsonData.id) === "string";

if (moment() < moment(pm.globals.get("timeStamp"))) {//request is within 120 seconds
    if (jsonData._async.status !== "done" &&
        globals.async_inv_byAddress == jsonData.id) {
        postman.setNextRequest("E2E get_Async_current_request");
    } else {
        pm.test("Async Test Passed");
        postman.setNextRequest("E2E post_Async_next_request");
    }
} else { //120 seconds exceeded
    console.log("Stopping tests. 120 seconds exceeded.");
    postman.setNextRequest(null);
    pm.globals.unset("timeStamp");
}

并且您的预请求脚本如下所示:

setTimeout(function(){}, 5000);

或者,您可以在 cli 中通过 postman runner 或 newman 为每个请求设置请求延迟。


推荐阅读