邮递员/纽曼邮寄失败后重试

OBe*_*der 6 postman newman

在Newman中,我要进行测试以确保响应代码正确,响应时间合理并且响应值正确。

在某些情况下,由于网络故障或某些其他系统状况,某些请求可能会以超时或不正确的值结束,如果在几秒钟后处理了相同的请求,这些值将得到解决。

在这种情况下,我想重试相同的请求x次,两次请求之间的Y超时。

如果重试后经过一次迭代,我希望Newman退出代码为0(成功运行)。

小智 7

您可以像这样设置请求工作流程:

使用请求创建一个集合,然后:

在预请求选项卡中,您可以实现一个计数器:

// Counter for number of requests
var counter = environment.counter ? _.parseInt(environment.counter) + 1 : 1;
postman.setEnvironmentVariable("counter", counter);
Run Code Online (Sandbox Code Playgroud)

您的测试选项卡如下所示:

const code = (responseCode.code === 200);

if (code === 200 && environment.counter < X) {
    // Stop execution
    tests["Status code is 200"] = code;
    postman.setNextRequest();
}
else {
    // retry the same request
    postman.setNextRequest("Name of this request");
}
Run Code Online (Sandbox Code Playgroud)

可以使用 newman CLI 配置请求本身的超时:

newman run myCollection.json --timeout-request Y
Run Code Online (Sandbox Code Playgroud)


OBe*_*der 5

几个小时后,我以这样的函数结束了:

function retryOnFailure(successCode, numberOfRetrys) {
    var key = request.name + '_counter';
    var execCounter = postman.getEnvironmentVariable(key) || 1;

    var sleepDuration = 1000;
    var waitUntilTime = new Date().getTime() + sleepDuration;
    if (responseCode.code !== successCode && execCounter <= numberOfRetrys) {
        while (new Date().getTime() < waitUntilTime) {
            // Do Nothing -> Wait
        }
        console.log('Retrying: ' + request.name + '\nGot: ' + responseCode.code + ' Expected: ' + successCode + '\nWaited: ' + sleepDuration / 1000 + 'sec  \nRetry Number: ' + execCounter + ' of ' + numberOfRetrys);
        execCounter++;
        postman.setEnvironmentVariable(key, execCounter);
        postman.setNextRequest(request.name);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

retryOnFailure(404, 4);
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过 pm.globals.set() 将其放置在 postman 环境变量中,并在每次需要该函数时对其执行 eval() (2认同)