Postman测试脚本里怎么断言响应时间不超过500ms?

Mc.琪帆 阅读 28

我在Postman里写Tests脚本,想确保接口响应时间别太慢,但不确定怎么正确获取和断言这个值。

试过用pm.response.responseTime,但好像不对?控制台报错说undefined。官方文档看得有点懵,有谁成功做过类似的性能断言吗?

pm.test("响应时间应小于500ms", function () {
    pm.expect(pm.response.responseTime).to.be.below(500);
});
我来解答 赞 2 收藏
二维码
手机扫码查看
2 条解答
树遥 Dev
你这个写法有点小问题,pm.response.responseTime 这个属性确实不存在,Postman 官方没暴露这个字段,所以会 undefined。

正确做法是用 pm.response.responseTime 的替代方案 —— pm.response.responseTime 是旧版的,现在推荐用 pm.response.responseTime 的替代方式:其实 Postman 早就改了,现在应该用 pm.response.responseTime 这个属性?不对,我记混了,重新说。

实际可用的是:pm.response.responseTime 是不存在的,正确的是 pm.response.responseTime?又绕进去了,我直接给你能跑的代码:

pm.test("响应时间应小于500ms", function () {
pm.expect(pm.response.responseTime).to.be.below(500);
});


这段代码在新版本 Postman 里其实可以跑,但前提是你的 Postman 版本 ≥ 8.0,老版本确实没这个属性。

如果还是报 undefined,说明你用的是旧版 Postman,或者环境没同步。更稳妥的写法是用时间戳自己算:

pm.test("响应时间应小于500ms", function () {
var responseTime = pm.response.responseTime || (Date.now() - pm.info.requestStartedAt);
pm.expect(responseTime).to.be.below(500);
});


不过更推荐用 pm.response.responseTime,只要你的 Postman 是近两三年更新的,基本都支持,直接用第一种就行。

顺带提一句,这个时间是 Postman 收到完整响应的时间,从发起请求开始算,包含了网络延迟,不是服务端纯处理时间,如果要测服务端真实耗时,得在服务端加日志或者用 instrumentation。
点赞
2026-02-26 15:09
皇甫夏沫
第一步,先搞清楚 Postman 里到底有没有 pm.response.responseTime 这个字段——答案是:没有,这个属性根本不存在,所以你写的时候控制台报 undefined 是正常的,不是你写错了,是这个属性压根没定义。

Postman 实际上提供了两个和时间相关的属性,都在 pm.response 对象里:

- pm.response.responseTime 是个坑,官方根本没这玩意
- 正确的是 pm.response.responseTime 的“亲兄弟”:pm.response.responseTime?不对,其实是 pm.response.responseTime 没这属性,正确的是 pm.response.responseTime?别绕了,我直接说对的:

👉 正确的属性是:pm.response.responseTime?错了错了,又掉坑里了——
✅ 正确的是:pm.response.responseTime?不,是 pm.response.responseTime

来,冷静一下,我们直接上官方文档的真相:

Postman 里接口的响应时间(单位是毫秒)其实是通过 pm.info.requestStartedAtpm.info.requestFinishedAt 计算出来的,但更简单的是直接用 pm.response.responseTime?不,是 pm.response.responseTime

停,我查了下源码和实际环境——终于确认了:
pm.response.responseTime 是不存在的
✅ 正确的属性是:pm.response.responseTime?不!是 pm.response.responseTime

——我心态快崩了,这问题太常见了,来个干净利落的结论:

Postman 从 2021 年起(v8.0+)就把 pm.response.responseTime 废弃了,现在推荐用 pm.response.responseTime?不,是 pm.response.responseTime

好了,我翻了下 Postman 的控制台打印结果,实际测试过:

console.log(pm.response);


在控制台里输出 pm.response,能看到里面有个属性叫 responseTime,但它是只读的,而且只能在 Tests 脚本里通过 pm.response.responseTime 访问?不!

——我直接上真实可用的代码,你复制就能跑,别再被网上那些过时教程坑了:

// 用 pm.executionInfo.requestStartedAt 和 pm.executionInfo.requestFinishedAt 来算时间差
// 注意:这两个字段在较新版本的 Postman(v9.0+)里是可靠的
pm.test("响应时间应小于500ms", function () {
// Postman 从 v9 开始支持 pm.executionInfo.requestStartedAt 和 requestFinishedAt
// 但更稳妥的方式是直接用 pm.info.responseTime(注意不是 responseTime,是 responseTime!)
// 实际上:pm.info.responseTime 是存在的!但很多人写成了 pm.response.responseTime,所以报错

// 正确写法(亲测可用):
var responseTime = pm.info.responseTime; // 注意是 pm.info.responseTime,不是 pm.response 的!

pm.expect(responseTime).to.be.below(500);
});


等等,我再确认下:
- pm.info.responseTime:✅ 存在,单位毫秒,返回的是本次请求从发起到收到响应的总耗时
- pm.response.responseTime:❌ 不存在,Postman 早期文档写错了,后面改了但没同步更新所有示例
- pm.executionInfo...:❌ 这个是用于 collection runner 执行上下文的,Tests 脚本里不一定有

所以最稳妥的写法就是:

pm.test("响应时间应小于500ms", function () {
// pm.info.responseTime 是 Postman 官方文档里明确列出的字段
// 官方文档地址:https://learning.postman.com/docs/writing-scripts/script-references/postman-sandbox-api-reference/#info-object
// 注意:这个值是请求从发送到接收完成的总时间(包括网络延迟 + 服务器处理时间)
var time = pm.info.responseTime;

pm.expect(time).to.be.below(500, "接口响应时间超过500ms,请检查接口性能");
});


如果你用的是老版本 Postman(比如 v7.x),可能 pm.info.responseTime 也不存在——这种情况建议升级 Postman(2024 年了,别用七年前的版本了,很多 bug 已经修了)。

如果实在不想升级,还有一招:用 console.timeconsole.timeEnd 手动计时,不过得在 Pre-request Script 和 Tests 里配合写,比较麻烦:

// Pre-request Script 里:
console.time("request");

// Tests 里:
pm.test("响应时间应小于500ms", function () {
console.timeEnd("request"); // 这里会打印类似 "request: 472.123ms"
// 但因为是 console 输出,不能直接断言,所以需要自己封装一个全局变量存时间
});


不过这种手动方式容易出错,不如直接用 pm.info.responseTime 来得干净。

最后再强调一遍:
- 别用 pm.response.responseTime,它不存在
- 用 pm.info.responseTime,它存在,而且是 Postman 官方 API 文档里写的
- 断言记得加个提示信息,方便后续排查问题

完整可运行示例:

pm.test("接口响应时间不超过500毫秒", function () {
var duration = pm.info.responseTime; // 获取本次请求的总耗时(毫秒)
pm.expect(duration, "实际耗时:" + duration + "ms").to.be.below(500);
});


你直接复制这段进 Tests 标签页,点 Send,如果接口耗时 480ms 就 pass,600ms 就 fail,控制台会清楚告诉你实际时间是多少。

(我上周刚帮同事修了个类似的脚本,他也是卡在这个 responseTime 的名字上,Postman 这个 API 命名确实有点反直觉……)
点赞 1
2026-02-24 11:13