接口测试工具postman
一、Postman功能简介
Postman是由Postdot Technologies公司打造的一款功能强大的调试HTTP接口的工具。在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果,从而验证响应中的结果数据是否和预期值相匹配;并确保开发人员能够及时处理接口中的bug,进而保证产品上线之后的稳定性和安全性。进入postman官网https://www.postman.com/downloads/
工作原理:
- 在Postman中输入请求地址,并点击
Send
按钮后; - 对应的应用服务器接收到该请求,并且返回对应的响应报文;
- Postman接收到响应报文后,并通过友好的方式进行可视化的显示在界面上。
二、常用接口测试工具以及返回数据
常用的接口测试工具有postman、jmeter
接口返回数据的格式一般有:json、html、xml
1)json格式
一般有三组数据:{"code":200,"message":"请求成功","dataMap":{"..."}}
code:返回的状态码
message:对返回信息或者状态错误的解释说明
dataMap:真正的返回数据
2)html格式
<html> <title></title> <body> <code>200</code> ...... </body> </html>
3)xml格式
<?xml?version="1.0"encoding="utf-8"> <code>200</code> ...... </xml>
三、接口测试协议
接口测试协议
1.webservice协议:
接口地址:http://......?wsdl
2.dubbo协议:
接口地址以dubbo://......
适用于少量数据的传输
3.http协议(90%):
接口地址:http://.....
http端口为: 80
https = http+ssl 安全传输协议 ,端口为443
市面上主要使用HTTP协议进行数据传输,所以我们主要学习这个协议。
什么是http协议?
http是超文本传输协议,主要用于浏览器和服务器之间传输数据,交互有两个部分:请求和响应。
请求: get、post、put、delete
请求部分一般包含的内容:
1、请求行:请求方式、请求地址和协议版本
2、请求头:HTTP协议使用HTTP头来传递请求的元信息。HTTP头是一个用冒号分隔的名称/值对,冒号前面是HTTP头发名称,后面是HTTP的值,例如:
accept:application/json ---客户端可以接收的数据格式
X-Requested-with:XMLHttpRequest --异步请求
user-agent: --客户端的用户
Host:--请求的主机地址
cookie:--cookie信息(请求的)
accept-encoding: gzip, deflate, br--压缩方式
connection: keep-alive ---- 保持长链接
content-type: application/json;charset=UTF-8 --- 客户端发送的数据格式
3、空行: 发送回车符和退行,通知服务器一下不再有请求头;
4、消息体: HTTP请求中带有查询字符串时,如果是GET方法,查询字符或表单数据附加值请求行中,则消息体中就没有内容;如果是POST方法,查询字符串或表单数据及添加在消息体中。
2xx:表示请求发送成功;
3xx:表示资源发生转移,俗称重定向;
4xx: 表示接口的路径找不到,客户端错误;
5xx:表示系统内部异常,一般存在接口缺陷或者请求内容不正确,服务器错误。
四、postman的页面内容
主界面如下:
Params:用于在get请求传参
Authorization:postman自带的鉴权功能
Headers:请求头
Body:post请求传参
-- none:没有参数
-- form-data:既有文件又有键值对
-- x-www-form-urlencoded:只传输键值对
-- raw:JSon、TXT、xml、HTML、javasripts
-- binary:把文件以二进制方式传输
Pre-request Script:接口请求之前的脚本,用js格式写
Tests:断言的代码
响应的功能页面:
Body:响应内容。
--Pretty 是json格式数据
--Raw 是文本格式
--Preview 是网页格式
Cookies:响应的cookies信息
Headers:响应的头部信息
TestResult:断言的结果
五、发送请求与查看相应
1)GET请求
- 选择请求方式为GET,填写接口测试地址URL和输入参数;
- 确认填写无误后,点击Send按钮发送请求,查看response内容;
2)POST请求
选择请求方式为POST,采用以下几种传参方式进行接口测试;
(1)URI 传参
(2)form-data 传参
会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来说明文件类型;content-disposition,用来说明字段的一些信息
问题:
对接接口,发现对方的接口使用form-data进行数据提交,直接使用requests库的data参数对接,会报参数错误:
params = { 'timestamp':timestamp, 'nonce':nonce, 'apikey':APIKEY, 'signature': signature } data = { 'name': name, 'phone': phone, 'idnum': idnum, 'products': [201,] } resp = requests.post(URL, data=data, params=params,verify=False, timeout=10)
执行结果:
解决方案
这一块Requests包做的不是很好,做法具体如下:
一种是手动组建form-data并加上headers;
另一种是通过files参数传递form-datal;
# 方案一: params = { 'timestamp':timestamp, 'nonce':nonce, 'apikey':APIKEY, 'signature': signature } payload = """------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"phone\"\n\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"idnum\"\n\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"products\"\r\n\r\n {}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--""".format(phone, idnum, name, [201,]) headers = { "content-type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" } resp = requests.post(URL, data=payload, params=params, verify=False, timeout=10, headers=headers) # 方案二: import json params = { 'timestamp':timestamp, 'nonce':nonce, 'apikey':APIKEY, 'signature': signature } data = { 'name':(None, name), 'phone': (None, str(phone)), 'idnum': (None, idnum), 'products': (None, json.dumps([201,])) } resp = requests.post(URL, files=data, params=params, verify=False, timeout=10) print resp.status_code print resp.request.url print resp.request.body print resp.text
(3)x-www-form-urlencoded 传参
会将表单内的数据转换为键值对
(4)raw 传参
可以上传任意格式的文本,可以上传text、json、xml、html等
提示:在编辑器中选择文本并按CMD / CTRL + B可以自动美化XML / JSON内容。
(5)binary 传参
只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。
multipart/form-data与x-www-form-urlencoded区别: multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信息; x-www-form-urlencoded:只能上传键值对,并且键值对都是间隔分开的。
六、Cookies 和Code
Postman通过选项卡布局,用于在构建器中发送和管理API请求。上半部分是请求构建器,下半部分是响应查看器。
Cookies——管理cookie模式是通过点击cookie链接访问的。该特性允许你管理与请求相关的cookie。
Code——生成的代码片段模式通过保存按钮下面的最右边的Code链接。该特性允许你生成与请求相关的代码片段,该请求支持20多种语言(http、java、go等语言)
(一)cookie鉴权的原理:
当客户端第一次访问服务器时,服务器就会生成cookie,并且把生成的cookie信息放到响应头的set-cookie字段里面,然后发送给客户端,客户端接收到cookie之后就会保存起来,然后在2-N次请求服务器的时候自动的带上cookie信息实现鉴权。
(二)cookie分类
会话cookie:保存在内存中,当浏览器关闭之后会自动消失
持久化cookie:保存在硬盘中,浏览器关闭后不会消失只有当持久化的时间到期了才会消失。
name:cookie的名称
value:cookie的值
domain:cookie作为的ip地址
path:cookie所在的服务器上面的项目路径
exprise:失效时间
七、环境变量和全局变量
(1)环境变量和全局变量
在企业当中,一般有开发环境、测试环境和线上环境,有一些企业也会有预发布环境,我们在做接口测试的时候会发现,这些环境中接口的地址除了ip地址不一样,其他的地方都是一样的,我们在实际测试中,不可能每个环境都写一套测试逻辑,这个时候就需要使用到环境变量,环境变量为全局变量。
注意:当全局变量和环境变量的名称一致时,环境变量的权限比较大。
将接口地址中的IP地址参数化格式为{{ip}},试着运行一次
(2)postman动态参数
一)postman内置动态参数
{{}}中加"$"代表示动态参数,不加"$"表示是全局变量或者是环境变量
{{$timestamp}} 生成当前的时间戳
{{$randomint}} 生成0-1000的随机数
{{$guid}} 生成随机的guid的字符串
二)自定义动态参数
也可以在Pre-request Script(发送请求之前)里面定义动态参数
//请求之前 自定义一个时间戳 var now_time = Date.now(); pm.globals.set("now_time",now_time)
八、接口关联
在实际工作中,有一些变量的值是动态变化的,并且下一个接口请求的时候需要传入该参数的值,比如token。
我们需要先在上一个接口的响应中获取token的值,并将该值设置为全局变量,再在下一个接口中使用参数化的形式将该值传入,即可实现了接口的关联。
1、接口关联方法一:json提取器
//把responseBody转为json字符串 var jsvalue = JSON.parse(responseBody); //将jsvalue的值打印到控制台上 console.log(jsvalue) // 提取token的值,并保存到全局变量 pm.globals.set("token", jsvalue.token); 复制代码
2、接口关联方法二:正则表达式提取器
{ "tag":{ "id":100, "name":"张三" } }
假如响应数据的内容如上,我们现在要提取100,则在Tests中使用正则表达式提取的规则为 responseBody.match(new RegExp('"id":(.+?),')),这个方法表示匹配"id":后面且,之前的内容,如果将该结果打印到控制台,为一个数组:[" "id":100,","100"],若只取到100,则需要再加上索引
//通过正则表达式提取 var value = responseBody.match(new RegExp('"timestamp":(.+?),'))[1]; console.log(value );
3、接口关联方法二:cookie提取器
如下图所示,我们需要提取响应结果Cookies中的值,并将结果打印到控制台上。
方法如下:
//提取Cookies中SERVERID中的Value值并保存在cookies_serverid变量中 var cookies_serverid = postman.getResponseCookie('SERVERID').value //将变量cookies_serverid中的值打印到控制台 console.log(cookies_serverid)
4、接口关联方法三:hearder信息提取
//获取响应headers的值,需要从响应头取值 var Content_Type = postman.getResponseHeader('Content-Type'); console.log(Content_Type)
九、调试和日志
Postman控制台类似于浏览器的开发者控制台,不同之处在于它针对API开发进行了调整。如果API或API测试没有按照我们期望的那样进行,那么Postman控制台将是我们进行调试的得力工具。只要Postman控制台窗口处于打开状态,所有的API活动都将记录在此处,我们可以通过这里查看底层发生了什么。
Postman控制台会记录以下信息:
- 发送的实际请求,包括所有底层请求头和变量值等;
- 服务器返回的最原始的响应报文,这里输出的响应报文是没有被Postman处理的响应报文;
- 用于请求的代理配置和证书;
- 测试脚本或预先请求脚本的错误日志;
- 使用console.log()输出的内容。
在脚本中使用consolle.info()或console.warn()将有助于确认执行的代码行。这个使用方法和JavaScript中的console.log()类似
在应用程序菜单中前往View,然后单击“Show Postman Console”或使用键盘快捷键(CMD / CTRL + ALT + C)。每个调用及其标头和有效负载都将记录到Postman控制台。
十、断言
要想完整的实现接口测试,自然是少不了断言的,在postman中,断言的内容写在Tests中,
关于postman语法https://www.cnblogs.com/ldzcy/articles/15736974.html
系统提供了八种断言方式:
八种断言方式:
//1、返回的状态码为200 pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); //2、返回的结果中包含一个指定的字符串 pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.include("string_you_want_to_search"); }); //3、对返回结果做json字段检查 pm.test("Your test name", function () { var jsonData = pm.response.json(); pm.expect(jsonData.value).to.eql(100); }); //4、断言返回的结果等于一个字符串 pm.test("Body is correct", function () { pm.response.to.have.body("response_body_string"); }); //5、断言响应头中包含有指定的响应头 pm.test("Content-Type is present", function () { pm.response.to.have.header("Content-Type"); }); //6、断言接口请求的时间少于200ms pm.test("Response time is less than 200ms", function () { pm.expect(pm.response.responseTime).to.be.below(200); }); //7、断言一个post请求返回的状态码是否在指定的范围之间 pm.test("Successful POST request", function () { pm.expect(pm.response.code).to.be.oneOf([201, 202]); }); //8、断言返回的状态码信息中包含指定的字符串 pm.test("Status code name has string", function () { pm.response.to.have.status("Created"); });
十一、导入和导出
1)Colltions测试数据包导出导入
- 导出
选择要导出的数据包,点击Export;
- 导入
点击Import按钮,选择要导入的文件;
2)工作环境
选择Settings->data,在Export data下点击Download导出工作环境,在Import data下点击选择文件导入工作环境
十二、批量执行测试用例
1)在进行批量运行的时候 ,使用的数据驱动为csv或者是json csv文件的编码必须是utf-8
2)在请求参数里面取数据和取全局变量的方法一直({{变量名称}}),在断言里面取数据文件的值使用:data["变量名称"]
参考:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南