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状态200(OK)状态代码表示该请求已经被成功地处理在服务器上。响应有效负载取决于为请求选择的HTTP方法
HTTP状态201指示作为HTTP POST
请求的结果,已在服务器上成功创建了一个或多个新资源
HTTP状态202
表示已接受处理请求,但处理尚未完成。当实际操作本质上是异步时,此状态代码很有用
其目的是允许服务器接受对某些其他进程的请求(可能是每天只运行一次的面向批处理的进程),而不要求用户代理与服务器的连接持续到进程完成为止
通过此响应返回的实体应该描述请求的当前状态,并指向(或嵌入)状态监视器,该监视器可以向用户提供(或不具有)对请求何时将被满足的估计
HTTP状态204 (No Content)
表示服务器已成功完成请求,并且在响应有效负载正文中没有要发送的内容。服务器可能希望以entity-headers的形式返回更新的元信息,如果存在,应该将其应用于当前文档的活动视图(如果有的话)
204响应绝不能包含消息体,因此总是在头字段之后的第一个空行终止
默认情况下,204 (No Content)
响应是可缓存的。如果需要覆盖缓存,则响应必须包括缓存各自的缓存头
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("请求头参数");
});