一、接口测试的简介和分类

首先,我们先了解什么是接口?

以下所说的为API接口,而非java里的interface

API:application programming interface

接口是为不同系统和功能之间实现分离或连接的口

广义上的接口,是系统的对外提供的服务方式,通俗的说,所谓的接口,其实就是应用程序提供的功能,或者服务的总称

是提供软件或硬件中一组例程的访问渠道,该渠道的特点是访问者无需获知源代码或实现细节就可以达到自己的访问目的

比如我们平时的网购,通过客户端下单,购买,付款等一系列操作,都是通过API接口请求服务端

 

接口测试就是测试系统组件接口之间的一种测试

分类:

  • 测试外部接口:测试被测系统和外部系统之间的接口。(只需要测试正向即可)
  • 测试内部接口:
  1. 内部接口只提供给内部系统使用。(预算系统,承保系统)(只需要测试正向即可)
  2. 内部接口提供给外部系统使用。(测试必须非常全面,正向、反向,各种异常场景,权限控制)

 

为什么要做接口测试?

  1. 前后端分离
    1. 当前后端的接口开发完成,即可以直接测试
    2. 前端开发好了,但是后端接口还没有完成,需要使用Mock Server
  2. 基于安全考虑,UI的JS的验证很容易绕过,所以需要在接口层面对安全性做考虑
  3. 测试左移(前移)思想

 

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

1. 拿到接口api文档(公司的wiki,也可通过抓包工具获取),熟悉接口业务,接口地址,鉴权方式(鉴定是否有访问接口的权限),入参,出参,错误码。

2. 编写接口用例以及评审。

  思路:

    正向:输入正常入参,接口能够成功返回数据。

    反向:

      鉴权反向:鉴权码为空,鉴权码错误,鉴权码过期,鉴权码失效。

      参数反向:参数为空,参数类型异常,参数长度异常。

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

      其他错误场景:接口黑名单,接口调用次数限制,分页场景。

 

3. 使用接口测试工具Postman执行接口测试。

4. Postman+Newman+Jenkins实现持续集成,并且输出测试报告并发送邮件。

 

三、微信公众平台接口

获取权限:

appid(ID):

secret(秘钥):

 

四、Postman的简介,安装,注册

安装方式:

  1. Chrome应用商品搜索Postmen安装。(需要FQ,不推荐)
  2. 客户端安装,官网地址:www.postman.com/downloads/
  3. Postman的注册和登录。(注册登录后才可以使用Postman的云服务功能)
  4. Postman的界面介绍  
    • Home 主页
    • Workspaces 工作空间
      1. Collections 集合,项目集合
      2. ApiS api文档
      3. EnViromments 环境变量,全局变量
      4. MockServer 虚拟服务器
      5. Monitors 监听器
      6. History 历史记录

 

五、Postman执行接口测试

请求页签

  • Params:get请求传参
  • Authorization:鉴权
  • Headers:请求头
  • Body:post请求传参
    • none:没有参数
    • form-data:即可以传键值对参数也可以传文件
    • x-www-form-urlencoded:只能够传键值对参数
    • raw:json,text,xml,html,javascript
    • binary:把文件以二进制的方式传参
  • Pre-request-script:请求之前的脚本
  • Tests:请求之后的断言
  • Settings:对当前请求的设置
  • Cookies:用于管理cookie信息

 

响应页签

  • Body:接口返回的参数
    • Pretty:以Json,html,XML不同的格式查看返回数据
    • Raw:以文本的方式查看返回的数据
    • PreView:以网页的方式查看返回的数据
  • Cookies:响应的Cookie信息
  • Headers:响应头
  • Test Results:断言的结果
  • 200 状态码
  • OK 状态信息
  • 681ms 响应的时间
  • 343B 响应的字节数

 

GET请求与POST请求的区别:

  1. GET请求一般是获取数据;POST请求一般是提交数据
  2. POST请求相比GET请求安全
  3. 本质区别是传参的方式不一样
    1. GET请求在地址栏后面以?的方式传参,多个参数之间用&分隔
    2. POST请求是在Body以表单的方式传参
    3. GET请求在URL中传送的参数是有长度限制的,而POST没有
    4. 对参数的数据类型,GET只接受ASCII字符,而POST没有限制
  4. GET产生一个TCP数据包;POST产生两个TCP数据包
    • GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
    • POST请求,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)

 

问题:

  1. 多种环境:开发环境,测试环境, 生产(线上)环境
  2. 接口关联:需要手动关联
  3. 参数需要手动修改

 

六、Postman的环境变量以及全局变量

环境变量:环境变量就是全局变量

全局变量:全局变量是能够在任何接口里面访问的变量

 

获取环境变量和全局变量的值通过:{{变量名}}

 

七、接口关联

  1. 使用json提取器实现接口关联
    1. 先做一个打印,在Tests中输入:console.log(responseBody);  //打印的结果,我们在控制台(Console)中查看。
    2. 使用json提取器提取‘token’值
      1. var result = JSON.parse(responseBody);  //把返回的字符串格式的数据转换成对象的形式,并用一个变量去接收
      2. console.log(result.datas.token)  //打印我们拿到的token,看一下结果
    3. 把token设置为全局变量
      1. pm.globals.set("token", "result.datas.token");  //("全局变量名称", "全局变量的值")
    4. {{token}}
  2. 使用正则表达式提取器实现接口关联
    1. var result = responseBody.match(new RegExp(' "token":"(.*?)" '));  //一般会提取出两个值,一个是带有左边界的值,下标为[0];一个是我们要提取出的值,下标为[1]
    2. console.log(result[1])  //打印我们正则提取到的token,看一下结果
    3. token设置为全局变量
      1. pm.globals.set("token", result[1]);  //("全局变量名称", "全局变量的值")
    4. {{token}}

 

八、Postman内置动态参数以及自定义的动态参数

Postman内置动态参数:{{$}}

{{$timestamp}}  生成当前时间的时间戳

{{$randomInt}}  生成0-1000之间的随机数

{{$guid}}    生成速记GUID字符串

动态参数不是万能的,在我们做断言时,动态参数可能没办法做断言

 

自定义动态参数

  1. 在Pre-request Script中输入:var times = data.now();  //手动获得时间戳
  2. pm.globals.set("times","times");  //设置为全局变量

  

九、Postman断言

Statue 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  检查是否包含响应头Content-Type

Response time is less than 200ms  检查请求耗时小于200ms

 

断言:

  1. 状态断言
    • pm.test("检查返回状态码为200", function () {
          pm.response.to.have.status(200);
      });
    • pm.test("检查响应头中包括有Content-Type响应头", function () {
          pm.response.to.have.header("Content-Type");
      });
    • pm.test("检查接口响应时间少于xxx ms", function () {
          pm.expect(pm.response.responseTime).to.be.below(响应时间 ms);
      });
       
  2. 业务断言
    • pm.test("检查响应中包括这个字符串", function () {
          pm.expect(pm.response.text()).to.include("xxx字符串信息");
      });
    • pm.test("检查键值对是否存在", function () {
          var jsonData = pm.response.json();
          pm.expect(jsonData.键).to.eql(值);
      });
    • pm.test("相应的结果等于这个字符串(适用于较小的响应结果)", function () {
          pm.response.to.have.body("xxx字符串信息");
      });
       

在断言中获取自定义动态参数(全局\环境变量)的方式:

  1. pm.globals.get("全局\环境变量名");
  2. globals["全局\环境变量名"]
  3. globals.全局\环境变量名

 

全局断言

在集合中,添加全局断言

 

十、Postman批量运行测试用例

Iterations  执行次数

Delay  延迟时间(ms)

Data  数据文件

 

十一、Postman数据驱动之CSV文件和JSON文件的处理

使用CSV数据文件:

参数值需要使用全局变量的方式,全局变量名与数据文件中的字段名一致

断言中取文件数据,需要使用data.文件中的字段名,如:

  • pm.test("检查响应中包括xxx字符串信息", function () {
        pm.expect(pm.response.text()).to.include("data.字段名");
    });
 
判断当返回结果中包括有token时才通过正则表达式去取值,如:
  • if (responseBody.search("token") != -1){
        var result = responseBody.match(new RegExp(' "token":"(.*?)" ')); 
        console.log(result[1]);
        pm.globals.set("token", result[1]);
    }
 
使用JSON数据文件:
与CSV文件的数据格式不同,参数与断言的配置不变
 

十二、测试必须带请求头的接口

 Host  请求的主机地址

Connection  连接方式

Accept  客户端接收到的数据格式

X-Requested-With  异步请求

User-Agent  客户端的用户类型

Referer  来源

Cookie  Cookie信息

Content-Type  请求内容的格式

 

十三、Postman接口Mock Servier服务器

mock 模拟

后端的接口还没有开发完成,前端的业务需要调用后端的接口

{"error_code":0,msg:"返回成功",data:[]}

 

十四、Postman的Cookie鉴权

什么是cookie?

cookie是一小段文本,格式key=value

cookie鉴权的原理:

  1. 当客户端第一次访问服务器的时候,那么服务器就会生成Cookie信息,并且在响应头的set-cookie里面把生成的cookie信息发送给i就客户端
  2. 当客户端第2-N次访问服务器的时候,那么客户端就会在请求头的cookie带上cookie信息,从而实现鉴权

 

cookie的分类:

  • 会话cookie:保存在内存,当浏览器关闭之后就会自动化清楚cookie
  • 持久cookie:保存在硬盘,浏览器关闭后不会清除,只有当失效时间到了才会自动清除、

 

十五、Postman实现接口的加密和解密

  1. 目前市面上的加密方式
    1. 对称式加密:DES,AES,Base64加密算法
    2. 非对称加密:双钥(公钥,私钥,公钥加密私钥解密,私钥加密公钥解密)加密,RSA加密算法
    3. 不考虑解密:MD5,SHA1,SHA3
  2. Postman如何实现加密和解密
    1. MD5最广泛

 

十六、Newman

Postman是专为接口测试而生。Newman是专为Postman而生。

Newman可以让我们的Postman的脚本通过非GUI(命令行)的方式运行。

运行命令:newman run

常用参数:

  • -e  引用环境变量
  • -g  引用全局变量
  • -d  引用数据文件
  • -n  指定测试用例迭代的次数
  • -r  cli,html,json,junit --reporter-html-export  指定生成html格式的报告

 

执行命令如下:

newman run testcase.json -e environment.json -g globals.json -d data.json -r cli,html,json,junit --reporter-html-export report.html

 

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

  1.  新建一个项目
  2. 设置自定义工作空间
  3. 执行windows的批处理命令:Execute Windows batch command
  4. 执行系统的Groovy脚本:Execute system Groovy script
  5. 生成HTML报告集成到Jenkins