在等待服务准备好或轮询长时间运行的作业结果时,我看到了 4 个基本选项:
- 使用 Postman 收集运行器或 newman 并设置每步延迟。在集合中的每个步骤之间插入此延迟。这里有两个挑战:它可能很脆弱,除非您将延迟设置为请求持续时间永远不会超过的值,并且通常只有少数步骤需要延迟,并且您正在增加总测试运行时间,从而为一个通用的构建服务器延迟其他待定的构建。
- 使用
https://postman-echo.com/delay/10
最后一个 URI 元素是等待的秒数。这简单明了,可以在长时间运行的请求之后作为单个步骤插入。挑战在于,如果请求持续时间变化很大,您可能会因为等待时间不够长而出现错误的失败。
- 重试相同的步骤,直到成功
postman.setNextRequest(request.name);
。这里的挑战是 Postman 将尽可能快地执行请求,这可以对您的服务进行 DDoS 攻击,将您列入黑名单(并导致错误的故障),如果在通用构建服务器上运行会消耗大量 CPU - 减慢其他构建。
- 在 Pre-request Script 中使用 setTimeout()。我在这种方法中看到的唯一缺点是,如果你有几个步骤需要这个逻辑,你最终会得到一些需要保持同步的剪切和粘贴代码
注意:这些有细微的变化——比如将它们设置在集合、集合文件夹、步骤等上。
我喜欢选项 4,因为它为我的大多数情况提供了正确的粒度级别。请注意,这似乎是在 Postman 脚本中“休眠”的唯一方法。现在不支持标准的 javascript 睡眠方法,例如带有 async 和 await 的 Promise,并且使用沙箱的 lodash_.delay(function() {}, delay, args[...])
不会在 Pre-request 脚本上保持脚本执行。
在 Postman 独立应用程序 v6.0.10 中,将您的步骤预请求脚本设置为:
console.log('Waiting for job completion in step "' + request.name + '"');
// Construct our request URL from environment variables
var url = request['url'].replace('{{host}}', postman.getEnvironmentVariable('host'));
var retryDelay = 1000;
var retryLimit = 3;
function isProcessingComplete(retryCount) {
pm.sendRequest(url, function (err, response) {
if(err) {
// hmmm. Should I keep trying or fail this run? Just log it for now.
console.log(err);
} else {
// I could also check for response.json().results.length > 0, but that
// would omit SUCCESS with empty results which may be valid
if(response.json().meta.status !== 'SUCCESS') {
if (retryCount < retryLimit) {
console.log('Job is still PENDING. Retrying in ' + retryDelay + 'ms');
setTimeout(function() {
isProcessingComplete(++retryCount);
}, retryDelay);
} else {
console.log('Retry limit reached, giving up.');
postman.setNextRequest(null);
}
}
}
});
}
isProcessingComplete(1);
您可以在同一步骤中进行标准测试。
注意:标准警告适用于使 retryLimit 变大。