🍕 Postman是一个简单的接口测试工具,被广泛应用于API设计、构建、测试等工作环节,同样适用于API安全测试和管理。
1 常见请求
- 常见请求
- 查询参数接口
- 表单类型接口
- 请求头为
Content-Type: application/x-www-form-urlencoded
的接口地址。
- 在Postman的请求页面中选择Body的x-www-form-urlencoded填写参数内容。
- 上传文件接口
- 请求头为
Content-Type: multipart/form-data
的接口地址。
- 在Postman请求页面中,选择Body的form-data填写参数内容。
- Json类型接口
- 请求头为
Content-Type: application/json
的接口地址。
- Postman请求页面中,选择Body的raw以Json格式填写内容。
2 Postman
- Postman
- 官方下载安装后注册账号,登录使用:https://www.postman.com/downloads/。
- Create new collection:添加用例集,Documentation是用例集描述(非必填项)。
- Add folder:添加模块。
- Add request:添加请求,Headers(请求头)、Body(请求体是Json时候选择raw)。
- Export:导出用例集。
- Import:导入用例集,若已存在同名的用例集,则Import as Copy,即导出一个拷贝份,不建议Replace替换。
- 注意:Postman是按串行方式发送请求,无论执行多少次,后台接收请求也是按顺序来,无法实现并发功能。
- 参考:Postman中文文档、Postman官方文档。
2-1 前置脚本
- 前置脚本
- 即在Pre-request Script中编写的JavaScript脚本,请求发送之前,会先执行该前置脚本。
- 接口测试时该功能非常有用,对于一些复杂场景也支持使用前置脚本处理后再请求接口。
2-2 日志调试
- 日志调试
- 打印日志的JavaScript语句:
console.log("日志内容")
,放在Pre-request Script或Tests中。
- 菜单栏 > View > Show Postman Console,或选Postman,快捷键
Ctrl + Alt + C
按钮打开。
- 界面功能
- Show raw log:查看原始报文。
- All Logs:按日志级别定位错误。
- Show timestamps:查看时间戳。
- Hide network:隐藏请求,只查看输出日志。
2-3 常用断言
- 常用断言
- 借助JavaScript语言进行代码的编写,自动判断预期结果与实际结果是否一致。
- 断言代码写在请求的Tests标签中,请求Response中的Test Results即断言结果。
- 按响应的组成划分,分别是状态行(包括状态码、状态消息)、响应头、响应体。
- 工作原理(由上往下依次执行):请求发送之后,再执行Tests内容。
- Postman界面:组织http请求方法、请求头、请求体、url等。
- Postman内部:分析http请求方法、请求头、请求体、url等。
- 服务器:接收Postman发送过来的请求后,解析http请求,回发http响应。
- Postman内部:执行断言代码,得到断言结果。
- Postman界面:在Test Results中显示断言结果。
(1) 状态行
- 断言状态码:
Status code: code is 200
。
1 2 3 4 5 6 7 8
|
pm.test("Status code is 200", function () { pm.response.to.have.status(200); });
|
- 断言状态消息:
Status code: code name has string
。
1 2 3 4
| pm.test("Status code name has string", function () { pm.response.to.have.status("OK"); });
|
(2) 响应头
- 断言响应头:
Response headers: Content-Type header check
。
1 2 3 4
| pm.test("Content-Type is present", function () { pm.response.to.have.header("Content-Type"); });
|
(3) 响应体
- 断言响应体包含字符串:
Response body: Contains string
。
1 2 3 4
| pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.include("string_you_want_to_search"); });
|
- 断言响应体等于字符串:
Response body: is equal to a string
。
1 2 3 4
| pm.test("Body is correct", function () { pm.response.to.have.body("response_body_string"); });
|
- 断言响应体中某个键名对应的值:
Response body: JSON value check
。
1 2 3 4 5 6
| pm.test("Your test name", function () { var jsonData = pm.response.json(); pm.expect(jsonData.value).to.eql(100); });
|
(4) 响应时间
- 断言响应时间,一般用于性能测试:
Response time is less than 200ms
。
1 2 3 4
| pm.test("Response time is less than 200ms", function () { pm.expect(pm.response.responseTime).to.be.below(200); });
|
2-4 变量设置
- 变量设置
- 作用域
- 作用域范围从大到小为:全局变量 > 集合变量 > 环境变量。
- 在不同范围内申明相同变量时,会优先使用范围最小的变量。
- 环境变量(Environments)
- 全局变量(Globals):Postman中全局生效的变量,全局唯一。
- 特定环境(生产环境、开发环境、测试环境等)下生效的变量,在本环境内唯一。
- 集合变量:针对集合的变量,声明的变量必须基于某个集合,作用域只针对该集合。
- 要使用变量中的值,先在Pre-request Script或Tests中设置该变量,然后获取变量。
- variable_key变量名,variable_value变量值,获取变量使用
{{variable_key}}
。
- 获取变量值的请求参数指的是:URL、Params、Authorization、Headers、Body。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| pm.globals.set("variable_key", "variable_value");
pm.globals.get("variable_key");
pm.environment.set("variable_key", "variable_value");
pm.environment.get("variable_key");
pm.collectionVariables.set("variable_key", "variable_value");
pm.collectionVariables.get("variable_key");
|
(1) 环境变量
(2) 集合变量
3 接口关联
- 接口关联
- 上一个接口的返回数据值,刚好是下一个接口的输入参数,这样两个接口就产生了关联。
- 实现思路:提取上个接口的返回数据值,将其保存到环境变量中,下个接口获取变量值。
- 例如:上个接口返回北京的经纬度坐标,将其保存到环境变量中,下个接口获取经纬度坐标值查询地点。
3-1 返回经纬度
3-2 经纬度查询
4 集合测试
- 集合测试
- Run manually:默认手动运行,可选计划执行(Schedule runs)或集成自动化命令运行(Automate runs via CLI)。
- Iterations:集合运行的迭代次数。
- Delay:每个请求之间的时间间隔。
- Data:用于测试的数据文件,参数化文件。
- Persist responses for a session:保持会话的响应,勾选执行后可查看响应体和响应头。
- Stop run if an error occurs:如果集合中的任意请求在运行时报错,则会停止批量运行。
- Keep variable values:保留运行时使用的变量值。
- Run collection without using stored cookies:在不使用存储cookies的情况下批量运行。
- Save cookies after collection run:批量运行后将使用的cookies保存到cookie管理器中。
4-1 Schedule runs
- Schedule runs
- 允许在预定的时间间隔内自动运行集合中的请求,可以设置运行的时间、频率和持续时间。
- 主要适用于自动化测试和定期运行请求的场景,旨在帮助保持API请求的一致性和稳定性。
4-2 Monitors runs
- Monitors runs
- 主要用于在生产环境中监控和管理API的性能和可用性,定期发送API请求并获取响应时间等指标。
- 监视器还提供了报警通知、实时监控和历史记录等功能,以便及时发现和解决API请求的潜在问题。
- 参数说明
- Run this monitor:时间调度,设置固定时间来执行集合。
- Receive email notifications for run failures and errors:失败和错误发送邮件通知。
- Retry if run fails (This might affect your billing.):如果集合测试运行失败则重试。
- Set request timeout:设置请求超时的时间。
- Set delay between requests:设置请求之间的延迟时间。
- Follow redirects:跟随重定向,勾选则Postman会自动发送新的请求到重定向的URL。
- Enable SSL validation:启用SSL验证,确保请求和响应在传输过程中是加密和安全的。
- Run之后,点击Pause将暂停正在运行的监视器,再点击Resume恢复当前监视器的运行。
4-3 Newman的使用
- Newman的使用
- 集合测试的另一种方式是使用Newman,Postman Newman是一款由Postman开发的命令行工具。
- 使用Newman之前,需要先安装Node.js,然后使用命令
npm install -g newman
安装Newman。
- 在Postman中以Json文件方式导出要测试的集合,以及对应的环境变量,就可以命令运行集合了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| newman run <collection_name> newman run 常用接口.postman_collection.json
newman run <collection_name> -e <environment_name> newman run 常用接口.postman_collection.json -e workspace.postman_globals.json
newman run <collection_name> -n <no.of_iterations> newman run 常用接口.postman_collection.json -n 3
newman run <collection_name> --data <file_name> -n <no.of_iterations> -e <environment_name> newman run 常用接口.postman_collection.json --data data.csv -n 3 -e workspace.postman_globals.json
newman run <collection_name> -d <delay_time> newman run 常用接口.postman_collection.json -d 500
|
5 Mock服务
- Mock服务
- Mock定义
- 一种特殊测试技巧,可以在没有依赖项的情况下进行接口或单元测试。
- Mock服务不是一个真实的服务,而是一个被伪装成真实服务的假服务。
- Mock服务的两种类型
- 私有Mock
- 头像>Settings>API keys>Generate API Key>命名为
x-api-key
>复制生成的密钥。
- 在Postman的Mock servers中,创建Mock服务,配置中勾选Make mock server private。
- Mock服务创建完成后,Collections中生成的请求Headers里添加x-api-key和密钥内容。
- 公有Mock:可以被任何人访问,不需要使用Postman API Key。
- Next > Configuration
- Mock Server Name:Mock服务名称。
- Environment:选择已有环境,或勾选Save…将服务地址保存为一个新环境变量。
- Simulate a fixed network delay:模拟固定的网络延迟,默认No delay selected。
- Make mock server private:设置为私有Mock服务。
5-1 参数内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| { "city":"厦门" }
{ "status":"200", "msg":"success", "infocode":"10000", "lives":[ { "province":"福建", "city":"厦门市", "adcode":"350200", "weather":"晴", "temperature":"7", "winddirection":"东北", "windpower":"4", "humidity":"57", "reporttime":"2022-08-22 08:34:17", "temperature_float":"7.0", "humidity_float":"57.0" } ] }
|
5-2 创建Mock
5-3 Mock请求
6 APIs设计
- 设计开发API
- 创建API > 定义API > 测试API > 部署API > 监控API。
- 定义API:入参、出参、方法、响应的定义(主要)。
- 测试API:测试与自动化(Collections、Automate)。
6-1 创建API
6-2 定义API
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| openapi: '3.0.0'
info: version: '1.0.0' title: 'Sample API' description: 图书信息查询
paths: /books: get: summary: 获取图书信息 operationId: listBooks responses: '200': description: 返回图书信息数组 content: application/json: schema: type: array items: $ref: '#/components/schemas/Book' '500': description: 出现意外错误 content: application/json: schema: $ref: '#/components/schemas/Error'
components: schemas: Book: type: object required: - id - title - author - isbn - price properties: id: type: string description: 图书的唯一标识符 title: type: string description: 图书标题 author: type: string description: 图书作者 isbn: type: string description: 图书ISBN price: type: number format: float description: 图书价格 description: type: string description: 图书简介 Error: type: object required: - message properties: message: description: A human readable error message type: string securitySchemes: ApiKey: type: apiKey in: header name: X-Api-Key
security: - ApiKey: []
|
6-3 测试API
- 测试API
- 由于定义好的API没有设置baseUrl,测试集合没办法直接执行。
- Postman可以直接生成定义好的Flask等代码,下载到本地运行。
- 解压zip后将yourCompany目录名改为books,在当前目录下打开命令窗口。
- 在解压zip的目录下执行环境依赖:
pip install -r requirements.txt
。
- 设置环境变量FLASK_APP,程序主模块名books:
set FLASK_APP=books
。
- 设置环境变量FLASK_ENV,默认production:
set FLASK_ENV=development
。
- 命令窗口执行
flask run
,浏览器打开地址验证:http://127.0.0.1:5000/books。
- 访问成功后,进行本地Mock,将Postman中的baseUrl设置为127.0.0.1:5000。
- 由Postman生成的API Flask代码只有接口相关内容,没有后台数据对应的存储。
- 若测试集合要完全呈现接口功能,需要将生成的API Flask代码改写优化再Mock。