接口工具Postman的学习使用

接口工具Postman的学习使用

十二月 04, 2019

接口工具Postman的使用

Postman使用场景:

1.开发接口的时候需要快速的调用接口,以便调试。

2.测试的时候需要非常方便的调用接口,通过不同的参数去测试接口的输出。

3.接口调用可以保存下来进行反复的运行。

4.在运行过程中增加接口断言。

Postman的相关资料:

官网及下载地址:https://www.getpostman.com/

官方文档:https://learning.getpostman.com/docs/postman/launching-postman/introduction/

Postman安装

首先进入到官网的下载页面(下图是Mac的下载页面)选择适合于自己系统的版本进行安装,注意核对自己的电脑是x32还是x64的。

下载完成后,双击下载后的文件进行安装。安装过程会花1~2分钟左右。安装完成后会在桌面看到Postman的图标,点击便可打开Postman,首次打开的时候,界面如下所示:

这里我们不需要进行账号的注册,直接使用免费版的就可以了,点击上图中的“Skip siging in and take me straight to the app”就可以进入到Postman了。

Postman发送第一个API请求

这里我们以v2ex里的API为测试对象。

文档:https://www.v2ex.com/p/7v9TEc53

测试对象(API地址):https://www.v2ex.com/api/topics/hot.json

首先在浏览器中进入v2ex的API文档地址,找到我们要请求的接口信息,如下:

给出了接口API的地址以及请求的方法,接着我们打开Postman,输入请求地址,选择请求方法为GET,如下图:

输入信息后点击Send,进行模拟请求。

请求是否成功参考上图中红框内的内容,Status表示请求返回的状态码(常见的有200,404,302,其余的状态码自行查阅HTTP知识)Time表示请求的时间,单位是ms,Size表示大小;如果请求成功状态码这里显示200 OK,意味着我们的请求成功,成功后会返回一个json格式的数据回来,这就是我们请求到的这个接口API数据,如果你是测试人员,则可以核对其返回的数据是否与需求一致,是否有数据的信息缺失等等;接下来我们看看还可以获取到哪些信息。

这里我们可以选择不同的文件格式。

这里再看到Header栏,可以看到Content-Type默认的是application/json,所以Response默认返回的是json格式。

选择Cookies栏,可以看到请求此API接口所使用的Cookie值。

Postman增加断言

断言:这里简而言之,就是预期与实际结果的判断

  • 预期结果 == 实际结果 :用例通过,写入测试报告中
  • 预期结果 != 实际结果:用例不通过,写入测试报告中

这里我们还是用请求第一个API的请求为例子来设置断言,这里我们先设置两个断言目标:

1.请求返回的状态码是200。

2.请求返回的内容是10条。

这里就需要用到Postman的Test功能,官方文档点这里具体的功能入口如下图所示

进入Test功能后,会弹出一个默认的编辑器,这里的断言功能是用JavaScript进行编写的,在编辑器右边有常用的一些断言demo,可以点击使用。

这里我们用JS写一些代码:

1
2
3
4
5
6
7
8
9
10
11
//第一个断言 验证返回值是否为200
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});

//将返回值转换为json对象
var res = JSON.parse(responseBody);

console.log(res.length);
//第二个断言,验证返回内容是否为10条
tests["response's number is 10"] = res.length === 10;

写完之后,我们点击Send,请求成功后下方(Body,Header,Cookies那一栏)会多出一个Test Results,点击Test Results,可以看到我们断言的结果,如下图

我们看到第一个检查点(断言)PASS成功了,第二个检查点失败,说明我们请求的接口返回给我们的内容条数并不是10条,这里回去看了一下Body中的接口内容,数了一下,只有9条,这样就发现了一个接口的BUG,断言是灵活的,这里我们将前面的检查条数从10条改为9条。

我们再点击send进行请求,查看Test Result

OK,请求成功了,这里v2ex用来学习的项目API有时候返回的内容条数会有差别,视具体情况而定。当然了关于断言或者其他的API使用学习可以参考Postman官方文档中的sandbox API reference,里面有一个chai是针对与断言编写的一种语法,有兴趣可以去看看。

Postman发送Post请求

上面介绍了GET的请求方法,这里再来介绍一下如何进行Post请求,这里在网上找了一个可供测试的网站作为测试对象

测试网站地址:http://www.testingedu.com.cn:8000/Home/user/login.html

登录这个测试网站,可以看到有提供给你免注册的账号

这里如何获取到请求的url呢?使用Chrome内置的检查工具无法完成我的需求,这里就需要使用抓包工具了,我这里使用的是Charles,输入测试账号,密码,验证码后,点击登录。Charles中可以看到刚刚我们进行的请求,如下图

上图中的URL即我们要请求的地址,Response Code显示200显示访问没问题,下面的Method中指出了这是一个POST请求,Content-Type为text/html,如果用postman进行请求默认Response是html格式的,接下来再看看Contents栏如下图

在Contents中可以看到请求的username(即账号),password(即密码),verify_code(即验证码)的一些数据。因为这是测试网站,所以没有做加密,像百度,京东这种网站不可能通过简单的抓包就能获得账号密码的。获取到这些信息后我们回到Postman。

首先先填入刚刚获取到的URL

然后转到Header栏,填写Header的相关信息,例如Content-Type

之后再转到Body栏,填写请求的Body值,例如username,password,verify_code

填写的信息都是我们刚刚从Charles中抓包获取到的,然后我们点击Send进行请求。

我们可以看到,请求状态码返回200成功,并且Response的数据返回是以html格式返回的,符合我们的请求设置,至此,已完成了整个POST的请求。

Postman关于获取Cookies的设置与获取

####获取Postman Echo的demo文件

这里我们参考Postman官网给出的demo来进行演示,首先,去官网获取demo,其demo地址点击这里,如下图。

然后点击“Run in Postman”就可以加入到postman的collection中去,这是一些请求的demo,可以方便参考学习,下图示加入到postman中的示例

对demo给出的cookie demo进行分析

找到Postman Echo下的Cookie Manipulation文件夹,打开文件夹,会发现下面有三个demo示例,分别是Set Cookies,Get Cookies,Delete Cookies,也就是设置Cookies,获取Cookies以及删除Cookies。

1.Set Cookies

首先点开Set Cookies的demo,这里官方设置了两个Cookies值,分别是foo1和foo2,其value分别是bar1和bar2。

然后我们看一下官方这里写的断言,如下图。

代码如下:

1
2
3
pm.test('response should be 200 or 302', function () {
pm.expect(pm.response.code).to.be.oneOf([200, 302]);
});

第一条断言是关于请求成功与否的断言,这里设置了返回的状态码是200或者是302,则断言成功。

1
2
3
4
5
6
7
pm.test('the "foo1" cookie has correct value', function () {
pm.expect(pm.cookies.toObject()).to.have.property('foo1', 'bar1');
});

pm.test('the "foo2" cookie has correct value', function () {
pm.expect(pm.cookies.toObject()).to.have.property('foo2', 'bar2');
});

第二,三条断言是关于设置的Cookie值得正确与否的校验。

1
2
3
4
5
6
7
8
9
pm.test('response body should be valid', function () {
if (pm.response.code === 200) {
pm.response.to.have.jsonBody('cookies.foo1', 'bar1')
.and.have.jsonBody('cookies.foo2', 'bar2');
}
else {
pm.response.to.have.body('Found. Redirecting to /cookies');
}
});

第四条断言对请求的Body值做判断的校验。

2.Get Cookies

当我们完成了上一步的Cookies的设定,这里就可以进行Cookies的获取,我们继续来看demo,如下图。

GET的URL写明是请求获取这个页面的Cookies值,我们来分析一下断言的信息。

1
2
3
pm.test("response is ok", function () {
pm.response.to.have.status(200);
});

第一条断言是验证返回的状态码为200,意味着请求成功。

1
2
3
4
5
6
7
pm.test('the "foo1" cookie has correct value', function () {
pm.expect(pm.cookies.toObject()).to.have.property('foo1', 'bar1');
});

pm.test('the "foo2" cookie has correct value', function () {
pm.expect(pm.cookies.toObject()).to.have.property('foo2', 'bar2');
});

第二,三条断言校验了返回的Cookies值得正确与否。

1
2
3
4
pm.test('response body should be valid', function () {
pm.response.to.have.jsonBody('cookies.foo1', 'bar1');
pm.response.to.have.jsonBody('cookies.foo2', 'bar2');
});

第四条断言针对响应的Body值做一个判断的校验。

1
console.log(pm.cookies.get('foo1'));

这条命令是为了在Postman的控制台中打印请求到Cookies“foo1”的值。Postman的控制台在顶部菜单栏找到View–>Show Postman Console就可以打开了。

查看到log如我们刚刚打印出了“foo1”的值。

以上断言就可以针对我们需求所要获取的Cookies进行断言判断,在结合控制台进行分析,对于我们涉及到Cookies的测试有很大的帮助。

3.Delete Cookies

其实Delete Cookies和Set Cookies的过程类似,只不过在Set Cookies里设置的Cookies是有值的,在Delete Cookies中我们将之前设置的Cookies赋一次空值就做到了删除原来的Cookies。

上面的断言设置也与之前的Set Cookies类似,这里不做多赘述,将检测值设为空值。

小结

以上demo针对于Cookies的设置,获取以及删除操作进行了说明,具体使用还是要根据所要测试的接口文档进行设计。

Postman鉴权

在进行一些接口测试的时候,有些接口是需要我们输入用户名和密码登录后才可以去测试接口API的,所以说就涉及到了一个鉴权的机制,比如现在测试一个URL为https://postman-echo.com/basic-auth 的接口,我们通过浏览器去访问的时候会弹出输入用户名及密码的弹窗,如下图

提示我们必须要输入用户名及密码,这个时候Postman里面提供了一个Authorization来解决这个问题,接下来我们看Postman中的配置,这里我们在Postman Echo中可以找到相关的demo。

在Basic Auth中可以输入你需要登录的用户名及密码,这里的Username是postman,Password是password。输入后点击Send进行请求的发送,看一下请求的结果如下图

返回的Json数据告诉我们authenticated打印一个true,意味着用户名和密码验证成功了,状态码返回200,意味着我们登录也成功了,这是一个简单的鉴权请求的过程。

在鉴权配置中,找到TYPE栏,点击会弹出一个下拉菜单,刚刚演示的是一个最基本的鉴权请求,下面还有其余的鉴权类型可供选择,现在用的比较多的是类型一般是OAuth2.0,使用该类型的话会对你的用户名和密码做一些加密,使得不会被别人抓包轻易抓到,但是这种鉴权的请求配置需要的信息就会更多一些,需要获取到对应Token值等。

Postman变量

我们在Postman中进行一些请求时会需要不断的更改请求的一些信息,这个时候就引入了一个变量的用法。这里介绍Postman中环境变量以及全局变量的配置。这里我们还是以v2ex里的API为例子。

文档地址:https://www.v2ex.com/p/7v9TEc53

测试URL:https://www.v2ex.com/api/nodes/show.json?name=python

这个URL用来获得指定节点的名字,简介,URL以及头像图片的地址

1.环境变量设置

新建一个请求,将测试的URL复制进去后,点击Send。

这里name的值直接写的是python,请求成功后返回的json字符串中的name对应我们的请求里的name,这里我们将name的值用一个变量来代替,变量的demo:,这里我们name的值设为变量名。

这里变量名标红出错,报错信息提示我们无论是全局变量的还是环境变量,变量信息还没有定义,这里我们点击Environment旁边的“眼睛”可以打开添加。

这里我们添加两个环境变量,这里的test_name要与接口URL那里的保持一致,test_environment里的test_name值是python,test_environment2里面的test_name值是java。

填写好信息,点击add就添加成功了。之后我们在之前Environment里选择我们添加的环境变量。

选择环境变量后,可以观察到之前设置的由红色变成了橘色,鼠标移到我们设定的变量那里会弹出变量可以被使用的信息以及变量相关的配置信息,然后我们点击Send发送请求。

如上图可以看到请求成功,并且name字段和我们变量里配置的字段保持一致,接下来我们切换环境变量,再进行一次请求,再观察请求结果。

这里我们可以看到,返回的name字段已经变成了java。这就是环境变量一个简单的配置及使用,这在接口测试中针对不同环境的测试提供了一种便利。

2.全局变量

全局变量的设置与环境变量的设置大同小异,还是点击刚刚的“眼睛”

看到下面有一个Globals字样,点击右面的Edit。

这里的步骤和设置环境变量是一样的,填写完变量名以及与之对应的变量值,点击save就OK了,回到主页面。

这时候我们在没有选择环境的情况下看到也变成了橘色,说明刚刚设置的全局变量已经生效了,我们将鼠标移到test_name字样上,显示的信息已经确认为是全局变量了,并且显示了全局变量的配置信息,设置好之后点击Send,观察响应结果json字段与我们变量里设置的保持一致,响应状态码200没问题,请求也成功了。

小结

以上是关于Postman中全局变量与环境变量的使用,具体使用的话要结合具体的测试环境来选择配置,进而提高你的测试效率。

创建collection并使用数据驱动测试

这里先做一个简单的collection测试。

1.创建一个简单的collection测试

这里我们接着使用配置变量中的demo,首先需要设置断言检测点,这里先贴上断言的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//断言检测状态码为200
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
//将responseBody获取的数据赋给jsonData
var jsonData = JSON.parse(responseBody);
//获取环境变量里配置的test_name
var test_name = pm.environment.get("test_name");
//在控制行中打印出test_name
console.log(test_name);
//检测Response中的name值与环境变量里设置的name值是否一致
pm.test("返回值name与参数中的name相等", function() {
jsonData.value === test_name;
})

点击Send后,可以请求成功,断言也PASS,接下来我们将其保存为collection。

点击Save选项,弹出储存信息设置

这里的Request name和Request description可以自己定义,并且Request description支持Markdown语言语法。

之前没有创建过collection,这里可以新建一个collection,命名为v2ex。创建完成之后点击左边的collections,就可以找到我们创建的collection了。

找到我们创建的collection,选中后可以看见右面有一个小三角,点击小三角后会弹出这个collection得具体信息,这里我们点击Run,进入到collection Runner,下面依次来介绍collection Runner的配置信息

  • Environment:配置的环境变量选择,这里选择对应的环境变量。
  • Iterations:设置执行的循环次数,这里默认为1。
  • Delay:每次循环次数执行间隔,默认为0ms,可以自行设置。
  • Log Response:这里指响应的log,这里我们选默认的For all requests,打印所有的log。
  • Data:可以从外部选择测试数据文件进行驱动,这也后面我们要介绍的数据驱动。

这里环境变量选择我们配置好的,点击Run。

这里显示测试结果中,2个断言都通过,测试通过。

2.数据驱动运行collection

之前的介绍中,在collection Runner中可以引用外部的测试数据,这里我们新建一个json的测试数据文件test_data.json。

在文件中写入测试数据

1
[{"test_name":"python"},{"test_name":"java"}]

之后我们进入到collection Runner中,选择Select File,找到存放测试数据的文件。

当我们引入测试数据文件后,Environment默认就可以不选择环境了,因为Postman会自动读取文件中的测试数据来覆盖环境变量里设置的数据,因为有两个数据,这里我们循环2次,将2个数据都打印出来,在Data File Type里,因为测试数据文件保存的格式是json,所以这里选择application/json,点击旁边的preview,可以看到我们的数据。

设置好之后就可以点击Run进行运行了,下图为运行结果。

这里看到两次运行都成功了,所有断言判断都通过,这就是运用测试数据来驱动测试的一个简单的校demo。

Postman在命令行运行并且生成测试报告

我们这里之前v2ex的demo为示范,先在Postman中将collection进行导出

导出设置如上图所示,导出格式设置为Collection v2

导出的文件路径与之前设置的test_data保持在一个路径中。这里要在命令行中运行的话需要安装一个newman的插件,具体安装命令如下图:

1
npm install -g newman

这里npm命令需要自行安装Node.js进行配置,由于国内无法翻墙,所以可以使用cnpm命令,需要安装一个淘宝镜像,这里不再过多赘述,请自行查阅资料。安装成功后会有如下信息弹出。

这里可以执行如下命令来进行命令行测试:

1
newman run v2ex.postman_collection.json -d test_data.json -r html,json

其中v2ex.postman_collection.json是刚刚从Postman导出的文件,test_data是测试数据,-d命令指定了所需要的测试数据,-r命令用来指定需要导出的报告格式。

执行结束后命令行也会有相关的结果反馈。接下来查看我们导出的测试报告(这里以html报告为例)

命令行执行的方式在后期测试可以集成在CI工具(例如Jenkins)中去,以自动化构建的形式进行自动化测试,构建更为长期稳定的客观监控。

Postman导出Code

Postman可以将配置好的请求以代码的方式导出,这种方法在某种程度上是比较便利的,在配置栏的最右边找到“Code”字样,然后点击。

点击后可以预览生成的代码,以及可以选择想要的语言进行导出。

这里我们选择Python,当然你也可以选择其它的语言;选择完成后点击右上角的“Copy to Clipboard”就可以复制代码了,下面是之前的demo导出的代码:

1
2
3
4
5
6
7
8
9
10
import requests

url = "https://www.v2ex.com/api/nodes/show.json"
querystring = {"name":"java"}
headers = {
'cache-control': "no-cache",
'Postman-Token': "d474add6-7fae-40ea-bab3-96bcd74607ed"
}
response = requests.request("GET", url, headers=headers, params=querystring)
print(response.text)

这里我们对代码做一些小小的改动,引入Python里自带的unittest来对这个接口进行一个测试,改动后的代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
import unittest

class TestV2ex(unittest.TestCase):

def test_java_api(self):

url = "https://www.v2ex.com/api/nodes/show.json"
for test_name in ['python','java','php']:
response = requests.request("GET", url, params={"name":test_name}).json()
self.assertEqual(response["name"], test_name)
print(response)
print(test_name)

if __name__ == '__main__':
unittest.main()

上述代码采用了数据驱动遍历的方式,分别对test_name为python,java,php进行接口请求,最后对每一次获取到的response以及test_name进行一个输出,接着我们运行代码,下图为运行结果:

总结

综上所述,对Postman接口工具有了一个简单的使用介绍,主要介绍了Postman的安装、发送GET和POST请求、如何使用断言对请求结果做一个检查、关于Cookies的设置和获取、鉴权的使用、变量的配置、如何创建一个简单的collection并使用数据驱动进行测试、在命令行中使用Postman测试并生成测试报告以及导出Code等内容。

在学习使用的过程中,Postman是一款比较强大的接口测试工具,当然还有一些高级用法这里就不再过多介绍了,需大家自己探索学习。