postman接口测试&restful API测试

Chrome安装Postman Interceptor插件

下载Postman Interceptor插件

在谷歌应用商店chrome://extensions/  拖拽插件即可

点击Capture Requests 不需要配置端口,点击第二个tab 如遇 报js错误

进入到 /Users/qa/Library/Application Support/Google/Chrome

mkdir NativeMessagingHosts 创建文件夹

chmod 777 NativeMessagingHosts  赋值777

ll|grep NativeMessagingHosts

drwxrwxrwx   3 qa  staff    96B  9  1 18:25 NativeMessagingHosts

如果/Users/qa/Library/Application Support/Google/Chrome无NativeMessagingHosts文件夹,则需要创建且赋值777

怎么说呢,我从业很多年没用过postman自动化,一直拿他调试接口。觉得还是得基于自己封装的框架去写自动化。最近研究了1小时,基本语法够用了。。。本文章介绍postman基本语法,postman返回结果取header内容,postman动态取返回字段 时间戳,postman接口上下游依赖

restful风格

参考 HTTP状态201(Created) | RESTful API 中文网

http状态码

1. HTTP状态200(OK)

HTTP状态200(OK)状态代码表示该请求已经被成功地处理在服务器上。响应有效负载取决于为请求选择的HTTP方法

2. HTTP状态201(Created)

HTTP状态201指示作为HTTP POST请求的结果,在服务器上成功创建一个或多个新资源

3. HTTP状态202(Accepted)

HTTP状态202表示已接受处理请求,但处理尚未完成。当实际操作本质上是异步时,此状态代码很有用

其目的是允许服务器接受对某些其他进程的请求(可能是每天只运行一次的面向批处理的进程),而不要求用户代理与服务器的连接持续到进程完成为止

通过此响应返回的实体应该描述请求的当前状态,并指向(或嵌入)状态监视器,该监视器可以向用户提供(或不具有)对请求何时将被满足的估计

4. HTTP状态204 (No Content)

HTTP状态204 (No Content)表示服务器已成功完成请求,并且在响应有效负载正文中没有要发送的内容。服务器可能希望以entity-headers的形式返回更新的元信息,如果存在,应该将其应用于当前文档的活动视图(如果有的话)

204响应绝不能包含消息体,因此总是在头字段之后的第一个空行终止

默认情况下,204 (No Content)响应是可缓存的。如果需要覆盖缓存,则响应必须包括缓存各自的缓存头

postman的js脚本学习

Postman:脚本应用_pm对象_不怕猫的耗子A的博客-CSDN博客_pm.environment

postman工具快捷键  脚本代码格式化command+B

postman---postman常用的快捷键 - 测试-安静 - 博客园

在实现接口自动测试的时候,会经常遇到接口参数依赖的问题,例如调取登录接口的时候,需要先获取登录的key值,而每次请求返回的key值又是不一样的,那么这种情况下,要实现接口的自动化,就要用到postman中设置环境变量这个功能了

1. 获取登录接口的token,get请求,200

Pre-Request-Script前置条件,设置全局变量

// 声明变量

var moment = require('moment');

var current_timestamp = moment().format("YYYY-MM-DD-HH-mm-ss")

var current_timestamp_real = moment().format("YYYY-MM-DD HH:mm:ss")

// 设置全局变量

pm.globals.set("timestamp",current_timestamp);

pm.globals.set("timestamp_real",current_timestamp_real);

var current_time=moment().format("MM-DD-HH-mm-ss");

pm.globals.set("current_timels",current_time);

Tests获取接口返回的token字段

// 判断返回的结果状态码为200-get请求。post请求为201 create

pm.test("Response Code is 200", function () {

pm.response.to.have.status(200);

})

var response = JSON.parse(responseBody);
var oken=response.token.access_token

// 设置token为全局变量

pm.globals.set("Token",token)

// 获取body中返回的所有参数

var response = JSON.parse(responseBody);

var projectlist=response.projects;
 

for(i in projectlist){

var tenant_name=projectlist[i].name

var tenantid=projectlist[i].id

// 用console.log打印日志,相当于java的sout

console.log(tenant_name)

if (tenant_name == "alarm")

{

    pm.globals.set("id",tenantid)

}

}

2. 创建角色接口,post请求,201

Headers里添加刚刚登录接口返回的token

Token  {{token}}

Tests里添加

// post请求状态码为201

pm.test("Response Code is 201", function () {

pm.response.to.have.status(201);

});

var response = JSON.parse(responseBody);

// 设置全局变量角色名称

pm.environment.set("rolename",response.name)

3. 角色列表接口,get请求,200 

Headers里添加刚刚登录接口返回的token

pm.test("Response Code is 200,get请求", function () {

pm.response.to.have.status(200);

});

var response = JSON.parse(responseBody);

pm.test("角色列表接口包含字段roles",function(){

responseBody.has("roles");

});

pm.test("角色列表接口字段JSONObject中的self的值检查",function(){

response.links.self=="http://lecp-dashboard/v3/roles";

});

pm.test("角色列表接口字段数组中的domain_id的值检查",function(){

response.roles[0].domain_id=="default";

});

pm.test("角色列表接口字段数组中的name description的值检查,以及设置name id为全局变量",function(){

var rolename=response.roles[0].name;

console.log("rolename=="+rolename);

// 设置全局变量rolename,供下游接口传参时调用

pm.globals.set("rolename",rolename);

var roleid=response.roles[0].id;

console.log("roleid=="+roleid);

// 设置全局变量roleid,供下游接口传参时调用

pm.globals.set("roleid",roleid);

});

以上console.log打印的日志在控制台console里可以看到调试信息

4. 编辑角色,patch请求,200 

设置请求传参http://{{test_environment}}:31651/api/v1/roles/{{roleid}}的roleid为全局变量传的参数

pm.test("Status code is 200,patch请求", function () {

pm.response.to.have.status(200);

});

var response = JSON.parse(responseBody);

pm.test("编辑角色,返回信息校验",function(){

pm.expect(pm.response.text()).to.include("nrole")

});

pm.test("编辑角色,返回信息长度大于1",function(){

pm.expect(pm.response.text()).to.has.length.above(1)

});

pm.test("编辑角色,返回信息长度不为null",function(){

pm.expect(pm.response.text()).to.not.eqls(null)

});

5. Postman使用全局变量出现全局变量更新后是灰色并被横线划掉,无法调用

问题出来了,token拿到了但是灰色加横线,不可用,然后其他接口也拿不到这个变量的值,然后就各种找问题,网上也没有类似的问题出现,然后又仔细的检查了一遍突然灵光一闪,S13了,全局变量和局部变量有个参数名称一样,马上就知道找到问题原因了。去掉局部变量的参数本来也没有用如果想用可以重命名一下。改完立马可用
 

 修改之后如图

6. Postman传参为上个接口的依赖参数,接口上下游依赖

get请求获取A接口的返回字段,设置为全局变量

var response = JSON.parse(responseBody);

var banner = response.projects;

var renderid = banner[0].id

pm.globals.set("renderid",renderid)

var rendername = banner[0].name

pm.globals.set("rendername",rendername)

var render_site_id = banner[0].site_id

pm.globals.set("render_site_id",render_site_id)

// 用console.log打印日志,相当于java的sout

console.log(renderid)

console.log(rendername)

console.log(render_site_id)

patch请求接口B,传参为A的返回参数 

{

"project": {

"name": "编辑{{rendername}}",

"description": "ls租户描述编辑{{render_time}}",

"sites": ["{{render_site_id}}"],

"enabled": true

}

}

7. Postman传参

添加用户组管理,put请求  {{109}}/api/v1/groups/{{groupsid}}/users/{{userid}}

其中{{groupsid}}{{userid}}变量分别取自于user-groups list 和 user-list接口

groups-list接口   {{109}}/api/v1/groups

pm.test("Status code is 200,get请求", function () {

pm.response.to.have.status(200);

});

pm.test("返回信息长度不为null",function(){

pm.expect(pm.response.text()).to.not.eqls(null)

});

var response = JSON.parse(responseBody);

var banner = response.groups;

var groupsid = banner[0].id

pm.globals.set("groupsid",groupsid)

var groupsname = banner[0].name

pm.globals.set("groupsname",groupsname)

var groupsdescription=banner[0].description

pm.globals.set("groupsdescription",groupsdescription)

// 用console.log打印日志,相当于java的sout

console.log(groupsid)

console.log(groupsname)

console.log(groupsdescription)

user-list接口   {{109}}/api/v1/users

pm.test("Status code is 200,get请求", function () {

pm.response.to.have.status(200);

});

pm.test("返回信息长度不为null", function () {

pm.expect(pm.response.text()).to.not.eqls(null)

});

var response = JSON.parse(responseBody);

var banner = response.users;

for (i in banner) {

var usernameadmin = banner[i].name

if (usernameadmin == "admin") {

pm.globals.set("usernameadmin", usernameadmin)

console.log("打印usernameadmin的值为==" + usernameadmin)

}

}

var userid = banner[0].id

pm.globals.set("userid", userid)

var username = banner[0].name

pm.globals.set("username", username)

var userdefault_project_id = banner[0].default_project_id

pm.globals.set("userdefault_project_id", userdefault_project_id)

var userdescription = banner[0].description

pm.globals.set("userdescription", userdescription)

// 用console.log打印日志,相当于java的sout

console.log(userid)

console.log(username)

console.log(userdefault_project_id)

8. Postman传参

用户组管理-选择租户-添加授权-角色管理,put请求 

{{109}}}/api/v1/projects/{{projectsid}}/groups/{{groupsid}}/roles/{{roleid1}} 

其中{{projectsid}}{{groupsid}}{{userid}}变量分别取自于projects 和 user-groups list 和 user-list接口

10. Postman接口自动化用例个数统计,export导出,搜索header有多少个header就有多少个case

11.  opentask取token 它的token是放在header里的。。。

pm.test("Response Code is 201", function () {

pm.response.to.have.status(201);

})

// 获取接口返回的所有字段

var response = JSON.parse(responseBody);

var osprojectid = response.token.project.id;

pm.globals.set("osprojectid", osprojectid)

console.log("osprojectid==",osprojectid)

// 登录接口返回的token,一般在Response的Body,OpenStack的内部接口返回的token在Response的Header。key值为X-Subject-Token

var ostoken = postman.getResponseHeader("X-Subject-Token");

pm.globals.set("ostoken", ostoken)

console.log("ostoken==",ostoken)



常用断言
1,断言响应状态码是否为200--------postman代码块名称:status code is 200

pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});


2,断言响应体JSON数据校验-------postman代码块名称:response body:JSON value cleck

pm.test("Your test name", function () {
#定义一个变量,接收json类型的response
    var jsonData = pm.response.json();
    #value是响应json数据的键,eql(   )括号里是json数据键对应的值,字符串用“ ”引起来
    pm.expect(jsonData.value).to.eql(100);
});

3,断言响应体是否包含字符串------postman代码块名称:response body:Contains string

pm.test("Body matches string", function () {
    pm.expect(pm.response.text()).to.include("响应数据例的部分字符串");
});```


4,断言响应体是否等于指定字符串------postman代码块名称:response body:is equal to a string

pm.test("Body is correct", function () {
    pm.response.to.have.body("响应数据的body");
});
1

5,断言响应头是否包含指定的头信息-----postman代码块名称:response headers :content_type header check

pm.test("Content-Type is present", function () {
    pm.response.to.have.header("请求头参数");
});
 

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方狱兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值