基于Postman的Redfish接口自动化测试实战

基于Postman的Redfish接口自动化测试实战 1. 为什么选择Postman做Redfish接口测试第一次接触Redfish接口测试时我尝试过直接写Python脚本也用过curl命令但发现维护成本太高。直到用Postman做了个完整测试流程才发现这简直是硬件工程师的瑞士军刀。Postman最吸引我的地方在于它能像搭积木一样组织测试步骤还能自动保存认证token、环境变量这些关键信息。Redfish作为服务器硬件管理的RESTful接口标准天生适合用Postman来测试。比如查询服务器资产时传统方式要手动拼接HTTP请求而Postman只需要保存一个GET请求模板下次换个IP就能直接测试新设备。实测下来用Postman做BIOS参数修改的效率比命令行高3倍以上特别是需要反复测试不同启动顺序的场景。对于刚接触Redfish的运维人员Postman的图形界面比代码更友好。我带的实习生上周还在问怎么解析JSON响应这周已经能用Tests脚本自动提取token了。当然老手会更喜欢它的自动化能力——后面我会详细演示如何把零散操作串成完整测试流。2. 环境配置与认证流程2.1 必须关闭的SSL验证陷阱新手最容易卡在第一步证书验证。服务器BMC通常用自签名证书需要在File→Settings→General里关闭SSL certificate verification。这个设置藏在三级菜单里我见过不少同事花了半小时才找到。有个取巧的方法直接在Postman地址栏输入postman://settings能快速跳转到设置页。更稳妥的做法是导入BMC的CA证书。曾经有次测试环境突然报证书错误后来发现是BMC证书过期了。所以我现在会先在Chrome访问BMC界面导出证书后再配置到Postman的Certificates选项里。2.2 会话管理的三个关键点登录接口的Tests脚本值得仔细设计var Token postman.getResponseHeader(X-Auth-Token); pm.globals.set(X-Auth-Token, Token); pm.globals.set(SessionLocation, postman.getResponseHeader(Location));这里我踩过两个坑一是忘记检查响应状态码导致无效token被存入全局变量二是漏存SessionLocation后续操作会报403错误。建议在Tests里加上状态码校验pm.test(Status code is 201, function() { pm.response.to.have.status(201); });3. 构建端到端测试流程3.1 硬件资产信息闭环验证获取系统信息不只是发个GET请求那么简单。完整的资产校验应该包含验证关键字段存在性如SerialNumber检查内存总量是否匹配预期对比PCIe设备列表与采购清单我常用的断言脚本示例var jsonData pm.response.json(); pm.test(Check serial number, function() { pm.expect(jsonData.SerialNumber).to.be.a(string).and.not.empty; }); pm.test(Verify memory size, function() { pm.expect(jsonData.MemorySummary.TotalSystemMemoryGB).to.be.above(64); });3.2 电源控制的安全策略服务器上下电操作需要特别注意生产环境必须先用GracefulShutdown测试脚本要包含状态检查间隔强制重启前确保存储设备已卸载我设计的状态检查流程function checkPowerState(expected) { pm.sendRequest({ url: pm.variables.get(deviceip) /redfish/v1/Systems/1, method: GET, header: { X-Auth-Token: pm.globals.get(X-Auth-Token) } }, function (err, res) { if (res.json().PowerState ! expected) { setTimeout(() checkPowerState(expected), 5000); } }); }4. 用户与网络配置实战4.1 用户管理的ETag陷阱修改用户信息时必须处理ETag这个细节文档里很少强调。完整流程应该是GET获取用户当前ETag在PATCH请求头携带If-Match失败时自动重试获取新ETag我写的自动更新ETag脚本if (pm.response.code 412) { pm.sendRequest({ url: pm.request.url, method: GET, headers: { X-Auth-Token: pm.globals.get(X-Auth-Token) } }, (err, res) { const newETag res.headers.get(ETag); pm.globals.set(ETag, newETag); postman.setNextRequest(pm.info.requestName); }); }4.2 网络配置的原子性操作修改BMC管理地址时遇到过配置不同步的问题。现在我会先获取当前所有网口配置批量更新IPv4和IPv6设置最后验证连通性关键请求体结构{ IPv4Addresses: [{ Address: 192.168.1.100, SubnetMask: 255.255.255.0, Gateway: 192.168.1.1 }], IPv6Addresses: [{ Address: 2001:db8::1, PrefixLength: 64 }] }5. BIOS设置的自动化技巧5.1 启动顺序的智能修改修改BootTypeOrder时要注意不同厂商的实现差异。戴尔服务器要求完整列出所有启动项而惠普只需要修改需要调整的项。我的兼容性处理方案const vendor pm.variables.get(vendor); let body {}; if (vendor Dell) { body { Attributes: { BootTypeOrder0: HardDiskDrive, BootTypeOrder1: DVDROMDrive, BootTypeOrder2: PXE } }; } else { body { Attributes: { BootTypeOrder1: DVDROMDrive } }; }5.2 批量修改BIOS参数通过Redfish可以一次修改多个BIOS设置但要注意参数依赖关系。比如修改虚拟化设置后需要同时调整性能配置。我通常会先GET当前设置用脚本生成差异化的PATCH请求const current pm.response.json(); const modified JSON.parse(JSON.stringify(current)); modified.Attributes[IntelVTForDirectedIO] Enabled; modified.Attributes[ProcTurboMode] Enabled; pm.variables.set(biosSettings, JSON.stringify(modified));6. 集成到CI/CD流水线6.1 Newman的进阶用法用Newman跑自动化测试时建议使用--global-var传入设备IP设置--timeout-request防止卡死配合--reporters html生成可视化报告我的常用命令组合newman run Redfish_Test_Collection.json \ --global-var deviceip192.168.1.100 \ --timeout-request 60000 \ --reporters cli,html \ --reporter-html-export report.html6.2 异常处理的最佳实践在Jenkins pipeline中我增加了这些容错机制测试前ping检查设备在线状态失败时自动收集BMC日志电源操作后强制等待冷却期示例Jenkinsfile片段post { always { archiveArtifacts artifacts: newman/*.html } failure { sshagent([bmc-creds]) { sh ipmitool sel elist bmc_logs.txt } } }7. 性能优化与调试技巧7.1 请求缓存的妙用对于只读操作如资产查询可以启用Postman的缓存功能。在Pre-request Script中添加const cacheKey pm.request.url.toString(); const cached pm.cache.get(cacheKey); if (cached) { pm.request.headers.add({key: If-None-Match, value: cached.etag}); }然后在Tests里更新缓存if (pm.response.code 304) { const cached pm.cache.get(pm.request.url.toString()); pm.test(Using cached data, () {}); } else if (pm.response.code 200) { pm.cache.set(pm.request.url.toString(), { data: pm.response.json(), etag: pm.response.headers.get(ETag) }); }7.2 真实场景的负载测试用Postman模拟并发请求时要注意Redfish接口的限流策略。我的压力测试方案阶梯式增加并发数监控BMC的CPU利用率自动降级机制使用Postman的setNextRequest可以构建复杂场景// 压力测试控制逻辑 if (pm.iterationData.get(concurrent) 10) { postman.setNextRequest(Get_System_Info); pm.iterationData.set(concurrent, pm.iterationData.get(concurrent) 1); }