You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Postman中将指定函数设为全局函数并实现断言重试?

Postman全局重试函数配置与使用指南

一、将函数设置为Postman全局可用函数

  1. 打开Postman,选中目标集合,点击右上角「...」按钮选择「Edit」进入集合编辑界面。
  2. 切换到「Pre-request Script」标签页,将以下修改后的工具函数代码粘贴进去:
// 定义全局工具函数集
window.commonUtils = (() => {
    var sleep = (sleepDuration) => {
        var startTime = new Date().getTime();
        while (new Date().getTime() - startTime < sleepDuration) {}
    }

    var sleepByAsyncDelayTime = () => {
        var sleepDuration = pm.environment.get('asyncDelayTime') || 0;
        sleep(sleepDuration);
    }

    var retryOnFailure = (predicate, numberOfRetrys, sleepDuration, reRouteRequestName, postmanAssertions) => {
        var retryCountPerReq_key = request.name + '_retry_count';
        var retryCountPerReq = pm.environment.get(retryCountPerReq_key) || 0;
        var reflowCountPerReq_key = request.name + '_reflow_count';
        var reflowCountPerReq = pm.environment.get(reflowCountPerReq_key) || 0;
        var totalReflowCount_key = 'totalReflowCount';
        var totalReflowCount = pm.environment.get(totalReflowCount_key) || 0;
        var maxReflowCounter = pm.environment.get('maxReflowCounter') || 0;
        var maxReflowCounterPerReq = pm.environment.get('maxReflowCounterPerReq') || 0;

        function clearAndExit() {
            pm.environment.unset(retryCountPerReq_key);
            pm.environment.unset(reflowCountPerReq_key);
            postmanAssertions();
        }

        function retry() {
            sleep(sleepDuration);
            pm.environment.set(retryCountPerReq_key, ++retryCountPerReq);
            postman.setNextRequest(request.name);
        }

        function reFlow() {
            if (totalReflowCount < maxReflowCounter && reflowCountPerReq < maxReflowCounterPerReq) {
                pm.environment.unset(retryCountPerReq_key);
                pm.environment.set(totalReflowCount_key, ++totalReflowCount);
                pm.environment.set(reflowCountPerReq_key, ++reflowCountPerReq);
                postman.setNextRequest(reRouteRequestName);
            } else clearAndExit();
        }

        if (predicate()) clearAndExit();
        else if (retryCountPerReq < numberOfRetrys) retry();
        else if (reRouteRequestName != '') reFlow();
        else clearAndExit();
    }

    return {
        sleepByAsyncDelayTime,
        sleep,
        retryOnFailure
    };
})();
  1. 点击「Save」保存集合设置,此时该集合下所有请求都能直接调用commonUtils中的函数。

二、在测试脚本中使用重试函数

在需要添加重试断言的请求的「Tests」标签页中,按以下示例编写代码:

// 1. 定义你的断言逻辑
function runMyAssertions() {
    pm.test("响应状态码为200", () => {
        pm.response.to.have.status(200);
    });
    pm.test("响应返回有效数据ID", () => {
        pm.expect(pm.response.json().data).to.have.property('id');
    });
}

// 2. 调用重试函数实现断言重试
commonUtils.retryOnFailure(
    // 判断条件:返回true则代表断言通过,终止重试
    () => pm.response.code === 200 && pm.response.json().data?.id,
    3, // 最大重试次数
    2000, // 每次重试间隔(毫秒)
    "", // 重试全部失败后跳转的请求名称(不需要则留空)
    runMyAssertions // 最终执行的断言函数
);

三、Collection Runner运行注意事项

  • 提前配置好所需环境变量:asyncDelayTime(异步等待时长)、maxReflowCounter(全局最大重定向次数)、maxReflowCounterPerReq(单请求最大重定向次数),无需特殊配置可设为0。
  • 运行集合时,确保勾选「Keep variable values」选项,保证重试过程中环境变量能正确更新。
  • 设置足够的「Iterations」次数(建议大于重试次数+1),避免因迭代次数不足导致重试流程提前终止。

内容的提问来源于stack exchange,提问作者Ibene Liz Mathew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:10:26