postman使用笔记

由于项目需要,前段时间接触了postman工具,有点空闲了,就做个笔记吧。

  一接口测试理论


01接口

1.程序内部接口:方法与方法之间,模块与模块之间的交互,程序内部抛出的接口,比如bbs系统,有登录模块,发帖模块等等,那你要发帖就必须先登录,那么这两个模块就得有交互,它就会抛出一个接口供内部系统进行调用。

2.系统对外接口:比如你要从别的网站或服务器上获取资源和信息,别人肯定不会把数据库共享给你,他只能给你提供一个他们写好的方法来获取数据,你引用他提供的接口就能使用他写好的方法,从而达到数据共享的目的,比如说咱们的app,网址这些它在进行数据处理的时候都是通过接口进行调用的。 

02接口的分类

1.web service接口,soap协议,请求报文和返回报文都是xml格式的,我们在测试的时候通过工具才能进行调用,测试。

2.http api接口,http协议,通过路径来区分调用方法,请求报文都是key-value形式的,返回报文一般都是json串,有get和post等方法,这也是最常用的两种请求方式。 

03接口测试

1.接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。

2.其实接口测试就和普通功能测试没什么区别,区别就是功能测试是在页面上点点点,在页面上输入值,提交数据看结果,而接口测试没有页面,通过接口规范文档上的调用地址,请求参数,拼接报文,然后发送请求,检查返回结果。

 

04接口测试的必要性

1.发现页面上发现不了的bug
2.检查系统的异常处理能力
3.检查系统的安全性,稳定性
4.前端随便变,接口测好了,后端不用变

05接口测试流程

1.需求评审,熟悉业务和需求
2.开发提供接口文档
3.编写接口测试用例
4.用例评审
5.提测后开始测试
6.提交测试报告
 

06接口测试测什么

1.单一接口的测试:接口的输入输出,数据合法性,异常处理
2.多接口组合测试:业务逻辑,业务场景
3. 结构检查
(1)​检查返回值的结构是否正确,如是json类型还是xml类型的数据
(2)字段名称是否正确​等
 

07接口文档

接口测试的重要依据
包括:接口说明、调用url、请求方法(get\post)、请求参数,参数类型,参数说明,返回参数说明


08通用接口用例设计

1.通过性验证:首先肯定要保证这个接口功能是好使的,也就是正常的通过性测试,按照接口上的参数,正常传入,是否可以返回正确的结果。
2.参数组合:现在有一个操作商品的接口,有个字段type,传1的时候代表修改商品,商品id、商品名称和价格有一个是必传的,这时候就要参数组合了。

3.接口安全

(1)绕过验证,比如购买了一个商品,它的价格是300元,那我在提交订单的时候,我把这个商品的价格改成-3元,后端如果没有做验证,那是不是我的余额还要增加?

(2)绕过身份权限,比如修改商品信息的接口,那必须得是卖家才能修改,那我传一个普通用户,能不能修改成功,我传一个其他卖家能不能成功?

(3)参数是否加密,比如说登录接口,用户名和密码是不是加密,如果不加密,别人拦截你的请求,就能获取到你的信息了,加密规则是否容易**

(4)密码安全规则,密码的复杂程度校验

(5)异常验证:异常的,也就是我不按照你接口文档上的要求输入参数,来验证接口对异常情况的校验,必传非必传,参数类型,入参长度。

4.根据业务逻辑设计用例

列出测试点,造数据测试对应测试点

09接口测试用例模板

项目,模块,用例id,接口名称,用例标题,请求方式,请求url,请求参数,前置条件,结果验证,请求报文,返回报文,测试结果,测试人员有登录模块,发帖模块等等,那你要发帖就必须先登录,那么这两个模块就得有交互,它就会抛出一个接口供内部系统进行调用。



 二 postman 界面功能介绍

2-1 前言

           Postman 是一个很强大的 API调试、Http请求的工具
     
            操作环境: win7 64 位

            postman:Postman-win64-6.0.7-Setup.exe

2-2Collections

      Collections集合:也就是将多个接口请求可以放在一起,并管理起来。

什么样的接口请求可以放在同一个collection里?

一个工程一个Collection,这样方便查找及统一处理数据

 第一步:创建Collections

点击图中的带+号的图标,输入Name,Description,点击Create按钮即创建成功一个Collections.

 postman使用笔记

 第二步,在Collections里添加请求

在右侧准备好接口请求的所有数据,并验证后,点击save按钮。

选择Collection及填写好Request name、Request description后,点击右下角的save to collection按钮,则该请求被添加到Collection中。
Add Folder按钮位置
接下来,只需要把相同场景的请求拖入相同的Folder即可,这样就实现了模块化的管理了。

添加成功后,可在左侧列表中,collection中查看刚刚添加的请求

第三步:Collection精细化---Folder

随着放入Collection的请求越来越多,混乱就又出现了,在找一个请求时,要找半天,于是将collection中的请求分门类别就很重要了,于是,在collection中就可以添加Folder了,将相同场景的请求放入同一个Folder中,于是就实现了模块化的管理了。

点击下图中的Add Folder后,即可创建Folder。

添加上Folder name,即模块名称后,点击Create,创建成功一个Folder。

postman使用笔记

第四步:运行Collection

将工程模块化的用例管理起来后,可以将工程模块化的用例执行起来,即一次执行一整个collection里的用例,或者执行一个collection里的某一个Folder里的用例。

点击下图中的Run:

postman使用笔记

第五步:Collection运行参数化

在Iterations重复运行时,如果某个用例希望每次运行时,使用不同的数据,那么应该满足如下2个条件:

(1)脚本中要用到数据的地方参数化,即用一个变量来代替,每次运行时,重新获取当前的运行数据。

(2)需要有一个数据池,这个数据池里的数据条数,要与重复运行的次数相同。

Postman的runner给我们提供了Iterations的输入项,也提供了Data的文件选择项,也就是意味着数据池是一个外部文件。

如果Iterations里的值为2,那么,这个外部文件里也应该有两条数据,postman希望我们这个外部文件里的数据是一个json(当然也可以是其它

数据格式).

为了表示两条数据,这个json应该是一个list结构(如下图),同时,由于脚本要用到数据的地方需要参数化,需要变量,所以,每一条数据应该就是一个map,map的key对应脚本中的变量。


postman使用笔记

2-3 设置环境变量

有时需要在不同的环境下跑相同的测试,此时可以通过设置环境变量来动态选择。点击右上角的设置按钮-Manage Environments:

在Postman里面:

  • Environements包含global Environment,即全局的Environment,里面定义的变量在任何地方地方都可以看到
  • local Environment, 里面定义的变量只有在当前Environment里面才可以看到

postman使用笔记


填写该环境的名称:如测试环境,并在key和value中填写需要的键值。

postman使用笔记


使用这些键值的时候只需要加上两个花括号引用key

postman使用笔记


举例一下变量的好处,比如你把APP部署在自己的机器上时使用的域名是localhost,而部署在服务器上时,域名就是具体的服务器ip。为了在两种不同环境上测试你的API,你在构建request的时候就需要输入不同的url,但如果你使用了变量,你就可以使用变量来复用你的url,你只需在不同的environment里面给url赋不同的值,那你的request就完全不需要变。同理,在tests里面也是一样的。这里就不赘述

环境变量可以使用在以下地方:

  • URL
  • URL params
  • Header values
  • form-data/url-encoded values
  • Raw body content
  • Helper fields


注意:在你要使用的变量名上附上双花括号,一个请求只能应用一个环境变量

postman使用笔记



下图"username" 和"passwd" 的value值应用了环境变量"user_pwd",所以在body 中,只需在key对应的value那写上变量{{username}}, {{passwd}}。

postman使用笔记



2-4 Request Body

如果我们要创建的request是类似于POST,那我们就需要编辑Request Body,Postman根据body type的不同,提供了4中编辑方式:

  • form-data
  • x-www-form-urlencoded
  • raw
  • binary

postman使用笔记


1. form-data

对应着http请求中的Content-Type为multipart/form-data. 

它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件File。

当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;

因为multipart/form-data类型有boundary隔离,可以上传多个文件,也可以上传键值对,它采用了键值对的方式。

2. x-www-form-urlencoded
     application/x-www-from-urlencoded,会将表单内的数据转换为键值对,比如,name=Java&age = 23
3. raw(支持各种原生的类型)
4. binary(二进制 )
通过上图可以看出,只能上传一个图片, 相当于Content-Type:application/octet-stream


2-5 Pre-request Script 

定义我们在发送request之前需要运行的一些脚本,应用场景主要是设置全局变量和环境变量

2-6 Tests (断言)

一个完整的接口测试,包括:请求->获取响应正文->断言,我们已经知道了请求与获取响应正文,如何用postman进行断言呢。

Tests

这个”Tests”就是我们需要处理断言的地方,postman很人性化的帮我们把断言所用的函数全给准备好了

postman使用笔记


举例说明:首先设置一个断言场景,根据断言场景来举例说明Postman断言如何使用。

1、判断HTTP返回状态码为200

2、判断响应正文中是否包含:"statusCode":200

3、解析响应正文,并判断statusCode的值是200,message的值是”Success”


第一步:

在SNIPPETS中,往下拉,有一项”Status code:Code is 200”,这个就是为场景中的第 1 条准备的,判断HTTP返回状态码是否为200。点击这一项,可以看到在其左边,断言代码自动添加,见下图:

postman使用笔记


解释一下这句代码的意思:

tests["Status code is 200"]中的tests是一个内置对象,tests["Status code is 200"]是指为这个断言起个名称叫”Status code is 200”,这个名称可以自行修改。

responseCode.code === 200中的responseCode是内置对象,responseCode对象中有个属性是code,是指HTTP状态码的code,判断code是否为200.

综合起来,这句代码的意思是:名称为”Status code is 200”的断言中,判断responseCode对象的code属性值(HTTP状态码)是否为200。

第二步:

同样在SNIPPETS中,找到一项”Response body:Contains string”,这个就是为场景中的第2条准备的,判断响应正文中的字段。点击后,在其左边,断言代码自动添加,见下图:

postman使用笔记

其中我们需要修改想要在响应报文中找到的内容:

tests["Body matches string"] = responseBody.has('"statusCode":200');    //对照第2条场景:判断响应正文中是否包含:"statusCode":200

第三步:

我们需要解析JSON串了,所以,在SNIPPETS中找到”Response body:JSON value check”并点击,在其左边,断言代码自动添加,见下图:

postman使用笔记


我们可以看出,这里面其实是JS代码,jsonData变量其实是解析完JSON后的对象,在JS中,一个JSON对象获取其属性的值,直接是用jsonData.value,于是,我们把代码给修改一下,来判断第3条场景:

tests["response statusCode"] = jsonData.statusCode === 200;  //判断statusCode的值是200

tests["response message"] = jsonData.message === 'Success';  //判断message的值是”Success


如何处理大量重复的断言逻辑

针对单个API,去编写对应的断言脚本,这个是没有什么问题的。

但是如果是针对一个项目的所有API去编写,类似于判断statusCode这样的断言就会显得很溶于,所以PostMan也考虑到了这点。

在我们创建的Collection以及下层的文件夹中,我们可以直接编写针对这个目录下的所有请求的断言脚本

postman使用笔记


postman使用笔记

这里的脚本会作用于目录下所有的请求。

这样我们就可以将一些通用性的断言挪到这里了,在每个请求的Tests下编写针对性的断言脚本


1. Tests 作为测试用例的应用
Tests 主要用来设计用例,比如要测试返回结果是否含有某一字符串,就可以用到 Tests。以gold_add 接口为例,来编写测试用例,分别测试返回的结果是否含有,如下所示:

响应成功返回PASS, 失败返回FAIL。

postman使用笔记


常用tests如下:
1.检查response body中是否包含某个string
tests["Body matches string"] = responseBody.has("string_you_want_to_search");

注意:"Body matches string" 需唯一。

2.检测JSON中的某个值是否等于预期的值

var data = JSON.parse(responseBody);
tests["Your test name"] = data.value === 100;
JSON.parse()方法,把json字符串转化为对象。parse()会进行json格式的检查是一个安全的函数。 
如:检查json中某个数组元素的个数(这里检测programs的长度)
var data = JSON.parse(responseBody);
tests["program's lenght"] = data.programs.length === 5;
3.检查response body是否与某个string相等
4.转换XML body为JSON对象
var jsonObject = xml2Json(responseBody);
tests["Body is correct"] = responseBody === "response_body_string";
5.测试response Headers中的某个元素是否存在(如:Content-Type)
tests["Content-Type is present"] = postman.getResponseHeader("Content-Type"); 
//getResponseHeader()方法会返回header的值,如果该值存在
或者: 
tests["Content-Type is present"] = responseHeaders.hasOwnProperty("Content-Type");
上面的方法,不区分大小写。下面的方法,要区分大小写。

postman使用笔记


6.验证Status code的值
tests["Status code is 200"] = responseCode.code === 200;

7.验证Response time是否小于某个值
tests["Response time is less than 200ms"] = responseTime < 200;

8.name是否包含某个值
tests["Status code name has string"] = responseCode.name.has("Created");

9.POST 请求的状态响应码是否是某个值
tests["Successful POST request"] = responseCode.code === 201 || responseCode.code === 202;

10.很小的JSON数据验证器
var schema = {
"items": {
"type": "boolean"
}
};
var data1 = [true, false];
var data2 = [true, 123];
console.log(tv4.error);
tests["Valid Data1"] = tv4.validate(data1, schema);

tests["Valid Data2"] = tv4.validate(data2, schema);



2-7发送请求,get,post


接口测试中常用的请求为GET 和POST,以下均以这两种请求为例。

GET 和POST 的区别:
GET 使用URL 或Cookie 传参,而POST将数据放在Body 中。
GET的URL 在长度上会有限制,而POST没有。
POST比GET相对安全,因为在地址栏不可见。

一般POST请求用来获取数据,POST请求用来发送数据。

1.get请求

平常我们拿一个url 访问页面,就是所谓的get 请求。

2. POST请求:
POST 请求不能像GET一样直接在浏览器输入就可以请求,需要借助工具来完成。
 使用方法:选择请求方式为post,输入请求的url,以及输入必要的"Authorization" , "header" 和"Body" 数据。post请求可以发送key-value, json格式,file等。
对于"Authorization"的使用,遇到比较多的是Type 为"Basic Auth", 然后设置对应的Username 和Password。

这里的username, password的值可以通过设置环境变量的方式取得。

postman使用笔记


a. 用Postman 发送key-value 的请求:
以login 接口为例,在Body 中选取"form-data" 格式,输入所需的key-value, 选取对应的环境变量。

postman使用笔记


b. 用Postman 发送json格式的请求:

以add user 接口为例,在Body 中选取"raw" 格式,根据接口文档输入json 数据, 有需要应用环境变量的选取环境变量。

postman使用笔记


c. 用Postman 发送文件的请求:

以file upload 接口为例,在Body 中选取"form-data" 格式,在key 里输入"file",在右边的下拉里选取类型为"File",点击"Choose Files" 就可以上传本地文件了。

postman使用笔记