软件测试入门到精通-第8&9周-接口测试详解10-postman对post进行接口测试
·
Postman进行POST接口测试实战指南(复杂业务场景篇)
一、环境准备与高级配置
-
环境变量管理
/预请求脚本生成动态参数const randomEmail = `testuser_${Math.floor(Math.random() * 10000)}@deepseek.com`; pm.environment.set("dynamicEmail", randomEmail); pm.environment.set("timestamp", new Date().getTime()); -
全局Header配置
{ "X-Client-ID": "deepseek_prod_v1", "X-Request-ID": "{{$guid}}" }
二、多场景实战案例

案例1:多层嵌套JSON结构+动态签名认证
业务场景:电商订单创建接口(需要签名校验)
POST /api/v1/orders
Headers:
Content-Type: application/json
Authorization: Bearer {{access_token}}
X-Signature: {{signature}}
Body(raw/JSON):
{
"order": {
"items": [
{
"sku_id": "DS_AI_001",
"quantity": 2,
"config": {
"region": "cn-east",
"cluster": "gpu-a100"
}
}
],
"payment": {
"method": "alipay",
"credit_token": "tok_secure_987654"
}
},
"request_id": "{{$guid}}",
"timestamp": "{{timestamp}}"
}
这个 POST 请求是一个典型的 API 调用,用于创建或提交一个订单。下面我将详细解释请求的各个部分:
HTTP 方法与路径
- POST:这是一个 POST 方法,通常用于创建资源或提交数据。
- /api/v1/orders:这是请求的路径,通常指向服务器上的一个特定接口。
/api/v1表示这是第一版本的 API。
请求头(Headers)
- Content-Type: application/json:这个头部字段指明发送到服务器的数据类型是 JSON,这是一种常用的数据交换格式。
- Authorization: Bearer {{access_token}}:这是一个授权头,使用 Bearer 方案。
{{access_token}}是一个占位符,实际使用时需要替换成有效的访问令牌,用于验证请求的发送者拥有对接口的访问权限。 - X-Signature: {{signature}}:这是一个自定义头部,用于传递一个签名值。
{{signature}}是对请求进行签名的结果,用于验证请求的完整性和真实性,防止请求在传输过程中被篡改。
请求体(Body)
请求体是一个 JSON 对象,包含以下字段:
-
order:这是主要的订单信息。
- items:数组,列出了订单中的所有商品。
- sku_id:商品的 SKU(Stock Keeping Unit)标识。
- quantity:商品的数量。
- config:额外的配置信息,例如商品需要在哪个地区的哪个集群中处理。
- region:地区代码。
- cluster:集群标识。
- payment:支付信息。
- method:支付方式,这里使用的是“alipay”。
- credit_token:支付授权令牌,用于处理支付。
- items:数组,列出了订单中的所有商品。
-
request_id:这是一个全局唯一标识符(GUID),为每个请求生成一个唯一的 ID,有助于在日志中追踪请求或处理重复请求。
-
timestamp:请求的时间戳,通常用于日志记录或作为签名的一部分。
使用场景
这种类型的请求通常用于电子商务网站或应用,用户在购买商品时,前端应用会发送这样的请求到后端服务器,后端服务器处理订单逻辑,如库存检查、支付处理等,并返回相应的结果。
总结来说,这个 POST 请求是向服务器发送一个包含具体订单数据的请求,服务器根据这个请求进行处理后,返回相应的响应。请求中包含了必要的安全和身份验证元素,如授权令牌和请求签名。
测试脚本:
// 生成签名(预请求脚本)
const crypto = require('crypto-js');
const secret = pm.environment.get("api_secret");
const payload = pm.request.body.raw;
const signature = crypto.HmacSHA256(payload, secret).toString();
pm.environment.set("signature", signature);
// 响应验证
pm.test("订单创建成功", () => {
pm.response.to.have.status(201);
pm.expect(pm.response.json().order_id).to.match(/ORD_\d{12}/);
pm.expect(pm.response.json().total_amount).to.be.above(0);
// 保存订单ID供后续使用
pm.environment.set("latest_order_id", pm.response.json().order_id);
});
案例2:混合格式文件上传(表单数据+元数据)
业务场景:AI模型训练任务提交接口

POST /api/training/jobs
Headers:
Authorization: Bearer {{access_token}}
Content-Type: multipart/form-data
Body(form-data):
key: config_file type: File
value: train_config.yaml
key: training_data type: File
value: dataset.zip
key: params (text)
value: {
"model_type": "llama-7b",
"hyperparams": {
"epochs": 50,
"batch_size": 64
},
"callback_url": "https://api.deepseek.com/webhook"
}
测试要点:
- 文件字段与JSON元数据混合提交
- 处理10MB+大文件上传
- 进度监控

// 验证异步任务创建
pm.test("任务提交成功", () => {
pm.response.to.have.status(202);
pm.expect(pm.response.headers.get('Location')).to.include('/jobs/');
// 保存任务ID到环境变量
const jobId = pm.response.json().job_id;
pm.environment.set("current_job_id", jobId);
// 初始化轮询计数器
pm.environment.set("polling_attempts", 0);
});
案例3:多步骤事务型操作
场景:支付网关处理(需前置鉴权)
- Step 1 获取支付Token
POST /oauth/token
Headers:
Content-Type: application/x-www-form-urlencoded
Authorization: Basic {{base64(client_id:secret)}}
Body(x-www-form-urlencoded):
grant_type=client_credentials
- Step 2 创建支付请求
POST /v1/payments
Headers:
Content-Type: application/json
Idempotency-Key: {{$guid}}
Body:
{
"amount": 2999,
"currency": "USD",
"payment_method": {
"type": "credit_card",
"card_id": "card_xyz123"
},
"metadata": {
"order_id": "{{latest_order_id}}"
}
}
自动化测试脚本:
// 在Tests标签页处理令牌获取
if (pm.response.code === 200) {
const token = pm.response.json().access_token;
pm.environment.set("payment_token", token);
// 自动执行下一步请求
postman.setNextRequest("创建支付请求");
}

案例4:数据驱动测试(CSV批量测试)
- 创建
test_data.csv:
scenario,payload,expected_code
valid,{"temperature":0.7,"max_tokens":100},200
invalid_params,{"temperature":2.5},400
malformed,{"invalid_field":true},422
- 在Collection Runner中:
// 动态参数处理
const testData = JSON.parse(pm.iterationData.get("payload"));
// 条件断言
pm.test(`Scenario: ${pm.iterationData.get("scenario")}`, () => {
pm.response.to.have.status(parseInt(pm.iterationData.get("expected_code")));
if (pm.response.code === 200) {
pm.expect(pm.response.json().results).to.be.an('array');
}
});

三、高级测试策略
- 依赖链测试:使用
postman.setNextRequest()创建测试流 - 故障注入:在Pre-request中修改正常参数为异常值
- 性能基线测试:通过
pm.response.responseTime记录响应时间 - Schema校验:使用
tv4库进行JSON结构验证 - 敏感数据屏蔽:在测试脚本中过滤响应中的敏感字段
// Schema校验示例
const schema = {
"type": "object",
"required": ["id", "status"],
"properties": {
"id": {"type": "string"},
"status": {"enum": ["pending", "processing", "completed"]}
}
};
pm.test("Schema验证", () => {
pm.expect(tv4.validate(pm.response.json(), schema)).to.be.true;
});

四、最佳实践
- 环境隔离:区分dev/staging/prod环境配置
- 版本控制:将Collection文件纳入Git管理
- 文档同步:使用Postman的文档生成功能
- 监控集成:通过Newman实现CI/CD流水线集成
- 敏感信息管理:使用Variables的Secret类型存储密钥
五、调试技巧
- 使用
console.log()输出调试信息到Postman Console - 通过
pm.request对象动态修改请求参数 - 利用
pm.visualizer()实现自定义响应展示 - 使用
try...catch处理异常脚本 - 通过
pm.cookies管理复杂Cookie场景
// 自定义响应展示
pm.visualizer.set(template => {
return `
<h3>格式化展示:</h3>
<p>状态码:${pm.response.code}</p>
<pre>${JSON.stringify(pm.response.json(), null, 2)}</pre>
`;
});
以上案例涵盖了企业级接口测试中的典型复杂场景,建议配合Postman Collection的版本管理和团队协作功能,构建完整的API测试体系。
更多推荐
所有评论(0)