• postman学习笔记


    postman学习

    接口测试的简介和分类

    • 接口测试就是测试系统组件接口之间的一种测试
    • 分类
      • 测试外部接口:测试被测系统和外部系统之间的接口(只需要测试正例即可
      • 测试内部接口
        • 1)内部接口只提供给内部系统使用。(比如说是预算系统或者是承保系统)(只需要测试正例即可
        • 2)内部接口提供给外部系统使用。(测试必须非常全面,正例,各种异常场景,权限控制等等

    接口测试的流程以及用例的设计

    • 1)拿到接口API文档(或者通过抓包工具获取),熟悉接口业务,接口地址,鉴权方式,入参,出参,错误码
    • 2)编写接口用例以及评审
      • 思路
        • 正例:输入正常入参,接口能够成功返回数据
        • 反例:
          • 鉴权反例:

            • 鉴权的意思:鉴定它是否有访问接口的权限
            • 鉴权码:token,key,appkey
            • postman中的authorization是用来做鉴权的
            • 测试鉴权码为空,鉴权码错误,鉴权码过期等等情况下能够访问成功
          • 参数反例:参数为空,参数类型异常,参数长度异常等等情况

          • 错误码覆盖:根据业务而定

          • 其他错误场景:

            • 接口黑名单,接口调用次数闲置,分页场景
    • 3)使用接口测试工具(如postman)执行接口测试。
    • 4)postman+newman+Jenkins实现持续集成,并且输出测试报告并且发送邮件

    postman的界面介绍

    • workspaces:工作空间
    • connection:集合,项目结合
    • APIs:api文档
    • enviroments:环境变量,全局变量
    • mock server:虚拟服务器
    • monitors:监听器
    • history:历史记录

    postman执行接口测试

    • 请求页签

      • params:get请求传参
      • authorization:鉴权
      • headers:请求头
      • body:post请求传参
        • none:没有参数
        • form-data:既可以传键值对参数也可以传文件
        • x-www-from-urlencoded:只能够传键值对参数
        • raw:可以传json,text,xml,html,javascript
        • binary:将文件以二进制的方式传参
      • Pre-request Script:请求之前的脚本
      • tests:请求之后的断言
      • cookies:用于管理cookie信息
    • 响应页签

      • Body:接口返回的数据

        • pretty:以json,html.xml,text,auto不同格式查看返回的数据
        • raw:以文本的方式查看返回的数据
        • preview:以网页的方式查看返回的数据
      • cookies:响应的cookie信息

      • headers:响应头

      • test results:断言的结果

      • status:200 ok:200是状态码,ok是状态信息

      • time:223ms:是接口响应的时间

      • size:373B:响应的字节数

    • get和post的区别

      • 区别1):get请求一般是获取数据,post请求一般是提交数据
      • 区别2):post请求要比get请求安全
      • 区别3):本质区别是传参的方式不一样
        • get请求在地址栏后面以?的方式传参,多个参数之间用&分隔
        • post请求是在body中以表单的方式传参
    • 问题:

      • 多种环境:开发环境、测试环境、生产环境
      • 接口关联:需要手动关联
      • 参数需要手动修改

    postman的环境变量以及全局变量

    • 解决问题:多种环境:开发环境、测试环境、生产环境
    • 环境变量:环境变量就是全局变量
    • 全局变量:全局变量是能够在任何接口里面访问的变量
    • 获取环境变量和全局变量的值通过:{{变量名}}的方式获取

    处理接口关联问题

    • 两种方式
      • JSON提取器实现接口关联
      • 使用正则表达式提取器实现接口关联

    Postman之JSON提取器实现接口关联

    • 解决问题:接口关联:需要手动关联

    • 实现方式:

      • 第一步:在被调用的接口的tests中写入如下类似内容
      console.log(responseBody);
      // 使用json提取器提取access_token值
      // 把返回的字符串格式的数据转换成对象的形式
      var result = JSON.parse(responseBody);
      console.log(result.access_token);
      // 把access_token设置为全局变量
      pm.globals.set("access_token", result.access_token);
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 第二步:在所用的接口中参数值使用这个方式填充:{{access_token}}

    Postman之正则表达式提取器实现接口关联

    • 解决问题:接口关联:需要手动关联

    • 实现方式:

      • 第一步:在被调用的接口的tests中写入如下类似内容
      // 使用正则表达式提取器实现接口关联,matcg表示匹配
      var resuslt = responseBody.match(new RegExp('"access_token":"(.*?)"'));
      console.log(resuslt[1])
      // 设置为全局变量
      pm.globals.set("access_token", resuslt[1]);
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 第二步:在所用的接口中参数值使用这个方式填充:{{access_token}}

    Postman之内置动态参数和自定义动态参数

    • 解决问题:参数需要手动修改
    • Postman内置动态参数
      • 参数固定格式:{{$xxxx}}
        • {{$timestamp}}:生成当前时间的时间戳
        • {{$randomInt}}:生成0-1000之间的随机数
        • {{$guid}}:生成速记GUID字符串
    • 自定义动态参数
      • 实现方式:

        • 第一步:在调用的接口的Pre-request Script中写入如下类似内容
        // 手动的获得时间戳
        var times =Date.now();
        // 设置为全局变量
        pm.globals.set("time_now",times);
        
        • 1
        • 2
        • 3
        • 4
        • 第二步:在所用的接口中参数值使用这个方式填充:““标签时间{{time_now}}””

    Postman断言

    • 目的:之前看结果都是通过人的肉眼判断是否通过,针对这个问题进行改进。
    • 常见的断言:
      • status code:code is 200 检查返回的状态码是否为200
      • response body:contains string 检查响应中包括指定字符串
      • response body:json value check 检查响应中其中json的值
      • response body:is equal to a string 检查响应等于一个字符串
      • response headers:Content-Type header check: 检查是否包含响应头Content-Type
      • response time is less than 200ms:检查请求耗时小于200ms
    • 示例
      • 在Tests中一般要写状态断言和业务断言两种,如下所示
      // 使用正则表达式提取器实现接口关联,matcg表示匹配
      var resuslt = responseBody.match(new RegExp('"access_token":"(.*?)"'));
      console.log(resuslt[1])
      // 设置为全局变量
      pm.globals.set("access_token", resuslt[1]);
      
      
      // 断言
      // 状态断言
      pm.test("Status code is 200", function () {
          pm.response.to.have.status(200);
      });
      // 业务断言
      pm.test("Body matches string", function () {
          pm.expect(pm.response.text()).to.include("access_token");
      });
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 在输出的结果页签的 Test Results中查看结果

      • 在断言中使用自定义动态参数不能使用这种{{xxx}}方式,要使用+号拼接,动态参数使用get a global variable方式获取

      • 可以将接口中的状态断言代码挪动到集合的test中去,接口中的断言只留下业务断言

        • 方法:在集合的三个点中点edit,然后将状态断言cut 到test中去,update即可。实现了全局断言

    Postman批量运行测试用例

    • 操作方法:点击集合右边的->选择run

    Postman之CSV或JSON文件实现数据驱动

    • csv方式
      • 在接口中参数的参数值均设置为对应的csv表中的列名{{xxx}}
      • 在接口中的业务断言做修改,以微信公众平台的token接口为例子介绍:
        • 1)接口中的test进行如下修改
            if (responseBody.search("access_token")!=-1){
            // 使用正则表达式提取器实现接口关联,matcg表示匹配
            var resuslt = responseBody.match(new RegExp('"access_token":"(.*?)"'));
            console.log(resuslt[1])
            // 设置为全局变量
            pm.globals.set("access_token", resuslt[1]);
        }
        
        // 断言
        
        // 业务断言
        pm.test("Body matches string", function () {
            pm.expect(pm.response.text()).to.include(data.access_token); //data为表名,access_token为列名
        });
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 2)在批量测试中导入csv测试数据文件
    • json方式
      • 与csv类似,只是原始的文件格式不一样而已

    必须带请求头的接口测试和常见请求头详解

    • pass

    Postman接口Mock Servier服务器

    • mock :模拟的意思
    • 解决的问题:后端的接口还没有开发完成,前端的业务需要调用后端的接口,这时候可以使用模拟服务器
    • 使用的方式
      • 在Mock Servers中选择新建集合,在其中选择是使用post还是get方式,然后添加子页面url,添加接口的模拟返回值。所有工作做完之后,可以测试接口,此时会自动生成集合名称的环境变量在其中自动添加了默认值,我们可以选取相应集合中的接口进行测试,想要修改默认的返回值如下所示。
        • 如何修改返回的数据:
          • 在调用mock server的接口中的Default中进行修改,在Body 下的pretty中进行修改

    Postman的Cookie鉴权

    • 鉴权:鉴定它是否有访问接口的权限
    • cookie:cookie是一小段文本,格式key=value
    • cookie鉴权的原理
      • 1.当客户端第一次访问服务器的时候,那么服务器就会生成cookie信息,并且在响应头的set-cookie里面把生成的cookie信息发送给客户端
      • 2.当客户端第2-N次访问服务器的时候,那么客户端就会在请求头的cookie带上cooKie信息,从而实现鉴权
    • cookie的分类
      • 会话cookie:保存在内存,当浏览器关闭之后就会自动化清除cookie
      • 持久cookie:保存在硬盘,浏览器关闭后不会清除,只有当失效时间到了才会自动清除

    Postman的Newman命令以及常见的参数

    • Postman是专为接口测试而生,newman是专为postman而生。
    • newman可以让Postman脚本通过非GUI(命令行)的方式运行。
    • 运行命令:newman run xxx任务
    • 常见参数:
      • -e:引用环境变量
      • -g:引用全局变量
      • -d:引用数据文件
      • -n:执行测试用例迭代的次数
      • -r cli,html,json,junit --reporter-html-export 报告名称.html :指定生成HTML的报告
    • 执行命令:
      • 1)首先是在所在的文件夹中执行cmd
      • 2)执行如下命令:
        • 命令:newman run testcase.json -e enviroment.json -g globals.json -d data.json -r cli,html,json,junit --reporter-html-export report.html
          • testcase.json为测试接口
          • enviroment.json为环境变量
          • globals.json为全局变量
          • data.json为输入的测试用例
          • report.html为输出的测试报告

    Postman+Newman+Jenkins实现接口测试持续集成

    • 实现步骤
      • 1)新建一个项目
      • 2)设置自定义工作空间
      • 3)构建可执行批处理命令:execute windows batch command
      • 4)执行系统Groovy脚本:execute system Groovy script
        • 在groovy script中写入如下内容
          • System.setProperty(“hudson.model.DirectoryBrowserSupport.CSP”,“”)
      • 5)生成的HTML的报告集成到Jenkins

    详细篇

    什么是接口?

    • 电脑:USB,投影仪(数据传输)
    • 软件:统称API,Application Program Interface(鉴权码:token,key,appkey)
      • 接口分为内部接口和外部接口
        • 内部接口:开发人员自己开发的对自身系统提供的接口
        • 外部接口:开发人员调用外部的,比如微信、支付宝等其他的接口
        • summary:接口就是软件提供给外部的一种服务,用于做数据传输。

    软件为什么需要接口?

    • 因为接口能够让内部的数据被外部进行修改

    为什么要做接口测试?

    • 现在很多系统都是前后端分离,开发的进度不一样,需要把一开始开发出来的接口进行测试
    • 基于安全考虑,前端有验证很容易绕过,直接请求接口,特别:身份证信息,银行卡,金钱交易
    • 测试推崇的是测试左移,测试尽早的介入
    • 接口测试的本质:就是测试接口能否正常的交互数据,权限控制以及异常场景

    接口返回的数据格式

    • Json格式
      • 一般会返回三组数据
        • {error_code:0,msg:“提现成功”,data:[]}
    • Html格式
      <html>
          <head>
          head>
          <body>
              <error_code>0error_code>
              <msg>提现成功msg>
              ....
          body>
      html>   
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    • Xml格式
      -主体内容同html格式

    接口测试协议

    • webservice协议:接口地址:http://…?wsdl 这种格式
      • soap协议,wsdl
      • restful规则
        • get获取数据,post提交数据,put修改数据,delete删除数据
        • 地址一样,例如:http://123.12.32.2:8080/user
    • dubbo协议:接口地址: dubbo://…这种格式
      • 适用于少量数据的传输,大并发
      • 不适合传输大量的文件,如文件或者视频
    • http协议:
      • 1)接口地址1:http://…
        1. 接口地址2:https://…
        • https=http+ssl安全传输协议 端口:443
        • http协议的端口是80
      • 什么是http协议?
        • http是超文本传输协议,主要用于浏览器和服务器之间的交互数据,交互有两个部分:
          • 请求:get,post,put.delete

          • 响应:1xx信息,2xx成功,3xx重定向(跳转不传值),4xx客户端错误,5xx服务器错误

          • 请求部分包含:

            • 请求行
            • 请求头
              • Accept:客户端可以接收的数据格式
              • X-Request-With:异步请求
              • User-Agent:客户端的用户
              • Host:请求的主机
              • Accept-Encoding:压缩方式
              • Connection:连接方式(比如保持活跃)
              • Cookie:请求的cookie信息
              • Content-Length:内容的长度
          • 响应部分包含:

            • 响应行:协议 响应码 响应信息
            • 响应头:

    企业接口测试的流程和方案

    • 拿到api接口文档,熟悉接口的业务,接口地址,鉴权,入参,出参,错误码
    • 接口计划和方案
      • 思路
        • 正例:输入正常的入参,查看接口是否返回成功
        • 反例:
          • 鉴权反例:鉴权为空,鉴权码错误,鉴权码已过期…
          • 参数反例:参数为空,参数类型异常,参数长度异常,错误码覆盖
          • 其他场景:分页
      • 编写用例和评审
      • 执行接口测试
      • 输出接口测试报告
  • 相关阅读:
    Tomcat服务部署、优化及多实例实验(Nginx+Tomcat负载均衡、动静分离)
    vue监听页面中的某个div的滚动事件,并判断滚动的位置
    前端程序员应该往全栈方向发展吗?还是坚守前端?
    MYSQL练习题:部门工资前三高的所有员工
    Flink DataStream 体系
    从零到一构建koa+ts项目(初始化)
    copilot 产生 python工具函数并生成单元测试
    乐观锁和悲观锁在kubernetes中的应用
    Kafka学习笔记(三)
    深拷贝与浅拷贝(对象的引用)
  • 原文地址:https://blog.csdn.net/m0_46650312/article/details/126595934