Postman基础使用与实战

一、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:只可以上传二进制数据,通常用来上传文件。
        • Pre-request Script:请求前需要执行的脚本可以放置在这里。主要进行一些环境以及全局变量的设置。

        • Tests:测试用例的断言,会对测试结果进行一些判断。

        • Generate Code:可以将request转化为各种语言的代码。比如Python、JAVA、shell、HTTP等。

    • 响应查看区域

1.3.2 Postman基本使用

1. 发送GET请求

2.发送POST请求

  • 请求方式:POST
  • 请求 URL:https://httpbin.ceshiren.com/post
  • 请求参数
    • FORM 格式:Bodyform-data
    • JSON 格式:BodyrawJSON
    • 文件格式:Bodyform-dataFile
添加 FORM 格式请求参数
  • 进入 Postman 软件界面
  • 选择 POST 请求方式
  • URL 处填写 https://httpbin.ceshiren.com/post
  • 选择 Body--form data,key 值填写 form_key1,value 填写 form_value1
  • 点击 send 按钮,查看返回内容


添加 JSON 格式请求参数
  • 选择 Bodyraw
  • 添加 JSON 内容
添加 JSON 内容
{"json_key1":"json_value1","json_key2":"json_value2"}


添加文件格式请求参数

在练习时可以现在左面创建一个文件,在文件内容随意输入内容

  • 选择 Bodyform data
  • key 中输入 file
  • 在出现的选择菜单中选择 创建的文件
  • 导入要上传的文件
  • 点击 send,查看结果"form"-取得文件中的内容


1.3.3 接口响应

  • 状态行:接口响应的第一行是状态行,一般包含了 http 协议的 版本、响应状态码、状态解释语句
  • 响应头:包含响应头信息的 keyvalue
  • 响应报文:服务端返回给客户端的文本消息、业务数据等等

BODY

有三种查看方式: PrettyRawPreview

  • 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 将响应大小分解为 bodyheaders。响应大小是近似值。

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 查询宠物接口

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 删除宠物接口

https://petstore.swagger.io/v2/pet/9223372000001083333
  • 添加断言 这里重点断言业务错误码 codemessage 这两个字段的值就可以。
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 重置为与当前初始值一样

这里我们设置一个全局变量名为 statusINITIAL 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,点击 + 进入创建新环境的界面。

选择测试环境

然后四个接口就可以修改一下 url 的设置了。

  • 查询宠物:{{ baseURL }}/pet/findByStatus?status={{ status }}
  • 新增宠物:{{ baseURL }}/pet
  • 更新宠物:{{ baseURL }}/pet
  • 删除宠物:{{ baseURL }}/pet/{{ petId }}

修改完毕之后,记得保存设置。然后再次运行测试集。

Data

data 级别的就是在测试集中导入数据,通过数据驱动的方式完成测试。

变量的优先级

当变量重名的时候,优先级从高至低为:DataEnviromentCollectionGlobalLocal