1. 项目概述为什么我们需要自动携带Cookie在接口测试的日常工作中登录验证是绕不开的第一道坎。无论是测试一个电商系统的下单流程还是验证一个内容管理系统的权限控制你几乎总是需要先“登录”进去。对于手工测试我们可以在浏览器里点点鼠标输入账号密码然后浏览器会帮我们记住那个叫做“Cookie”的小东西后续的请求就畅通无阻了。但到了自动化测试尤其是在Postman这类工具里事情就变得有点棘手。很多新手甚至一些有经验的测试同学都曾卡在这个环节第一个登录接口调通了返回了Set-Cookie头看着状态码200很高兴。但紧接着调用第二个需要登录态的接口时直接就返回了401未授权或者跳转到登录页。问题出在哪Postman并没有像浏览器那样自动将上一个请求响应的Cookie附加到下一个请求的Header里。这个“自动”的动作需要我们通过脚本去实现。这就是“自动携带Cookie”的核心价值模拟浏览器的会话保持行为让一系列相关的接口测试能够像真实用户操作一样连贯执行。它解决的不仅仅是“登录”这一步更是解决了后续所有依赖登录状态的接口测试的自动化前提。没有它你的接口集合Collection就无法真正实现一键运行每次可能都得手动去复制粘贴那一长串的Cookie值效率低下且容易出错。2. 核心思路拆解Cookie的流转与自动化捕获要实现自动携带我们首先要理解Cookie在HTTP请求中的生命周期。它本质上是一小段由服务器发送到客户端浏览器或Postman的文本信息客户端会将其存储起来并在后续向同一服务器发起请求时自动附加上去。2.1 Cookie从哪来到哪去来源当服务器验证用户身份成功后比如登录接口会在HTTP响应头Response Headers中通过Set-Cookie字段下发一个或多个Cookie。例如Set-Cookie: sessionIdabc123; Path/; HttpOnly。存储客户端如Postman接收到这个响应后会解析Set-Cookie头并将Cookie值如sessionIdabc123存储在其内部的Cookie JarCookie罐中同时记录该Cookie的域名Domain、路径Path等属性。携带当客户端后续再向同一域名、且路径匹配的服务器发起请求时会自动从Cookie Jar中取出对应的Cookie并将其添加到请求头Request Headers的Cookie字段中。例如Cookie: sessionIdabc123。2.2 Postman的“半自动”与我们的“全自动”Postman本身具备基础的Cookie管理能力即它有自己的Cookie Jar。如果你在Postman中直接访问一个网站并登录它也能记录Cookie。但问题在于当我们通过脚本Pre-request Script 或 Tests来驱动接口调用时特别是当登录接口返回的Cookie需要被后续接口使用时Postman的默认行为并不总是如我们所愿。我们的目标是通过编写脚本主动地、可靠地完成“捕获登录响应Cookie” - “存储或设置为全局变量” - “为后续请求自动添加Cookie头”这个流程从而实现无缝的、可复现的自动化登录测试链。2.3 方案选型环境变量与脚本联动在Postman中实现数据传递和持久化的核心是环境变量Environment Variables和全局变量Global Variables。我们的方案将围绕它们展开捕获阶段在登录接口的“Tests”标签页中编写JavaScript脚本从响应中提取Cookie并将其存入一个环境变量如auth_cookie。应用阶段在后续所有需要登录态的接口的“Pre-request Script”标签页中编写脚本从上述环境变量中读取Cookie值并动态地将其设置为当前请求的Header。这个方案的优势在于清晰、灵活、可维护。环境变量可以随着不同的测试环境开发、测试、生产切换而脚本逻辑是通用的。它避免了硬编码也使得我们的接口集合可以在不同用户、不同环境下共享和运行。3. 实操准备环境搭建与脚本基础在开始编写核心脚本之前我们需要做好一些准备工作确保Postman环境处于最佳状态。3.1 创建与管理测试环境强烈建议为你的项目创建一个专属的测试环境而不是使用全局变量。这样更利于管理。在Postman右上角点击眼睛图标旁边的下拉菜单选择“Add”。输入环境名称例如“My_API_Test_Env”。在下方表格中我们可以预先添加一些变量比如base_url基础地址、username、password如果不想明文存储密码可以在脚本中通过其他方式获取或使用占位符。对于Cookie我们暂时留空让脚本运行时填充。创建完成后务必在右上角下拉菜单中选中这个新环境这样我们的脚本才能正确读写其中的变量。3.2 理解Postman的脚本沙盒Postman的脚本运行在Node.js风格的沙盒环境中它内置了许多强大的库比如pm对象、cheerio用于解析HTML、lodash等。我们最需要熟悉的是pm对象它提供了访问请求、响应、变量、测试结果的完整API。pm.response获取响应对象。pm.response.headers获取响应头pm.response.json()获取JSON格式的响应体。pm.request获取请求对象。可以修改请求头、请求体等。pm.environment和pm.globals用于管理环境变量和全局变量。pm.environment.set(key, value)用于设置pm.environment.get(key)用于获取。pm.test用于编写测试断言。pm.cookiesPostman提供的Cookie操作对象但有时直接操作Set-Cookie头更直接。3.3 创建接口集合与示例接口创建集合Collection新建一个集合命名为“用户业务流测试”。集合可以添加文件夹用于归类接口比如“认证”、“用户信息”、“订单”。添加登录接口在“认证”文件夹下新建一个请求。方法POSTURL{{base_url}}/api/login(使用环境变量)Body选择raw-JSON填入{username: {{username}}, password: {{password}}}在“Tests”标签页我们将编写捕获Cookie的脚本。添加一个需要登录的接口例如“获取用户信息”。方法GETURL{{base_url}}/api/user/profile在“Pre-request Script”标签页我们将编写添加Cookie头的脚本。准备工作就绪接下来进入核心环节。4. 核心脚本实现捕获、存储与应用Cookie这是整个自动化的心脏部分。我们将分三步实现完整的Cookie流转。4.1 在登录接口的Tests中捕获并存储Cookie登录接口成功调用后我们需要在其“Tests”标签页编写脚本从响应头中提取Cookie。// 登录接口的 Tests 脚本 // 1. 验证登录是否成功可选但推荐 pm.test(登录成功, function () { pm.response.to.have.status(200); var jsonData pm.response.json(); pm.expect(jsonData.code).to.eql(0); // 假设业务码0表示成功 }); // 2. 核心从响应头中获取Cookie // 注意响应头中的Cookie字段可能是set-cookie小写Postman的pm.response.headers对象对头名称大小写不敏感但返回的可能是数组。 var cookieHeader pm.response.headers.get(Set-Cookie); // 如果服务器返回了Cookie if (cookieHeader) { // 打印一下看看调试用 console.log(原始Set-Cookie头, cookieHeader); // 处理Cookie字符串。一个Set-Cookie头可能包含多个Cookie用逗号分隔但更常见的是多个Set-Cookie头。 // 这里我们处理一个简单场景假设只有一个主要的会话Cookie。 // 我们需要从sessionIdabc123; Path/; HttpOnly; Max-Age3600这样的字符串中提取出sessionIdabc123。 // 方法分割字符串取第一个分号前的部分 var cookiePairs cookieHeader.split(;); var sessionCookie cookiePairs[0].trim(); // 得到 sessionIdabc123 // 3. 将Cookie存储到环境变量中 pm.environment.set(auth_cookie, sessionCookie); console.log(已将会话Cookie存储到环境变量 auth_cookie: , sessionCookie); // 你也可以存储完整的Cookie头但后续使用可能需要额外处理 // pm.environment.set(full_cookie_header, cookieHeader); } else { console.warn(登录响应中未找到Set-Cookie头请检查接口实现。); // 或者尝试从响应体中获取token如果是Token方案 }注意实际场景中Cookie可能非常复杂包含多个键值对如sessionId,userId,token等并且可能有多个Set-Cookie头。上述脚本是一个基础示例。对于复杂情况你可能需要循环遍历pm.response.headers过滤出所有Set-Cookie头然后进行拼接和处理。4.2 在需要认证的接口的Pre-request Script中应用Cookie对于“获取用户信息”这类需要登录态的接口我们在其“Pre-request Script”标签页中编写脚本动态添加Cookie头。// 需要认证接口的 Pre-request Script 脚本 // 1. 从环境变量中获取之前存储的Cookie var storedCookie pm.environment.get(auth_cookie); // 2. 检查Cookie是否存在 if (storedCookie) { // 3. 将Cookie添加到当前请求的Header中 // 注意这里使用pm.request.headers.upsert如果已存在Cookie头则更新不存在则添加。 pm.request.headers.upsert({ key: Cookie, value: storedCookie }); console.log(已为请求添加Cookie头: , storedCookie); } else { console.error(环境变量 auth_cookie 为空请先运行登录接口。); // 可以选择让请求失败或者继续执行请求可能会返回401 // pm.expect(storedCookie).to.not.be.empty; // 使用断言让测试失败 }4.3 使用集合级脚本进行全局管理如果集合内很多接口都需要这个Cookie在每个接口都写一遍Pre-request Script会很冗余。Postman允许在集合Collection级别和文件夹Folder级别添加脚本这些脚本会在集合内每个请求运行前Pre-request或运行后Tests执行。这是一个更优雅的方案点击你的集合“用户业务流测试”右侧的“...”选择“Edit”。切换到“Pre-request Scripts”标签页。将上面“应用Cookie”的脚本移到这里。这样集合下的所有请求在发送前都会自动尝试添加Cookie。// 集合级别的 Pre-request Script var storedCookie pm.environment.get(auth_cookie); if (storedCookie) { pm.request.headers.upsert({ key: Cookie, value: storedCookie }); } // 注意这样会为所有请求添加Cookie包括登录请求本身此时auth_cookie为空所以没影响。 // 但如果某些接口如公开API不需要Cookie可能会出错。这时可以在该接口的Pre-request Script中覆盖此行为。实操心得对于大型项目我通常采用“集合级脚本添加Cookie 接口级脚本选择性移除”的策略。在集合级脚本里添加Cookie然后在那些不需要Cookie的接口的Pre-request Script里写pm.request.headers.remove(Cookie)。这样管理起来最清晰。5. 高级技巧与常见问题排查掌握了基础方法后我们来看看更复杂的场景和那些容易踩的坑。5.1 处理复杂的Cookie场景多个Cookie如果登录接口返回多个Set-Cookie头你需要将它们合并成一个Cookie头的值用分号和空格分隔。// 在登录接口的Tests中 var cookieHeaders pm.response.headers.getAll(Set-Cookie); var combinedCookieValue ; if (cookieHeaders cookieHeaders.length 0) { // 提取每个Cookie头的第一个键值对分号前 var cookiePairs cookieHeaders.map(function(header) { return header.split(;)[0].trim(); }); combinedCookieValue cookiePairs.join(; ); pm.environment.set(auth_cookie, combinedCookieValue); }Cookie域和路径Postman的Cookie Jar会自动管理域和路径。但当我们手动设置Cookie头时就绕过了这个机制。确保你请求的URL域名和路径与Cookie匹配否则服务器可能不认。如果你的测试涉及多个子域名可能需要更精细的处理。HttpOnly Cookie这种Cookie无法通过JavaScript的document.cookie访问但通过HTTP头Set-Cookie设置和Cookie发送是完全正常的我们的脚本处理方式不受影响。5.2 使用Postman内置的Cookie Jar替代方案除了手动设置HeaderPostman的pm.cookiesAPI允许你直接操作其内部的Cookie Jar。// 在登录接口的Tests中将Cookie设置到Jar中 var cookieHeader pm.response.headers.get(Set-Cookie); if (cookieHeader) { // pm.cookies.set() 参数Cookie名, Cookie值, 域名, [路径] // 需要从cookieHeader中解析出域名这里用当前请求的域名简化处理 var domain pm.request.url.getHost(); // 例如 api.example.com // 解析Cookie名和值简化示例实际需更健壮的解析 var match cookieHeader.match(/^([^])([^;])/); if (match) { pm.cookies.set(match[1], match[2], domain); console.log(已设置Cookie到Jar: ${match[1]}${match[2]} for ${domain}); } }使用此方法后后续向同一域名的请求Postman会自动从Jar中附加Cookie无需再写Pre-request Script。但请注意这种方式依赖于Postman的Cookie管理机制在脚本控制的流程中有时不如手动设置Header来得直接和可控尤其是在需要清理或覆盖特定Cookie时。5.3 常见问题排查清单当你发现Cookie自动携带失效时可以按照以下清单逐一排查问题现象可能原因排查步骤与解决方案登录成功但后续接口返回4011. Cookie未成功捕获或存储。2. Cookie未成功添加到后续请求头。3. Cookie已过期或失效。4. 请求的域名/路径与Cookie作用域不匹配。1.检查登录接口Tests脚本在ConsoleView - Show Postman Console查看是否有console.log输出确认auth_cookie变量是否被正确赋值。2.检查后续请求头发送请求前在请求的“Headers”标签页查看是否生成了Cookie头。或者查看Console中发出的原始请求。3.检查Cookie有效期Set-Cookie头中的Max-Age或Expires属性。脚本可以定期重新登录更新Cookie。4.核对URL确保后续请求的域名和路径包含在Cookie的Domain和Path属性内。Console中显示auth_cookie为空1. 环境未正确切换。2. 变量名拼写错误。3. 登录接口响应结构不符未进入if分支。1. 确认右上角选择的环境是包含auth_cookie变量的环境。2. 检查pm.environment.set和pm.environment.get的变量名是否完全一致大小写敏感。3. 打印pm.response.headers确认Set-Cookie头的确切名称。有些服务器可能用set-cookie全小写。多个Cookie处理错误脚本只处理了第一个Cookie或拼接格式错误。使用getAll(Set-Cookie)获取数组并按照key1value1; key2value2的格式正确拼接。在Console中检查拼接后的字符串。集合运行器Runner中失效集合运行器有独立的执行上下文和变量生命周期。确保在集合运行器的“迭代”设置中正确关联了你的环境。并且登录接口的Tests脚本确实在每次迭代开始时执行。5.4 安全与维护建议不要硬编码敏感信息账号密码尽量使用环境变量并且考虑使用Postman的“初始值和当前值”功能将密码的当前值留空运行时手动输入或通过更安全的方式获取。定期清理Cookie在测试套件的开始或结束可以编写脚本清除环境变量pm.environment.unset(auth_cookie)或清除Cookie Jarpm.cookies.clear()避免测试数据污染。封装通用函数如果你有多个项目或集合可以将捕获和应用Cookie的脚本写成通用的代码片段保存在Postman的“Snippets”中方便复用。6. 完整脚本示例与集合运行实战让我们整合前面的知识构建一个可运行的完整示例并通过Postman的集合运行器来执行整个测试流。6.1 完整的登录接口Tests脚本增强版这个脚本增加了更健壮的Cookie解析和错误处理。// 增强版登录接口Tests脚本 pm.test(Status code is 200, function () { pm.response.to.have.status(200); }); // 尝试从JSON body中获取业务状态码根据实际API设计调整 var jsonData; try { jsonData pm.response.json(); pm.test(Login successful, function () { pm.expect(jsonData.code).to.eql(0); // 或 pm.expect(jsonData.success).to.be.true; }); } catch (e) { console.log(Response is not JSON or parsing failed:, e.message); } // 捕获并处理Cookie var cookieHeaders pm.response.headers.getAll(Set-Cookie); console.log(Found Set-Cookie headers:, cookieHeaders); if (cookieHeaders cookieHeaders.length 0) { var cookiesToStore []; for (var i 0; i cookieHeaders.length; i) { var header cookieHeaders[i]; // 提取每个Cookie的主要键值对第一个分号前 var keyValuePart header.split(;)[0].trim(); if (keyValuePart) { cookiesToStore.push(keyValuePart); } } if (cookiesToStore.length 0) { var combinedCookie cookiesToStore.join(; ); pm.environment.set(auth_cookie, combinedCookie); console.log(Combined and stored cookie:, combinedCookie); // 可选同时解析出重要的Cookie单独存储方便其他用途 // 例如解析sessionId for (var pair of cookiesToStore) { if (pair.startsWith(sessionId)) { pm.environment.set(session_id, pair.split()[1]); break; } } } else { console.warn(No valid key-value pairs found in Set-Cookie headers.); } } else { // 如果没有Cookie检查是否是Token方案如Bearer Token if (jsonData jsonData.data jsonData.data.token) { pm.environment.set(access_token, jsonData.data.token); console.log(Stored access token.); // 注意Token通常放在Authorization头不是Cookie头。后续接口的Pre-request Script需要相应调整。 } else { console.error(No authentication credentials (Cookie or Token) found in response.); } }6.2 完整的集合级Pre-request Script智能版这个脚本会智能判断只为需要认证的接口添加Cookie。// 集合级Pre-request Script (智能版) // 假设我们为需要认证的接口的URL路径定义一个特征例如包含 /api/private/ 或 /admin/ var requestUrl pm.request.url.toString(); // 定义一个函数判断是否需要认证根据你的项目规则调整 function requiresAuth(url) { // 规则1排除登录接口本身 if (url.includes(/api/login)) { return false; } // 规则2特定路径需要认证 var authPaths [/api/private/, /api/user/, /api/admin/, /api/order/]; // 示例路径 for (var path of authPaths) { if (url.includes(path)) { return true; } } // 规则3可以根据请求方法判断如所有POST/PUT/DELETE需要认证 // if (pm.request.method ! GET) { return true; } return false; } if (requiresAuth(requestUrl)) { var authCookie pm.environment.get(auth_cookie); if (authCookie) { pm.request.headers.upsert({ key: Cookie, value: authCookie }); console.log([集合脚本] 为请求 ${pm.request.method} ${pm.request.url.getPath()} 添加Cookie头); } else { console.warn([集合脚本] 请求 ${pm.request.method} ${pm.request.url.getPath()} 需要认证但 auth_cookie 为空。); // 可以在这里让测试提前失败 // throw new Error(Authentication required but no cookie found. Please run login first.); } } else { // 对于不需要认证的请求确保没有残留的Cookie头避免干扰 pm.request.headers.remove(Cookie); console.log([集合脚本] 请求 ${pm.request.method} ${pm.request.url.getPath()} 为公开接口已清理Cookie头); }6.3 使用集合运行器进行自动化测试脚本写好后真正的威力在于自动化执行。打开Postman进入你的“用户业务流测试”集合。点击顶部的“Runner”按钮打开集合运行器。在左侧勾选你的集合以及需要运行的接口通常全选。在右侧选择对应的环境如“My_API_Test_Env”。设置迭代次数如1次和延迟。点击“Run XXX Collection”按钮。集合运行器会按照顺序执行集合内的请求。你会看到首先执行“登录接口”其Tests脚本会捕获Cookie并存入环境变量。接着执行“获取用户信息”等接口集合级的Pre-request Script会检测到这是需要认证的接口并从环境变量中读取Cookie自动添加到请求头中。所有请求的结果状态码、测试结果会清晰地展示在运行结果页面。如果中间任何一步出错比如登录失败导致Cookie为空后续的认证接口很可能会失败从而在测试结果中明确标识出问题链路这正是自动化测试的价值所在。6.4 维护与扩展随着项目迭代接口可能变化。你需要定期检查登录接口响应格式Cookie的名称或位置是否改变。认证规则集合级脚本中的requiresAuth函数规则是否需要更新。环境变量确保测试账号有效环境配置如base_url正确。你可以将这个模式扩展到更复杂的场景比如处理OAuth 2.0令牌、处理CSRF Token通常也需要从Cookie或响应体中提取并放到后续请求的Header或Body中。其核心思想不变通过脚本桥接请求之间的依赖关系将手动操作自动化。掌握了自动携带Cookie的技术你的Postman接口测试就突破了单点验证的局限迈向了业务流程自动化测试的新阶段。从用户登录、浏览商品、加入购物车到下单支付这一整套流程都可以在一个集合运行中一气呵成极大地提升了回归测试的效率和可靠性。下次当你需要测试一整个用户旅程时别忘了先把这个“通行证”自动化的脚本准备好。
Postman接口测试自动化:Cookie自动携带实现与实战指南
发布时间:2026/6/30 19:59:59
1. 项目概述为什么我们需要自动携带Cookie在接口测试的日常工作中登录验证是绕不开的第一道坎。无论是测试一个电商系统的下单流程还是验证一个内容管理系统的权限控制你几乎总是需要先“登录”进去。对于手工测试我们可以在浏览器里点点鼠标输入账号密码然后浏览器会帮我们记住那个叫做“Cookie”的小东西后续的请求就畅通无阻了。但到了自动化测试尤其是在Postman这类工具里事情就变得有点棘手。很多新手甚至一些有经验的测试同学都曾卡在这个环节第一个登录接口调通了返回了Set-Cookie头看着状态码200很高兴。但紧接着调用第二个需要登录态的接口时直接就返回了401未授权或者跳转到登录页。问题出在哪Postman并没有像浏览器那样自动将上一个请求响应的Cookie附加到下一个请求的Header里。这个“自动”的动作需要我们通过脚本去实现。这就是“自动携带Cookie”的核心价值模拟浏览器的会话保持行为让一系列相关的接口测试能够像真实用户操作一样连贯执行。它解决的不仅仅是“登录”这一步更是解决了后续所有依赖登录状态的接口测试的自动化前提。没有它你的接口集合Collection就无法真正实现一键运行每次可能都得手动去复制粘贴那一长串的Cookie值效率低下且容易出错。2. 核心思路拆解Cookie的流转与自动化捕获要实现自动携带我们首先要理解Cookie在HTTP请求中的生命周期。它本质上是一小段由服务器发送到客户端浏览器或Postman的文本信息客户端会将其存储起来并在后续向同一服务器发起请求时自动附加上去。2.1 Cookie从哪来到哪去来源当服务器验证用户身份成功后比如登录接口会在HTTP响应头Response Headers中通过Set-Cookie字段下发一个或多个Cookie。例如Set-Cookie: sessionIdabc123; Path/; HttpOnly。存储客户端如Postman接收到这个响应后会解析Set-Cookie头并将Cookie值如sessionIdabc123存储在其内部的Cookie JarCookie罐中同时记录该Cookie的域名Domain、路径Path等属性。携带当客户端后续再向同一域名、且路径匹配的服务器发起请求时会自动从Cookie Jar中取出对应的Cookie并将其添加到请求头Request Headers的Cookie字段中。例如Cookie: sessionIdabc123。2.2 Postman的“半自动”与我们的“全自动”Postman本身具备基础的Cookie管理能力即它有自己的Cookie Jar。如果你在Postman中直接访问一个网站并登录它也能记录Cookie。但问题在于当我们通过脚本Pre-request Script 或 Tests来驱动接口调用时特别是当登录接口返回的Cookie需要被后续接口使用时Postman的默认行为并不总是如我们所愿。我们的目标是通过编写脚本主动地、可靠地完成“捕获登录响应Cookie” - “存储或设置为全局变量” - “为后续请求自动添加Cookie头”这个流程从而实现无缝的、可复现的自动化登录测试链。2.3 方案选型环境变量与脚本联动在Postman中实现数据传递和持久化的核心是环境变量Environment Variables和全局变量Global Variables。我们的方案将围绕它们展开捕获阶段在登录接口的“Tests”标签页中编写JavaScript脚本从响应中提取Cookie并将其存入一个环境变量如auth_cookie。应用阶段在后续所有需要登录态的接口的“Pre-request Script”标签页中编写脚本从上述环境变量中读取Cookie值并动态地将其设置为当前请求的Header。这个方案的优势在于清晰、灵活、可维护。环境变量可以随着不同的测试环境开发、测试、生产切换而脚本逻辑是通用的。它避免了硬编码也使得我们的接口集合可以在不同用户、不同环境下共享和运行。3. 实操准备环境搭建与脚本基础在开始编写核心脚本之前我们需要做好一些准备工作确保Postman环境处于最佳状态。3.1 创建与管理测试环境强烈建议为你的项目创建一个专属的测试环境而不是使用全局变量。这样更利于管理。在Postman右上角点击眼睛图标旁边的下拉菜单选择“Add”。输入环境名称例如“My_API_Test_Env”。在下方表格中我们可以预先添加一些变量比如base_url基础地址、username、password如果不想明文存储密码可以在脚本中通过其他方式获取或使用占位符。对于Cookie我们暂时留空让脚本运行时填充。创建完成后务必在右上角下拉菜单中选中这个新环境这样我们的脚本才能正确读写其中的变量。3.2 理解Postman的脚本沙盒Postman的脚本运行在Node.js风格的沙盒环境中它内置了许多强大的库比如pm对象、cheerio用于解析HTML、lodash等。我们最需要熟悉的是pm对象它提供了访问请求、响应、变量、测试结果的完整API。pm.response获取响应对象。pm.response.headers获取响应头pm.response.json()获取JSON格式的响应体。pm.request获取请求对象。可以修改请求头、请求体等。pm.environment和pm.globals用于管理环境变量和全局变量。pm.environment.set(key, value)用于设置pm.environment.get(key)用于获取。pm.test用于编写测试断言。pm.cookiesPostman提供的Cookie操作对象但有时直接操作Set-Cookie头更直接。3.3 创建接口集合与示例接口创建集合Collection新建一个集合命名为“用户业务流测试”。集合可以添加文件夹用于归类接口比如“认证”、“用户信息”、“订单”。添加登录接口在“认证”文件夹下新建一个请求。方法POSTURL{{base_url}}/api/login(使用环境变量)Body选择raw-JSON填入{username: {{username}}, password: {{password}}}在“Tests”标签页我们将编写捕获Cookie的脚本。添加一个需要登录的接口例如“获取用户信息”。方法GETURL{{base_url}}/api/user/profile在“Pre-request Script”标签页我们将编写添加Cookie头的脚本。准备工作就绪接下来进入核心环节。4. 核心脚本实现捕获、存储与应用Cookie这是整个自动化的心脏部分。我们将分三步实现完整的Cookie流转。4.1 在登录接口的Tests中捕获并存储Cookie登录接口成功调用后我们需要在其“Tests”标签页编写脚本从响应头中提取Cookie。// 登录接口的 Tests 脚本 // 1. 验证登录是否成功可选但推荐 pm.test(登录成功, function () { pm.response.to.have.status(200); var jsonData pm.response.json(); pm.expect(jsonData.code).to.eql(0); // 假设业务码0表示成功 }); // 2. 核心从响应头中获取Cookie // 注意响应头中的Cookie字段可能是set-cookie小写Postman的pm.response.headers对象对头名称大小写不敏感但返回的可能是数组。 var cookieHeader pm.response.headers.get(Set-Cookie); // 如果服务器返回了Cookie if (cookieHeader) { // 打印一下看看调试用 console.log(原始Set-Cookie头, cookieHeader); // 处理Cookie字符串。一个Set-Cookie头可能包含多个Cookie用逗号分隔但更常见的是多个Set-Cookie头。 // 这里我们处理一个简单场景假设只有一个主要的会话Cookie。 // 我们需要从sessionIdabc123; Path/; HttpOnly; Max-Age3600这样的字符串中提取出sessionIdabc123。 // 方法分割字符串取第一个分号前的部分 var cookiePairs cookieHeader.split(;); var sessionCookie cookiePairs[0].trim(); // 得到 sessionIdabc123 // 3. 将Cookie存储到环境变量中 pm.environment.set(auth_cookie, sessionCookie); console.log(已将会话Cookie存储到环境变量 auth_cookie: , sessionCookie); // 你也可以存储完整的Cookie头但后续使用可能需要额外处理 // pm.environment.set(full_cookie_header, cookieHeader); } else { console.warn(登录响应中未找到Set-Cookie头请检查接口实现。); // 或者尝试从响应体中获取token如果是Token方案 }注意实际场景中Cookie可能非常复杂包含多个键值对如sessionId,userId,token等并且可能有多个Set-Cookie头。上述脚本是一个基础示例。对于复杂情况你可能需要循环遍历pm.response.headers过滤出所有Set-Cookie头然后进行拼接和处理。4.2 在需要认证的接口的Pre-request Script中应用Cookie对于“获取用户信息”这类需要登录态的接口我们在其“Pre-request Script”标签页中编写脚本动态添加Cookie头。// 需要认证接口的 Pre-request Script 脚本 // 1. 从环境变量中获取之前存储的Cookie var storedCookie pm.environment.get(auth_cookie); // 2. 检查Cookie是否存在 if (storedCookie) { // 3. 将Cookie添加到当前请求的Header中 // 注意这里使用pm.request.headers.upsert如果已存在Cookie头则更新不存在则添加。 pm.request.headers.upsert({ key: Cookie, value: storedCookie }); console.log(已为请求添加Cookie头: , storedCookie); } else { console.error(环境变量 auth_cookie 为空请先运行登录接口。); // 可以选择让请求失败或者继续执行请求可能会返回401 // pm.expect(storedCookie).to.not.be.empty; // 使用断言让测试失败 }4.3 使用集合级脚本进行全局管理如果集合内很多接口都需要这个Cookie在每个接口都写一遍Pre-request Script会很冗余。Postman允许在集合Collection级别和文件夹Folder级别添加脚本这些脚本会在集合内每个请求运行前Pre-request或运行后Tests执行。这是一个更优雅的方案点击你的集合“用户业务流测试”右侧的“...”选择“Edit”。切换到“Pre-request Scripts”标签页。将上面“应用Cookie”的脚本移到这里。这样集合下的所有请求在发送前都会自动尝试添加Cookie。// 集合级别的 Pre-request Script var storedCookie pm.environment.get(auth_cookie); if (storedCookie) { pm.request.headers.upsert({ key: Cookie, value: storedCookie }); } // 注意这样会为所有请求添加Cookie包括登录请求本身此时auth_cookie为空所以没影响。 // 但如果某些接口如公开API不需要Cookie可能会出错。这时可以在该接口的Pre-request Script中覆盖此行为。实操心得对于大型项目我通常采用“集合级脚本添加Cookie 接口级脚本选择性移除”的策略。在集合级脚本里添加Cookie然后在那些不需要Cookie的接口的Pre-request Script里写pm.request.headers.remove(Cookie)。这样管理起来最清晰。5. 高级技巧与常见问题排查掌握了基础方法后我们来看看更复杂的场景和那些容易踩的坑。5.1 处理复杂的Cookie场景多个Cookie如果登录接口返回多个Set-Cookie头你需要将它们合并成一个Cookie头的值用分号和空格分隔。// 在登录接口的Tests中 var cookieHeaders pm.response.headers.getAll(Set-Cookie); var combinedCookieValue ; if (cookieHeaders cookieHeaders.length 0) { // 提取每个Cookie头的第一个键值对分号前 var cookiePairs cookieHeaders.map(function(header) { return header.split(;)[0].trim(); }); combinedCookieValue cookiePairs.join(; ); pm.environment.set(auth_cookie, combinedCookieValue); }Cookie域和路径Postman的Cookie Jar会自动管理域和路径。但当我们手动设置Cookie头时就绕过了这个机制。确保你请求的URL域名和路径与Cookie匹配否则服务器可能不认。如果你的测试涉及多个子域名可能需要更精细的处理。HttpOnly Cookie这种Cookie无法通过JavaScript的document.cookie访问但通过HTTP头Set-Cookie设置和Cookie发送是完全正常的我们的脚本处理方式不受影响。5.2 使用Postman内置的Cookie Jar替代方案除了手动设置HeaderPostman的pm.cookiesAPI允许你直接操作其内部的Cookie Jar。// 在登录接口的Tests中将Cookie设置到Jar中 var cookieHeader pm.response.headers.get(Set-Cookie); if (cookieHeader) { // pm.cookies.set() 参数Cookie名, Cookie值, 域名, [路径] // 需要从cookieHeader中解析出域名这里用当前请求的域名简化处理 var domain pm.request.url.getHost(); // 例如 api.example.com // 解析Cookie名和值简化示例实际需更健壮的解析 var match cookieHeader.match(/^([^])([^;])/); if (match) { pm.cookies.set(match[1], match[2], domain); console.log(已设置Cookie到Jar: ${match[1]}${match[2]} for ${domain}); } }使用此方法后后续向同一域名的请求Postman会自动从Jar中附加Cookie无需再写Pre-request Script。但请注意这种方式依赖于Postman的Cookie管理机制在脚本控制的流程中有时不如手动设置Header来得直接和可控尤其是在需要清理或覆盖特定Cookie时。5.3 常见问题排查清单当你发现Cookie自动携带失效时可以按照以下清单逐一排查问题现象可能原因排查步骤与解决方案登录成功但后续接口返回4011. Cookie未成功捕获或存储。2. Cookie未成功添加到后续请求头。3. Cookie已过期或失效。4. 请求的域名/路径与Cookie作用域不匹配。1.检查登录接口Tests脚本在ConsoleView - Show Postman Console查看是否有console.log输出确认auth_cookie变量是否被正确赋值。2.检查后续请求头发送请求前在请求的“Headers”标签页查看是否生成了Cookie头。或者查看Console中发出的原始请求。3.检查Cookie有效期Set-Cookie头中的Max-Age或Expires属性。脚本可以定期重新登录更新Cookie。4.核对URL确保后续请求的域名和路径包含在Cookie的Domain和Path属性内。Console中显示auth_cookie为空1. 环境未正确切换。2. 变量名拼写错误。3. 登录接口响应结构不符未进入if分支。1. 确认右上角选择的环境是包含auth_cookie变量的环境。2. 检查pm.environment.set和pm.environment.get的变量名是否完全一致大小写敏感。3. 打印pm.response.headers确认Set-Cookie头的确切名称。有些服务器可能用set-cookie全小写。多个Cookie处理错误脚本只处理了第一个Cookie或拼接格式错误。使用getAll(Set-Cookie)获取数组并按照key1value1; key2value2的格式正确拼接。在Console中检查拼接后的字符串。集合运行器Runner中失效集合运行器有独立的执行上下文和变量生命周期。确保在集合运行器的“迭代”设置中正确关联了你的环境。并且登录接口的Tests脚本确实在每次迭代开始时执行。5.4 安全与维护建议不要硬编码敏感信息账号密码尽量使用环境变量并且考虑使用Postman的“初始值和当前值”功能将密码的当前值留空运行时手动输入或通过更安全的方式获取。定期清理Cookie在测试套件的开始或结束可以编写脚本清除环境变量pm.environment.unset(auth_cookie)或清除Cookie Jarpm.cookies.clear()避免测试数据污染。封装通用函数如果你有多个项目或集合可以将捕获和应用Cookie的脚本写成通用的代码片段保存在Postman的“Snippets”中方便复用。6. 完整脚本示例与集合运行实战让我们整合前面的知识构建一个可运行的完整示例并通过Postman的集合运行器来执行整个测试流。6.1 完整的登录接口Tests脚本增强版这个脚本增加了更健壮的Cookie解析和错误处理。// 增强版登录接口Tests脚本 pm.test(Status code is 200, function () { pm.response.to.have.status(200); }); // 尝试从JSON body中获取业务状态码根据实际API设计调整 var jsonData; try { jsonData pm.response.json(); pm.test(Login successful, function () { pm.expect(jsonData.code).to.eql(0); // 或 pm.expect(jsonData.success).to.be.true; }); } catch (e) { console.log(Response is not JSON or parsing failed:, e.message); } // 捕获并处理Cookie var cookieHeaders pm.response.headers.getAll(Set-Cookie); console.log(Found Set-Cookie headers:, cookieHeaders); if (cookieHeaders cookieHeaders.length 0) { var cookiesToStore []; for (var i 0; i cookieHeaders.length; i) { var header cookieHeaders[i]; // 提取每个Cookie的主要键值对第一个分号前 var keyValuePart header.split(;)[0].trim(); if (keyValuePart) { cookiesToStore.push(keyValuePart); } } if (cookiesToStore.length 0) { var combinedCookie cookiesToStore.join(; ); pm.environment.set(auth_cookie, combinedCookie); console.log(Combined and stored cookie:, combinedCookie); // 可选同时解析出重要的Cookie单独存储方便其他用途 // 例如解析sessionId for (var pair of cookiesToStore) { if (pair.startsWith(sessionId)) { pm.environment.set(session_id, pair.split()[1]); break; } } } else { console.warn(No valid key-value pairs found in Set-Cookie headers.); } } else { // 如果没有Cookie检查是否是Token方案如Bearer Token if (jsonData jsonData.data jsonData.data.token) { pm.environment.set(access_token, jsonData.data.token); console.log(Stored access token.); // 注意Token通常放在Authorization头不是Cookie头。后续接口的Pre-request Script需要相应调整。 } else { console.error(No authentication credentials (Cookie or Token) found in response.); } }6.2 完整的集合级Pre-request Script智能版这个脚本会智能判断只为需要认证的接口添加Cookie。// 集合级Pre-request Script (智能版) // 假设我们为需要认证的接口的URL路径定义一个特征例如包含 /api/private/ 或 /admin/ var requestUrl pm.request.url.toString(); // 定义一个函数判断是否需要认证根据你的项目规则调整 function requiresAuth(url) { // 规则1排除登录接口本身 if (url.includes(/api/login)) { return false; } // 规则2特定路径需要认证 var authPaths [/api/private/, /api/user/, /api/admin/, /api/order/]; // 示例路径 for (var path of authPaths) { if (url.includes(path)) { return true; } } // 规则3可以根据请求方法判断如所有POST/PUT/DELETE需要认证 // if (pm.request.method ! GET) { return true; } return false; } if (requiresAuth(requestUrl)) { var authCookie pm.environment.get(auth_cookie); if (authCookie) { pm.request.headers.upsert({ key: Cookie, value: authCookie }); console.log([集合脚本] 为请求 ${pm.request.method} ${pm.request.url.getPath()} 添加Cookie头); } else { console.warn([集合脚本] 请求 ${pm.request.method} ${pm.request.url.getPath()} 需要认证但 auth_cookie 为空。); // 可以在这里让测试提前失败 // throw new Error(Authentication required but no cookie found. Please run login first.); } } else { // 对于不需要认证的请求确保没有残留的Cookie头避免干扰 pm.request.headers.remove(Cookie); console.log([集合脚本] 请求 ${pm.request.method} ${pm.request.url.getPath()} 为公开接口已清理Cookie头); }6.3 使用集合运行器进行自动化测试脚本写好后真正的威力在于自动化执行。打开Postman进入你的“用户业务流测试”集合。点击顶部的“Runner”按钮打开集合运行器。在左侧勾选你的集合以及需要运行的接口通常全选。在右侧选择对应的环境如“My_API_Test_Env”。设置迭代次数如1次和延迟。点击“Run XXX Collection”按钮。集合运行器会按照顺序执行集合内的请求。你会看到首先执行“登录接口”其Tests脚本会捕获Cookie并存入环境变量。接着执行“获取用户信息”等接口集合级的Pre-request Script会检测到这是需要认证的接口并从环境变量中读取Cookie自动添加到请求头中。所有请求的结果状态码、测试结果会清晰地展示在运行结果页面。如果中间任何一步出错比如登录失败导致Cookie为空后续的认证接口很可能会失败从而在测试结果中明确标识出问题链路这正是自动化测试的价值所在。6.4 维护与扩展随着项目迭代接口可能变化。你需要定期检查登录接口响应格式Cookie的名称或位置是否改变。认证规则集合级脚本中的requiresAuth函数规则是否需要更新。环境变量确保测试账号有效环境配置如base_url正确。你可以将这个模式扩展到更复杂的场景比如处理OAuth 2.0令牌、处理CSRF Token通常也需要从Cookie或响应体中提取并放到后续请求的Header或Body中。其核心思想不变通过脚本桥接请求之间的依赖关系将手动操作自动化。掌握了自动携带Cookie的技术你的Postman接口测试就突破了单点验证的局限迈向了业务流程自动化测试的新阶段。从用户登录、浏览商品、加入购物车到下单支付这一整套流程都可以在一个集合运行中一气呵成极大地提升了回归测试的效率和可靠性。下次当你需要测试一整个用户旅程时别忘了先把这个“通行证”自动化的脚本准备好。