一、Postman基础使用
1.1 简介
-
Postman是一款流行的API测试工具和开发环境,旨在简化API开发过程、测试和文档编制。
-
优势:
- Postman可以快速构建请求,还可以保存以后再使用。
- Postman还可以提供响应结果的比较功能,可以用来写测试用例。使用Postman查看测试结果非常方便,可以自定义一些预期结果,根据Postman给返回的pass或者fail就可以判断测试是否通过。
- Postman还可以把测试用例放在测试集中批量运行,方便各种业务场景的测试和回归。
- Postman中可以通过设置不同的环境变量(生产、测试、灰度等),很方便的使用同一套测试用例。
1.2 应用场景
-
API测试:Postman可以用来快速、简便地测试API接口,通过发送HTTP请求并查看响应数据,来验证接口的功能是否正常。
-
自动化测试:Postman提供了强大的测试脚本功能,可以编写测试脚本来自动化执行接口测试,减少人工测试工作量。
-
性能测试:Postman可以用来执行性能测试,通过模拟大量用户同时访问接口,来评估接口的性能表现。
-
监控和断言:Postman可以设置监控脚本,定期检查接口的可用性和性能,并进行断言,来确保接口符合预期。
-
集成测试:Postman可以用于集成测试,测试多个接口的集成和功能是否正常写作。
-
Mock服务器:Postman可以生成Mock服务器,用于模拟外部服务或组件,帮助开发人员独立进行开发和测试。
-
环境管理:Postman可以管理多个环境,如开发、测试、生产等,便于在不同环境之间切换测试。
-
数据驱动测试:Postman支持通过CSV文件等数据驱动方式进行测试,提高用例覆盖范围和复用性。
1.3 Postman安装
Postman 官方网站:https://www.Postman.com/
1.3.1 页面介绍
-
顶部栏:
- Home:进入登录注册页面
- Workspaces:选择工作区域(会员功能)
- Reports:测试报告(付费功能)
- Explore:探索 Postman 更多功能
- 搜索框:快速检索过滤
- 右侧:系统设置区域
-
左侧栏:
- Collections:测试集
- APIs:创建 API(需要注册)
- Environments:管理环境
- Mock Servers:提供 mock 服务
- Monitors:监视器
- History:历史记录
-
右侧栏:
-
顶部环境信息
- 查看当前使用的环境
- 查看当前环境中的变量
-
请求配置区域
- 在此可以新建一个请求标签,提供各种请求方法(如GET、POST等)、请求参数、请求header、请求执行前的设置项目、测试脚本等的配置功能。
-
METHOD:请求方法
-
URL & Params:URL可以输入 request 的地址,Params是对应URL的参数。
-
在Params中输入参数,会自动同步到URL。
-
同理,URL中输入带有参数的地址,也会自动同步到Params。
-
Send:发送当前请求。在发送请求后,会自动下载该请求的response。
-
Send and Download:在发送请求后,把响应数据保存为本地的文件。
-
Save:可以直接保存request,也可以选择另存为。
-
Save as:可以保存请求的名字以及简单的描述,还可以把请求保存在Collection里面。
-
Authorization:如果访问的服务需要授权,可以在这里设置验证方式+填写验证所需的信息,如用户名、密码。
-
Headers:设置请求头信息。
-
Body:设置请求的body。有form-data、urlencoded、raw以及binary等4种方式。POST中要携带的请求参数可以通过body上传。
- form-data:既可以上传键值对,又可以上传文件。
- x-www-form-urlencoded:会将表单内的数据转换为键值对。
- raw:可以上传任意格式的文本,比如说 Text、 JSON、 XML、HTML 等。
- binary:只可以上传二进制数据,通常用来上传文件。
- form-data:既可以上传键值对,又可以上传文件。
-
Pre-request Script:请求前需要执行的脚本可以放置在这里。主要进行一些环境以及全局变量的设置。
-
Tests:测试用例的断言,会对测试结果进行一些判断。
-
Generate Code:可以将request转化为各种语言的代码。比如Python、JAVA、shell、HTTP等。
-
- 在此可以新建一个请求标签,提供各种请求方法(如GET、POST等)、请求参数、请求header、请求执行前的设置项目、测试脚本等的配置功能。
-
响应查看区域
-
1.3.2 Postman基本使用
1. 发送GET请求
- 演练地址:https://httpbin.ceshiren.com/
- 进入 Postman 软件界面
- 选择
GET
请求方式 - 在 URL 处填写
https://httpbin.ceshiren.com/get
- 点击
Header
,key 值填写accept
,value 填写application/JSON
- 点击
send
按钮,查看返回内容
2.发送POST请求
- 请求方式:
POST
- 请求 URL:https://httpbin.ceshiren.com/post
- 请求参数
- FORM 格式:
Body
→form-data
- JSON 格式:
Body
→raw
→JSON
- 文件格式:
Body
→form-data
→File
- FORM 格式:
添加 FORM 格式请求参数
- 进入 Postman 软件界面
- 选择
POST
请求方式 - 在
URL
处填写https://httpbin.ceshiren.com/post
- 选择
Body--form data
,key 值填写form_key1
,value 填写form_value1
- 点击
send
按钮,查看返回内容
添加 JSON 格式请求参数
- 选择
Body
–raw
- 添加
JSON
内容
添加 JSON 内容
{"json_key1":"json_value1","json_key2":"json_value2"}
添加文件格式请求参数
在练习时可以现在左面创建一个文件,在文件内容随意输入内容
- 选择
Body
–form data
- key 中输入
file
- 在出现的选择菜单中选择
创建的文件
- 导入要上传的文件
- 点击
send
,查看结果"form
"-取得文件中的内容
1.3.3 接口响应
- 状态行:接口响应的第一行是状态行,一般包含了
http
协议的 版本、响应状态码、状态解释语句 - 响应头:包含响应头信息的
key
和value
- 响应报文:服务端返回给客户端的文本消息、业务数据等等
BODY
有三种查看方式: Pretty
、 Raw
、 Preview
。
-
Pretty 会根据选择的类型对
Body
进行高亮显示,同时可以选择要不要自动换行,方便阅读。比如之前请求测试人社区首页的时候,返回的响应是HTML
,那pretty
中显示的HTML
内容就是语法高亮和美观的格式。后面响应是JSON
格式的时候也是同样。一般来说直接默认查看pretty
中的响应结果就可以。 - Raw 不会进行任何高亮显示。
-
Preview 显示的是
Body
部分的预览效果。 - Visualize 最后的这个是新功能,可以结合脚本把响应进行图形化的显示。
COOKIES
服务器返回的 cookie
信息都提取出来展示在了这个专门的 tab
当中,可以从这里进行查看。
HEADERS
以 key-value
对的方式展示响应的 header
头信息。鼠标停留在 key
上,会显示该 key
的说明。
TESTS
如果在发送请求的时候,在 Tests
中写了断言的脚本,那么在请求成功之后,就会在响应的 Tests
中展示对应的测试结果。
STATUS
展示响应状态码以及对应的状态说明。这个响应状态码和状态说明信息其实就是接口响应第一行中的内容。
在 Status
的后面就可以直接查看到本次请求的状态码,现在请求是成功的,所以显示 200 ok
。
TIME
可以查看服务端响应所花费的时间。
SIZE
数据是响应数据的大小。
Postman 将响应大小分解为 body
和 headers
。响应大小是近似值。
SAVE RESPONSE
最后面还提供了下载响应 body
的功能,可以直接把响应数据另存为一个文件,方便后续处理。
HTTP 头信息
- 添加请求头
- 修改请求头
添加请求头信息
下面给测试环境中的 get
请求手动添加一个头信息:
添加 My-Header
这个参数
-
My-Header
:Harry
- 点击
send
,查看响应中header
部分的内容。
修改请求头信息
除了添加之外,也可以修改头信息的值。比如想把 User-Agent
的值修改为 hogwarts
可以把默认的头信息勾选掉,然后重新定义自己的 key
-
User-Agent
:hogwarts
- 点击
send
,查看响应中的内容
二、实战练习
2.1 宠物商店接口文档分析
接口文档:https://petstore.swagger.io,这是宠物商店接口的 swagger 文档。
2.1.1 什么是 swagger
-
Swagger 是一个用于生成、描述和调用 RESTful 接口的 WEB 服务。
-
通俗的来讲,Swagger 就是将项目中所有想要暴露的接口展现在页面上,并且可以进行接口调用和测试的服务。
-
现在大部分的项目都使用了 swagger,因为这样后端开发就不需要专门为接口使用者编写接口文档。
-
当接口更新之后,只需要修改代码中的 Swagger 描述就可以实时生成新的接口文档,这样就可以避免接口文档老旧不能使用的问题。
-
而且通过 Swagger 页面,可以直接进行接口调用,降低了项目开发阶段的调试成本。
2.1.2 分析查询接口
接口的 swagger 文档怎么看。
2.1.3 调试宠物
怎么在页面上调试接口?
以查询宠物接口举例:
- 点击
Try it out
- 请求参数
status
选择available
- 点击
Execute
发出请求 - 下方展示当前请求的
Curl
命令 - 下方展示当前请求的完整
URL
- 下方展示响应状态码和对应的响应体
- 有了 swagger,就可以非常方便的获取到接口的信息,从而设计测试用例
2.2 接口测试用例设计
- 宠物的 增、删、改、查 冒烟测试用例
查询宠物
新增宠物
更新宠物信息
删除宠物
2.3 编写断言
Tests 主要用来做断言,比如要测试返回结果是否含有某一字符串,就可以用到 Tests。
- 断言,就是结果和预期对比
- 如果一致,则用例通过,返回
PASS
- 如果不一致,断言失败,用例失败,失败返回
FAIL
test 中可以使用 JavaScript
脚本来进行断言的编写。如果本身不熟悉 JS
语法的话也没有关系,Postman 当中已经预置好了常用的断言。
- 验证响应状态码Status Code:Code is 200
pm.test("响应状态码为 200", function () {
pm.response.to.have.status(200);
});
status
方法中传入的值 200
就是预期结果,可以把括号中的状态码改为任意需要的值,比如 400
。
- 检查响应体中是否包含某个字符串Response Body:contains string
pm.test("响应体中包含预期的字符串", function () {
pm.expect(pm.response.text()).to.include("doggie");
});
- 检测 JSON 中的某个值是否等于预期的值Response Body:JSON value check
pm.test("宠物名称为 doggie", function () {
var jsonData = pm.response.json();
pm.expect(jsonData[0].name).to.eql("doggie");
});
var jsonData
是定义了一个变量,然后把响应数据经过 JSON
格式化之后,赋值给了定义好的变量。然后用 expect
这个方法,把响应数据中的 url
这个 key
中的值提取出来,用 eql
这个方法去和括号中的字符串做比较,如果这两个值是一致的,返回 true
,如果不一致就返回 false
。
- 验证响应体是否与某个字符串完全相同Response Body:Is equal to a string
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
这是一个全量的断言,把响应的数据和一个确定的字符串去做比较,如果完全相同返回 true
,不完全相同返回 false
。
- 验证响应头信息中的 Content-Type 是否存在Response Body:Content-Type header check
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
这个断言可以用来测试响应的头信息中是否包含某个字段,Content-type
可以换位其他的字段
- 验证响应时间是否小于某个值Response time is less than 200ms
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
可以用来判断响应的时间是否超过了某一个值,预设的是 200ms
,如果没有超过返回 true
,超过预设的值返回 false
2.4 Postman 完成接口测试
- 创建测试集
- 编写断言
- 运行测试集
- 查看测试结果
2.4.1 创建测试集
- 选择左侧边栏的
Collecions
,点击+
进入新建collection
界面,命名为【宠物商店】
- 现在的这四个接口是对宠物的操作,所以可以在
collection
中再创建一层文件夹,点击Add folder
,命名为【宠物】
2.4.2 查询宠物接口
- 命名:查询宠物
- 请求方法:保持 GET 不变
- 请求 URL:https://petstore.swagger.io/v2/pet/findByStatus
- 请求参数:GET 请求参数要在 Params 中设置,status=available
2.4.3 新增宠物接口
- 命名:新增宠物
- 请求方法:换为 POST
- 请求 URL:https://petstore.swagger.io/v2/pet
- 请求参数:POST 请求的参数需要放在 body – raw 中,这里的请求参数格式为
JSON
注意: id
具有唯一性需要进行修改
{
"id": 9223372000001083222,
"category": {
"id": 1,
"name": "cat"
},
"name": "miao",
"photoUrls": [
"string"
],
"tags": [
{
"id": 5,
"name": "cute"
}
],
"status": "available"
}
- 完成断言的编写
pm.test("响应状态码为 200", function () {
pm.response.to.have.status(200);
});
pm.test("响应体正确", function () {
pm.response.to.have.body("{\"id\":9223372000001083222,\"category\":{\"id\":1,\"name\":\"cat\"},\"name\":\"miao\",\"photoUrls\":[\"string\"],\"tags\":[{\"id\":5,\"name\":\"cute\"}],\"status\":\"available\"}");
});
2.4.4 更新宠物接口
- 命名:更新宠物信息
- 请求方法:换为 PUT
- 请求 URL:https://petstore.swagger.io/v2/pet
- 请求参数:POST 请求的参数需要放在 body – raw 中,这里的请求参数格式为
JSON
比如修改宠物姓名:
{
"id": 9223372000001083333,
"category": {
"id": 1,
"name": "cat"
},
"name": "小黑",
"photoUrls": [
"string"
],
"tags": [
{
"id": 5,
"name": "cute"
}
],
"status": "available"
}
- 添加断言
pm.test("响应状态码为 200", function () {
pm.response.to.have.status(200);
});
pm.test("响应体正确", function () {
pm.response.to.have.body("{\"id\":9223372000001083333,\"category\":{\"id\":1,\"name\":\"cat\"},\"name\":\"小黑\",\"photoUrls\":[\"string\"],\"tags\":[{\"id\":5,\"name\":\"cute\"}],\"status\":\"available\"}");
});
2.4.5 删除宠物接口
- 命名:删除宠物
- 请求方法:换为 DELETE
- 请求 URL:https://petstore.swagger.io/v2/pet
- 请求参数:宠物
id
,直接跟在URL
中
https://petstore.swagger.io/v2/pet/9223372000001083333
- 添加断言 这里重点断言业务错误码
code
和message
这两个字段的值就可以。
pm.test("响应状态码为 200", function () {
pm.response.to.have.status(200);
});
pm.test("业务错误码为 200", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.code).to.eql(200);
});
pm.test("message 为删除的宠物 id", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.message).to.eql("9223372000001083222");
});
2.4.6 运行测试集
对于 collection
来说,每一级的目录都可以单独运行。比如现在只想要运行宠物操作相关用例,那么就可以点击宠物,进入宠物 folder
页面。
-
点击
Run
按钮进入collection
执行页面 -
可以选择要执行的
collection
,选择环境变量、选择执行次数、选择延迟时间,选择测试数据(做数据驱动) -
点击
Run
按钮即可开始执行
2.4.7 查看测试结果
运行完毕后会进入测试结果页面,就可以查看测试结果了
2.4.8 变量
-
Data
:在测试集中上传的数据 -
Environment
:环境范围 -
Collection
:集合范围 -
Global
:全局范围 -
Local
:在脚本中设置的变量
变量定义
Postman 的变量主要用于参数化和关联,常用变量可以按使用范围设置。
Local
Local 级别的变量其实就是在脚本中定义的变量,比如删除宠物信息用例中,断言里使用了检验 JSON
格式中某个 key
的值
这里面的 jsonData
就是一个 Local 级别的变量。它只在这条断言中生效。
Global
如果是大部分的接口都会用到的变量,可以设置为全局变量,这样的话 Postman 中的所有接口都可以直接调用。
点击左侧的 Environments
,点击 Globals
进入全局变量设置界面。
在这里可以设置变量
-
VARIAVLE
: 变量名 -
INITIAL VALUE
: 共享初始值, 用于团队共享时供别人使用的默认值 -
CURRENT VALUE
: 当前值, 自己当前使用的变量值 (一般我们只用设置这个值即可) -
Perisit All
: 保持所有, 将当前自己使用的值 (CURRENT VALUE) 替换所有的初始值 -
Reset All
: 重置所有, 将当前所有的 CURRENT VALUE 重置为与当前初始值一样
这里我们设置一个全局变量名为 status
,INITIAL VALUE
设置为 available
,然后点击 sava
保存设置
现在一个全局变量已经设置好了。
在 Postman 中的使用为 {{ 变量名 }}
,当 Postman
解析变量时,字符串 {{ 变量名 }}
会被替换为相应的值。
比如进入查询宠物接口,这时候就可以把 status
的值替换为全局变量。
除了手动设置之外,还可以通过脚本的方式设置。
一般设置变量会在请求之前,可以在 Pre-request Script
当中来完成。
Postman 已经给我封装好了现成的设置和获取全局变量的脚本,可以直接使用。
- 进入查询宠物接口
- 在
Pre-request Script
当中点击Set a global variable
pm.globals.set("status", "sold");
这样设置就相当于在请求之前,先把全局变量 status
的值设置为了 sold
,所以请求的结果也是返回的 sold
状态的宠物信息。
现在再看下 Globals
当中,status
现在的值
这就说明请求前使用脚本设置全局变量是成功的。
那如果需要在脚本当中获取全局变量的值应该怎么办
比如现在要在脚本中获取 status
这个全局变量的值,并且打印在控制台。
var status = pm.globals.get("status");
console.log(status)
点击 Postman 下方的 Console
按钮,就可以打开 Postman 中的控制台,这里就可以看到所有的 log
日志
Collection
如果是某一个测试集中的接口会用到的变量,可以设置为测试集变量。
比如点击 Collections
中的宠物商店,可以看到在测试集当中也可以设置鉴权方式,请求前脚本,测试脚本和变量。
点击 Variables
,就可以设置对应的测试集变量。
注意,宠物商店的下一级,宠物 folder
只可以设置鉴权方式和脚本,变量是不可以设置的。
回到宠物商店的变量设置页面。
前面的宠物操作都涉及到了宠物 id
的值,可以把宠物 id
设置为测试集变量。
设置好之后,新增宠物、更新宠物和删除宠物接口中的宠物 id
就都可以引用这个测试集变量。
- 新增宠物
对应的断言也得做修改
首先要先获取到这个测试集变量,然后再把变量值拼接到预期结果当中就可以了。
var petId = pm.collectionVariables.get("petId");
pm.test("响应体正确", function () {
pm.response.to.have.body("{\"id\":" + petId + ",\"category\":{\"id\":1,\"name\":\"cat\"},\"name\":\"miao\",\"photoUrls\":[\"string\"],\"tags\":[{\"id\":5,\"name\":\"cute\"}],\"status\":\"available\"}");
});
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("{\"id\":" + petId + ",\"category\":{\"id\":1,\"name\":\"cat\"},\"name\":\"miao\",\"photoUrls\":[\"string\"],\"tags\":[{\"id\":5,\"name\":\"cute\"}],\"status\":\"available\"}");
});
- 更新宠物信息接口
修改断言,思路和新增宠物的一致。
var petId = pm.collectionVariables.get("petId");
pm.test("响应状态码为 200", function () {
pm.response.to.have.status(200);
});
pm.test("响应体正确", function () {
pm.response.to.have.body("{\"id\":" + petId + ",\"category\":{\"id\":1,\"name\":\"cat\"},\"name\":\"小黑\",\"photoUrls\":[\"string\"],\"tags\":[{\"id\":5,\"name\":\"cute\"}],\"status\":\"available\"}");
});
- 删除宠物
修改断言
var petId = pm.collectionVariables.get("petId");
pm.test("message 为删除的宠物 id", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.message).to.eql(petId);
});
Enviroment
怎么设置和使用环境变量。
环境变量一般来说是用来切换不同测试环的境。
比如一套接口要在不同的环境上测试时, 可以新建两个环境,比如 test
环境和 stage
环境, 两个环境中添加 base_url
变量并设置不同的值, 请求中接口的url中使用 {{ base_url }}
, 这样只需在 Postman 中切换环境就可以测试不同的环境。
现在先创建一个 test
环境。
左侧边栏点击 Environments
,点击 +
进入创建新环境的界面。
- 命名:测试环境
- 变量名:baseURL
- 初始值:https://petstore.swagger.io/v2
选择测试环境
然后四个接口就可以修改一下 url
的设置了。
- 查询宠物:{{ baseURL }}/pet/findByStatus?status={{ status }}
- 新增宠物:{{ baseURL }}/pet
- 更新宠物:{{ baseURL }}/pet
- 删除宠物:{{ baseURL }}/pet/{{ petId }}
修改完毕之后,记得保存设置。然后再次运行测试集。
Data
data 级别的就是在测试集中导入数据,通过数据驱动的方式完成测试。
变量的优先级
当变量重名的时候,优先级从高至低为:Data
→ Enviroment
→ Collection
→ Global
→ Local
。