Postman从入门到精通

img

一、Postman测试前奏

1、Postman 测试什么?

  测试有很多不同的细分类型,从开发人员是否看代码可以分为黑盒测试和白盒测试;从测试的阶段来看有单元测试、集成测试、系统测试等。对于 Postman 来说,他所适合的,是进行API 测试,也是我们在这一篇文章将要分享的。

  Postman 本身是一个 RESTFul Client,在此基础上,加入了对接口测试的支持,为每一个请求引入了断言库,可以很好的完成对接口的测试,因此,我们用它来做接口测试,也只做它最擅长的接口测试。

2、接口测试的意义

  测试不同于开发、产品的阶段,测试所达成的目标是帮助产品确定是否符合用户需求,以及保证产品的质量,属于锦上添花而非雪中送炭的项目。因此,在一整个项目的开发周期过程中,测试往往也是最后被配齐的团队。

  而且,软件开发不仅仅是一个技术的军备竞赛,更是成本管控的项目,我们到底应该做什么样的测试,应当根据产品的类型、产品的阶段、人员的配备、可以调控的资源等来进行控制。

  不同类型的测试所带来的金钱成本和时间成本用一张图来表示就是这样的。

  对于一个开发团队来说,如果你的资源不足以支撑你去花费大量的时间和精力去做单元测试,又担心 UI 测试可能会有一些遗漏,那么投入产出比高的接口测试绝对是最佳选择。

  相比于单元测试,接口测试只需要针对接口进行测试,测试量相对小一些。而相比于 UI 测试,可控性要更高,毕竟返回的接口都是 JSON,更加容易进行测试。

3、搭建实验环境

本文案例将要使用 http://www.httpbin.org/来进行测试。由于直接访问网络有些慢,于是用docker部署了测算环境。部署方法如下所示:

  • 拉取镜像文件kennethreitz/httpbin
[root@localhost ~]# docker pull kennethreitz/httpbin
  • 搭建一个简单的HTTP Request & Response Service服务
#-d是后台运行,--name给容器取了一个名,-p端口映射
[root@localhost ~]# docker run -d --name=myhttpbin -p 8000:80 kennethreitz/httpbin

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                  NAMES
269c8031de6b        kennethreitz/httpbin   "gunicorn -b 0.0.0.0…"   30 seconds ago      Up 29 seconds       0.0.0.0:8000->80/tcp   myhttpbin

  • 测试服务是否部署成功

image-20200229130720334

二、使用 Postman 进行测试

1、创建请求

使用New > Request从Postman启动屏幕中创建新请求,也可以通过单击+按钮打开新标签。

image-20200229182139467

上图执行了最简单的一个GET请求,并没有带参数。

然后,创建一个带参数的请求,如下图所示:

image-20200229182752539

由于请求方法是GET,在参数栏插入参数后,url地址栏会自动将参数添加在url地址中,这也是GET方法相对而言不是那么安全,太容易被人看到敏感信息。

因为在测试过程中,需要判断一个接口输入的参数和返回的参数是否满足需求(期望结果),所以需要给测试加上断言,如图所示在Postman中加断言。

image-20200229183743298

2、Body数据参数

当需要添加或更新结构化数据时,都将需要发送带有请求的正文数据。例如,如果要发送将新客户添加到数据库的请求,则可以在JSON中包含客户详细信息。通常会结合PUT,POST以及PATCH请求方法一起使用。

  • form-data数据

    网站表单通常以形式将数据发送到API multipart/form-data。您可以使用form-data 正文”选项卡在邮递员中复制此内容。表单数据使您可以发送键值对,并指定内容类型。

image-20200229190754163

form-data参数中可以直接添加参数数据,也可以使用附件文件。

  • x-www-form-urlencoded

    URL编码的数据使用与URL参数相同的编码。如果API需要url编码的数据,在请求的“ 正文”标签中选择x-www-form-urlencoded。输入您的键值对以与请求一起发送,postman会在发送前对它们进行编码。

  • raw数据

    可以使用原始身体数据发送可以输入为文本的任何内容。使用原始选项卡,然后使用类型下拉列表指示您的数据格式(Text,JavaScript,JSON,HTML或XML),Postman将启用语法突出显示并将相关标头附加到请求中。

image-20200229191549717

  • binary数据

    使用二进制数据发送无法在Postman编辑器中随请求正文手动输入的信息,例如图像,音频和视频文件(也可以发送文本文件)。

image-20200229191755720

3、headers数据参数

某些API要求您发送特定的标头以及请求,通常会提供有关您正在执行的操作的其他元数据。您可以在“ 标题”选项卡中进行设置。输入您需要的任何键值对,Postman会将其与您的请求一起发送。键入时,Postman会提示您一些常用选项,您可以使用这些选项来自动完成设置Content-Type。

image-20200229192139554

如果请求的参数特别多的话,一条一条的编辑headers中的KEY和VALUE效率太低,于是可以使用BULK Edit,将头信息至此,比如头信息如下:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cache-Control: max-age=0
Cookie: jenkins-timestamper-offset=-28800000; 2a881_lastpos=index; 2a881_ol_offset=98; ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE=YWRtaW46MTU4Mzc1MTU0NTE3OTo2MTI1MzExZGY4OWM5YThiYmNjMzMxYzU3MjY4YzFmYTMzZGFmMzJiNWFjMjVkOWI3MzdmOTg5ZmU3M2VkNzE4; 2a881_lastvisit=1661%091582952510%09%2Findex.php
Host: 192.168.31.55:8000
Proxy-Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36

image-20200229192809868

填充后,格式自动转换成KEY-VALUE形式

image-20200229192916073

4、变量

变量是数据的符号表示,它使您可以访问值,而不必在需要时手动输入它。特别是在多个地方使用相同的值时,这很有用。变量通过抽象一些涉及的细节,使您的请求更加灵活和可读。可变范围适用于Postman中的不同任务:

  • 全局变量使您可以访问集合,请求,测试脚本和环境之间的数据。

    由于全局变量可能会造成混乱,因此,您仅应谨慎使用它们,例如快速测试某些东西或当您的项目处于原型开发初期时。

  • 集合变量可在集合中的整个请求中使用,并且独立于环境,因此请勿根据所选环境而更改。

    如果仅使用单个环境(例如,用于auth / URL详细信息),则收集变量是合适的。比如url地址设置为集合变量,如图所示:

image-20200229200143960

image-20200229200334461

最后修改url地址,引入参数

image-20200229200509697

  • 环境变量使您可以针对不同的环境定制处理,例如本地开发与测试或生产。一次只能激活一个环境。

    如果只有一个环境,则使用集合变量会更有效。

image-20200229200653805

  • 局部变量是临时的,只能在您的请求脚本中访问。局部变量值的范围仅限于单个请求或收集运行,并且在运行完成后不再可用。

    如果您需要一个值来覆盖所有其他变量作用域,但又不想在执行结束后保留该值,则局部变量是合适的。比如在脚本中设置变量

    pm.environment.set("variable_key", "variable_value");
    

    img

  • 数据变量来自外部CSV和JSON文件,以定义在通过Newman或Collection Runner运行集合时可以使用的数据集。

image-20200229201238530

  • 动态变量

    postman可以在请求当中使用动态变量,动态变量的示例如下:

    • {{$guid}} :v4样式的guid
    • {{$timestamp}}:当前时间戳(Unix时间戳,以秒为单位)
    • {{$randomInt}}:0到1000之间的随机整数

image-20200229203219990

注意:更多的动态变量详见https://learning.postman.com/docs/postman/variables-and-environments/variables-list/

5、集合

  • 新建集合

集合里保存的是一组请求。可以理解为多个测试用例的集合,在集合中方便对测试用例进行管理和执行。

如图所示,可以在侧边栏、新按钮等位置创建新集合。

img

  • 导出集合

image-20200229195055203

6、Script脚本

  • 将嵌套对象设置为环境变量
var array = [1, 2, 3, 4];
pm.environment.set("array", JSON.stringify(array, null, 2));

var obj = { a: [1, 2, 3, 4], b: { c: 'val' } };
pm.environment.set("obj", JSON.stringify(obj));
  • 获取环境变量
var value = pm.environment.get("variable_key");
  • 设置下一个要执行的请求
postman.setNextRequest("request_name");
  • 循环执行当前请求
//当前request_name的名称
postman.setNextRequest("request_name");

注意:在连续循环一个请求时,应该包装setNextRequest一些逻辑以确保该请求不会无限期地运行,否则将需要强制关闭收集运行器。

  • 停止执行工作流程
postman.setNextRequest(null);
  • 检查JSON值
pm.test("Your test name", function () {
 var jsonData = pm.response.json();
 pm.expect(jsonData.value).to.eql(100);
});

详见:https://learning.postman.com/docs/postman/scripts/test-examples/

7、验证响应结构

  • 使用TV4进行JSON模式验证

在测试中除了断言响应值的是否相等,还需要断言响应数据的结构及字段属性是否发生了变化,如果响应数据的结构及字段属性发现了变化,就需要对应的调整客户端的代码,因此,需要对 JSON 的 Schema 进行校验。比如说,要检验HttpBin请求的头信息结构及字段属性是否正确,代码如下。

image-20200229210141240

首先,将响应结果复制,并粘贴至https://www.jsonschema.net/将内容转为json schema语言。

image-20200229210446105

然后,将转换后的Json schema复制并粘贴至script当中。

image-20200229210654507

var schema = {
  "definitions": {},
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://example.com/root.json",
  "type": "object",
  "title": "The Root Schema",
  "required": [
    "args",
    "headers",
    "origin",
    "url"
  ],
  "properties": {
    "args": {
      "$id": "#/properties/args",
      "type": "object",
      "title": "The Args Schema"
    },
    "headers": {
      "$id": "#/properties/headers",
      "type": "object",
      "title": "The Headers Schema",
      "required": [
        "Accept",
        "Accept-Encoding",
        "Cache-Control",
        "Host",
        "Postman-Token",
        "User-Agent",
        "X-Amzn-Trace-Id"
      ],
      "properties": {
        "Accept": {
          "$id": "#/properties/headers/properties/Accept",
          "type": "string",
          "title": "The Accept Schema",
          "default": "",
          "examples": [
            "*/*"
          ],
          "pattern": "^(.*)$"
        },
        "Accept-Encoding": {
          "$id": "#/properties/headers/properties/Accept-Encoding",
          "type": "string",
          "title": "The Accept-encoding Schema",
          "default": "",
          "examples": [
            "gzip, deflate, br"
          ],
          "pattern": "^(.*)$"
        },
        "Cache-Control": {
          "$id": "#/properties/headers/properties/Cache-Control",
          "type": "string",
          "title": "The Cache-control Schema",
          "default": "",
          "examples": [
            "no-cache"
          ],
          "pattern": "^(.*)$"
        },
        "Host": {
          "$id": "#/properties/headers/properties/Host",
          "type": "string",
          "title": "The Host Schema",
          "default": "",
          "examples": [
            "www.httpbin.org"
          ],
          "pattern": "^(.*)$"
        },
        "Postman-Token": {
          "$id": "#/properties/headers/properties/Postman-Token",
          "type": "string",
          "title": "The Postman-token Schema",
          "default": "",
          "examples": [
            "1ac1b5ae-5f8f-478b-8d6c-c955c7d7fb25"
          ],
          "pattern": "^(.*)$"
        },
        "User-Agent": {
          "$id": "#/properties/headers/properties/User-Agent",
          "type": "string",
          "title": "The User-agent Schema",
          "default": "",
          "examples": [
            "PostmanRuntime/7.22.0"
          ],
          "pattern": "^(.*)$"
        },
        "X-Amzn-Trace-Id": {
          "$id": "#/properties/headers/properties/X-Amzn-Trace-Id",
          "type": "string",
          "title": "The X-amzn-trace-id Schema",
          "default": "",
          "examples": [
            "Root=1-5e5b5ee9-c787ddce57b2f6a67c39506e"
          ],
          "pattern": "^(.*)$"
        }
      }
    },
    "origin": {
      "$id": "#/properties/origin",
      "type": "string",
      "title": "The Origin Schema",
      "default": "",
      "examples": [
        "61.157.7.177"
      ],
      "pattern": "^(.*)$"
    },
    "url": {
      "$id": "#/properties/url",
      "type": "string",
      "title": "The Url Schema",
      "default": "",
      "examples": [
        "http://www.httpbin.org/get"
      ],
      "pattern": "^(.*)$"
    }
  }
}




pm.test('Schema is valid', function() {
  var jsonData = pm.response.json();
  pm.expect(tv4.validate(jsonData, schema)).to.be.true;
});

这样,只要字段出现了类型的变化或者缺失,测试马上就知道了。

  • 使用AJV进行JSON模式验证

    使用方法和使用TV4进行JSON模式验证一样。

var Ajv = require('ajv'),
 ajv = new Ajv({logger: console}),
 schema = {
     "properties": {
         "alpha": {
             "type": "boolean"
         }
     }
 };

pm.test('Schema is valid', function() {
 pm.expect(ajv.validate(schema, {alpha: true})).to.be.true;
 pm.expect(ajv.validate(schema, {alpha: 123})).to.be.false;
});

8、Runner 批量测试

在测试时,经常会需要用到批量测试,因为一般业务会涉及到多个API,所以这些API一般都会保存在一个集合中,要执行业务就需要将这些API全部执行,而在 Postman 中,实现非常简单。如图所示:

img

posted @ 2020-03-01 15:56  xyztank  阅读(659)  评论(0)    收藏  举报