在接口测试领域,高效的自动化工具能显著提升测试效率、降低重复劳动成本。Postman 作为一款可视化接口测试工具,凭借其易用性和强大功能成为开发者与测试人员的首选;而 Newman 作为 Postman 的命令行运行工具,完美弥补了 Postman 图形界面在批量执行、持续集成等场景下的不足。本文将从基础概念入手,逐步讲解如何使用 Postman 编写接口测试脚本,并通过 Newman 实现自动化运行与报告生成,同时附带详细示例代码与拓展知识,帮助读者快速掌握这套主流的接口自动化测试方案。
一、核心概念梳理:Postman 与 Newman 是什么?
1.1 接口测试的核心价值
接口是系统间数据交互的桥梁,接口测试的核心目标是验证接口是否符合需求定义(如请求参数、响应格式、业务逻辑等),提前发现数据传输、权限控制、异常处理等方面的问题。相较于UI测试,接口测试更底层、更稳定,且执行效率更高,是自动化测试体系中的重要组成部分。
1.2 Postman 核心作用
Postman 是一款支持HTTP/HTTPS、REST、SOAP等多种协议的接口测试工具,提供图形化界面,可快速创建请求、设置参数、验证响应。其核心优势包括:
-
可视化操作,上手成本低,无需编写代码即可完成基础接口测试;
-
支持环境变量、全局变量管理,适配多环境(开发、测试、生产)测试场景;
-
内置Tests脚本编辑器,可通过JavaScript编写断言,实现接口自动化验证;
-
支持集合(Collection)管理,可将多个接口按业务模块归类,便于批量执行;
-
支持数据驱动测试,可导入CSV/JSON数据文件实现多组参数测试。
1.3 Newman 核心作用
Newman 是 Postman 的命令行运行器,基于Node.js开发,可直接运行Postman导出的Collection文件。其核心价值在于:
-
脱离图形界面,支持批量、定时执行接口测试脚本;
-
可生成HTML、JSON、XML等多种格式的测试报告,清晰展示测试结果;
-
支持与Jenkins、GitLab CI等持续集成工具集成,实现测试流程自动化;
-
支持命令行参数配置,灵活适配不同测试场景。
二、前置准备:环境搭建步骤
2.1 Postman 安装
-
访问 Postman 官方网站(https://www.postman.com/),根据操作系统(Windows/macOS/Linux)下载对应版本的安装包;
-
双击安装包,按照引导完成安装(Windows系统需注意选择"添加到PATH"选项,便于后续命令行调用);
-
打开 Postman,可选择注册账号(便于同步Collection)或直接使用"Skip signing in"跳过登录,进入主界面。
2.2 Newman 安装
Newman 基于Node.js,需先安装Node.js环境:
-
安装 Node.js:访问 Node.js 官方网站(https://nodejs.org/),下载LTS版本(长期支持版),安装过程中默认勾选"Add to PATH";
-
验证 Node.js 安装:打开命令行工具(Windows:CMD/PowerShell;macOS/Linux:Terminal),输入以下命令,若显示版本号则说明安装成功:
node -v npm -v -
安装 Newman:在命令行中输入以下命令,全局安装Newman:
npm install -g newman -
验证 Newman 安装:输入以下命令,显示版本号则安装成功:
newman -v -
安装 Newman 报告插件(可选,用于生成HTML报告):
npm install -g newman-reporter-html
三、Postman 自动化脚本编写:从单接口到集合
本节以"用户管理系统"的3个核心接口(用户列表查询、用户创建、用户删除)为例,讲解Postman脚本的编写流程,包括请求配置、断言编写、环境变量设置、数据驱动配置。
3.1 基础配置:环境变量与全局变量
多环境测试时(如开发环境、测试环境),接口基础URL、请求头参数等可能不同,通过环境变量可统一管理,避免重复修改。
-
创建环境变量:
点击 Postman 主界面左侧"Environments"→"+"新建环境,命名为"用户管理系统-测试环境";
-
添加环境变量:
变量名:
baseUrl,变量值:http://localhost:8080/api(替换为实际接口基础URL); -
变量名:
token,变量值:空(后续通过登录接口获取后自动赋值); -
点击"Save"保存,在顶部环境选择框中切换到该环境。
-
创建全局变量(可选,用于全局共享的参数):
点击"Environments"→"Globals"→"Edit",添加全局变量,如
timeout,值为5000(请求超时时间)。
3.2 单接口测试脚本编写:以"用户列表查询"为例
假设"用户列表查询"接口信息:
-
请求方式:GET
-
请求URL:{{baseUrl}}/users({{baseUrl}}为环境变量)
-
请求头:Authorization: Bearer {{token}}(需要登录认证)
-
查询参数:page=1,size=10(分页参数)
-
响应格式:JSON,包含code(状态码)、message(提示信息)、data(用户列表数据)
-
创建Collection:点击左侧"Collections"→"+",命名为"用户管理系统接口测试",点击"Create"。
-
添加请求:右键Collection→"Add Request",命名为"查询用户列表"。
-
配置请求信息:
请求方式:选择"GET";
-
请求URL:输入
{``{baseUrl}}/users; -
请求头:点击"Headers",添加键值对:
Authorization→Bearer {``{token}}; -
查询参数:点击"Params",添加参数page=1、size=10。
-
编写断言脚本(Tests标签):
断言用于验证接口响应是否符合预期,Postman的Tests脚本基于JavaScript,内置多种常用断言方法,可直接选择使用。针对本接口,编写以下断言:`// 1. 验证响应状态码为200(请求成功)
pm.test("响应状态码为200", function () {
pm.response.to.have.status(200);
});
// 2. 验证响应时间小于5000ms(全局变量timeout的值)
pm.test("响应时间小于" + pm.globals.get("timeout") + "ms", function () {
pm.response.to.have.responseTime.lt(pm.globals.get("timeout"));
});
// 3. 验证响应格式为JSON
pm.test("响应格式为JSON", function () {
pm.response.to.be.json;
});
// 4. 验证响应体中code字段为0(业务成功状态码)
pm.test("业务状态码为0", function () {
var jsonData = pm.response.json(); // 解析响应体为JSON对象
pm.expect(jsonData.code).to.eql(0);
});
// 5. 验证响应体中包含data字段,且data为数组
pm.test("响应体包含data数组", function () {
var jsonData = pm.response.json();
pm.expect(jsonData).to.have.property("data");
pm.expect(jsonData.data).to.be.an("array");
});
// 6. 验证data数组长度小于等于10(与查询参数size一致)
pm.test("data数组长度≤10", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.data.length).to.be.lte(10);
});`
- 执行并验证:点击"Send"发送请求,查看"Response"区域的响应数据,同时查看"Tests"标签下的断言结果(绿色对勾表示断言通过,红色叉号表示失败)。
3.3 接口依赖处理:以"创建用户后删除"为例
实际测试中,接口间可能存在依赖关系(如"删除用户"需先通过"创建用户"获取用户ID),Postman可通过环境变量传递参数。
3.3.1 编写"创建用户"接口脚本
假设"创建用户"接口信息:
-
请求方式:POST
-
请求URL:{{baseUrl}}/users
-
请求头:Authorization: Bearer {{token}},Content-Type: application/json
-
请求体(JSON):{"username":"test_user","password":"123456","email":"test@example.com"}
-
响应体:{"code":0,"message":"创建成功","data":{"id":1001,"username":"test_user"}}
-
右键Collection→"Add Request",命名为"创建用户"。
-
配置请求信息:
请求方式:POST;
-
请求URL:{{baseUrl}}/users;
-
请求头:添加Authorization(Bearer {{token}})、Content-Type(application/json);
-
请求体:点击"Body"→选择"raw"→选择"JSON",输入请求体:
{ "username": "test_user", "password": "123456", "email": "test@example.com" } -
编写断言与参数传递脚本(Tests标签):
`// 1. 基础断言
pm.test("响应状态码为200", function () {
pm.response.to.have.status(200);
});
pm.test("业务状态码为0", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.code).to.eql(0);
});
// 2. 提取创建的用户ID,存入环境变量(供删除接口使用)
pm.test("提取用户ID到环境变量", function () {
var jsonData = pm.response.json();
var userId = jsonData.data.id;
pm.environment.set("userId", userId); // 存入环境变量userId
console.log("创建的用户ID:" + userId); // 控制台打印,便于调试
});`
3.3.2 编写"删除用户"接口脚本
假设"删除用户"接口信息:
-
请求方式:DELETE
-
请求URL:{{baseUrl}}/users/{{userId}}({{userId}}为创建用户时存入的环境变量)
-
请求头:Authorization: Bearer {{token}}
-
响应体:{"code":0,"message":"删除成功"}
-
右键Collection→"Add Request",命名为"删除用户"。
-
配置请求信息:
请求方式:DELETE;
-
请求URL:{{baseUrl}}/users/{{userId}};
-
请求头:Authorization: Bearer {{token}}。
-
编写断言脚本(Tests标签):
pm.test("响应状态码为200", function () { pm.response.to.have.status(200); }); pm.test("业务状态码为0", function () { var jsonData = pm.response.json(); pm.expect(jsonData.code).to.eql(0); }); pm.test("删除成功提示正确", function () { var jsonData = pm.response.json(); pm.expect(jsonData.message).to.eql("删除成功"); });
3.4 数据驱动测试:多组参数验证
数据驱动测试通过导入外部数据文件(CSV/JSON),实现同一脚本多组参数的批量测试(如验证不同用户名、密码的创建用户场景)。
3.4.1 准备数据文件(CSV)
创建CSV文件(命名为create_user_data.csv),包含多组测试数据,格式如下:
csv
username,password,email,expectedCode,expectedMessage
test_user1,123456,test1@example.com,0,创建成功
test_user2,654321,test2@example.com,0,创建成功
,123456,test3@example.com,1,用户名不能为空
test_user3,,test3@example.com,1,密码不能为空
说明:第一行为表头(与脚本中引用的变量名一致),后续行为测试数据,包含合法数据与异常数据。
3.4.2 修改"创建用户"接口脚本,适配数据驱动
-
修改请求体,将固定参数替换为CSV文件中的变量:
{ "username": "{``{username}}", "password": "{``{password}}", "email": "{``{email}}" } -
修改Tests脚本,适配动态断言(根据CSV中的expectedCode和expectedMessage验证):
`pm.test("响应状态码为200", function () {
pm.response.to.have.status(200);
});
// 动态断言业务状态码和提示信息
pm.test("业务状态码符合预期", function () {
var jsonData = pm.response.json();
var expectedCode = parseInt(pm.iterationData.get("expectedCode")); // 获取CSV中的expectedCode(转为数字)
pm.expect(jsonData.code).to.eql(expectedCode);
});
pm.test("提示信息符合预期", function () {
var jsonData = pm.response.json();
var expectedMessage = pm.iterationData.get("expectedMessage"); // 获取CSV中的expectedMessage
pm.expect(jsonData.message).to.eql(expectedMessage);
});
// 仅当创建成功时,提取用户ID(避免异常场景下提取失败)
pm.test("创建成功时提取用户ID", function () {
var jsonData = pm.response.json();
if (jsonData.code === 0) {
var userId = jsonData.data.id;
pm.environment.set("userId", userId);
console.log("创建的用户ID:" + userId);
}
});`
3.4.3 配置数据文件并执行
-
点击Collection名称→"Run",打开Collection Runner界面;
-
在"Data"区域点击"Select File",选择准备好的create_user_data.csv文件;
-
设置"Iterations"(迭代次数,即测试数据的行数),点击"Run 用户管理系统接口测试",查看批量执行结果。
四、Newman 自动化运行:命令行与报告生成
Postman的Collection编写完成后,可导出为JSON文件,通过Newman在命令行中运行,实现脱离图形界面的自动化测试。
4.1 导出Postman相关文件
-
导出Collection:右键Collection→"Export"→选择"Collection v2.1"(推荐)→保存为"user_management_collection.json";
-
导出环境变量:点击左侧"Environments"→选择创建的环境→"Export"→保存为"test_environment.json";
-
准备数据文件:将3.4.1中的create_user_data.csv文件与上述两个JSON文件放在同一目录下(便于命令行调用)。
4.2 Newman 基础运行命令
打开命令行工具,进入文件所在目录,执行以下基础命令:
shell
newman run user_management_collection.json -e test_environment.json -d create_user_data.csv
命令参数说明:
-
run:指定要运行的Collection文件; -
-e(--environment):指定环境变量文件; -
-d(--data):指定数据驱动文件(CSV/JSON)。
4.3 生成测试报告
通过Newman的报告插件,可生成HTML、JSON等格式的测试报告,其中HTML报告最直观,便于查看详细结果。
4.3.1 生成HTML报告命令
shell
newman run user_management_collection.json -e test_environment.json -d create_user_data.csv -r html --reporter-html-export test_report.html
参数说明:
-
-r(--reporters):指定报告类型(html、json、xml等,多个类型用逗号分隔,如-r html,json); -
--reporter-html-export:指定HTML报告的输出路径和文件名(默认生成在当前目录)。
4.3.2 查看HTML报告
命令执行完成后,在当前目录下会生成test_report.html文件,用浏览器打开即可查看:
-
报告包含测试概览(总用例数、通过数、失败数、通过率);
-
详细的请求与响应信息,以及每个断言的执行结果;
-
测试耗时、环境信息等。
4.4 常用进阶命令
-
设置请求超时时间:
newman run user_management_collection.json -e test_environment.json -d create_user_data.csv --timeout-request 5000--timeout-request 5000:单个请求超时时间为5000ms。 -
静默运行(仅显示最终结果,不显示详细请求过程):
newman run user_management_collection.json -e test_environment.json -d create_user_data.csv -s-s(--silent):静默模式。 -
批量生成多种报告:
newman run user_management_collection.json -e test_environment.json -d create_user_data.csv -r html,json,xml --reporter-html-export html_report.html --reporter-json-export json_report.json --reporter-xml-export xml_report.xml
五、拓展进阶:持续集成与高级技巧
5.1 与Jenkins集成实现持续测试
将Newman脚本集成到Jenkins中,可实现代码提交后自动触发接口测试,及时发现问题。
-
前提:Jenkins服务器已安装Node.js和Newman(步骤同2.2);
-
创建Jenkins任务:
新建"自由风格项目",命名为"用户管理系统接口自动化测试";
-
配置源码管理(若脚本存放在Git仓库):选择"Git",输入仓库地址和 credentials;
-
配置构建步骤:点击"添加构建步骤"→"执行shell"(Linux/macOS)或"执行Windows批处理命令"(Windows),输入Newman运行命令:
cd 脚本所在目录 newman run user_management_collection.json -e test_environment.json -d create_user_data.csv -r html --reporter-html-export test_report.html -
配置构建后操作:点击"添加构建后操作"→"Publish HTML reports",设置HTML目录为脚本所在目录,HTML文件名为test_report.html,点击"保存"。
-
触发构建:点击"立即构建",构建完成后可在Jenkins任务中查看HTML测试报告。
5.2 Postman脚本高级技巧
- 使用Pre-request Script预处理请求:
Pre-request Script在请求发送前执行,可用于生成动态参数(如时间戳、签名)。示例:生成请求签名(假设签名规则为"参数+密钥"的MD5加密):`// Pre-request Script
var timestamp = new Date().getTime(); // 生成时间戳
var secret = "test_secret"; // 密钥
var sign = CryptoJS.MD5("timestamp=" + timestamp + secret).toString(); // 生成签名
// 将时间戳和签名存入环境变量
pm.environment.set("timestamp", timestamp);
pm.environment.set("sign", sign);然后在请求参数中添加timestamp={{timestamp}}和sign={{sign}}`。
- 全局脚本复用:将通用断言(如响应状态码、响应格式)封装为全局脚本,避免重复编写:点击Collection→"Edit"→"Pre-request Scripts"或"Tests",编写全局脚本,该脚本会在Collection下所有请求的对应阶段执行。
5.3 常见问题排查
-
Newman运行时提示"找不到Collection文件":
检查命令行当前目录是否正确;
-
检查文件名是否正确(区分大小写)。
-
接口请求提示"401未授权":
检查token是否有效(可能已过期,需重新获取);
-
检查Authorization请求头格式是否正确(如Bearer后是否有空格)。
-
数据驱动时提示"变量未定义":
检查CSV文件表头是否与脚本中引用的变量名一致;
-
检查数据文件是否正确导入(Newman命令中-d参数是否指定正确)。
六、总结与实践建议
Postman+Newman组合为接口自动化测试提供了"可视化编写-命令行运行-报告生成-持续集成"的完整解决方案,具有上手快、灵活性高、生态完善等优势,适合中小型项目或快速验证场景的接口自动化建设。
实践建议:
-
先梳理接口文档,明确接口的请求参数、响应格式、业务逻辑,再编写测试脚本;
-
优先覆盖核心业务接口(如用户登录、订单创建),再逐步拓展到边缘接口;
-
定期维护测试脚本和数据文件,适配接口变更;
-
结合持续集成工具,将接口测试融入研发流程,实现"早发现、早修复"。
通过本文的实操步骤与示例代码,相信读者已能掌握Postman+Newman自动化脚本的核心用法。在实际应用中,可根据项目需求灵活拓展脚本功能,不断优化测试效率。