Postman:脚本应用_pm对象

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:20   2701   0

pm对象

pm对象包含与正在执行的脚本有关的所有信息,并允许访问正在发送的请求的副本或接受到的响应,它还允许获取和设置环境变量和全局变量


pm.info对象

pm.info对象包含与正在执行的脚本有关的信息,如请求名称、请求ID和迭计数等有用信息储存在该对象中

方法描述结果类型
pm.info.eventName输出脚本是在哪个脚本栏中执行的字符串类型
pm.info.iteration输出当前运行迭代的次数(从0开始)数值类型
pm.info.iterationCount输出计划运行的迭代总数数值类型
pm.info.requestName 返回请求名字符串类型
pm.info.requestId 返回请求ID 字符串类型

例1:pm.info.eventName
1、用于返回:输出脚本是在哪个脚本栏中执行的

2、可以写法Tests栏下也可以写在Pre-request Script栏下


例1_1:
1、其余四个方法主要是返回与集合运行器相关的信息

2、下面例子中集合中共有2个请求,迭代运行次数为3(每个请求执行3次)

pm.sendRequest对象

1、pm.sendRequest对象允许异步发送HTTP/HTTPS请求。简单的来说就是:用户有一个繁重的计算任务或需要发送多个请求,那么现在可以在后台执行该逻辑。用户可以指定一个回调函数,并在底层操作完成时得到通知,而不是等待调用来完成(因为这会阻碍任何下一个请求)

2、该方法接收一个兼容SDK的请求和一个回调。回调接收两个参数,其中一个是错误(如果有的话),另一个是SDK兼容的响应

3、该方法可以在预请求或测试脚本中使用

4、感觉就是:pm.sendRequest()方法接收两个参数,一个URL(请求信息)和一个函数;函数又接收两个参数:第一个URL参数的响应(错误和正确响应),Postman内部将第一个URL参数的响应赋值给两个变量err,res(即err,res就是脚本请求的错误响应或正确响应,如果要对脚本请求的响应进行处理的话,就可以使用err,res来处理)

例2:发送get请求

pm.sendRequest("https://postman-echo.com/get?name=mouse",function(err,res){
    if (err){
        console.log(err);
    }else{
        name = res.json()["args"]["name"];
        //name = res.json().args.name;也可以这么写
        pm.environment.set("name",name);
    }
    
});

例2_1:发送get请求并断言

pm.sendRequest("https://postman-echo.com/get?name=mouse",function(err,res){
    if (err){
        console.log(err);
    }else{
        pm.test("测试描述",function(){
           pm.expect(err).to.equal(null);
           pm.expect(res).to.have.property("code",200);
           pm.expect(res).to.have.property("status","OK");
        });
    }
});

注:
关于脚本请求更多的例子可以参考前面的笔记:预请求脚本

pm.globals对象

pm.globals对象包含以下方法可供调用

方法 描述
pm.globals.has("variableName")验证是否存在该全局变量
pm.globals.get("variableName") 获取执行全局变量的值
pm.globals.set("variableName","variableValue") 设置全局变量
pm.globals.unset("variableName") 清除指定的全局变量
pm.globals.clear()清除全部全局变量
pm.globals.toObject()将全局变量以一个对象的方式全部输出

例3:

console.log(pm.globals.has("variableName"));

console.log(pm.globals.toObject());
console.log(typeof(pm.globals.toObject()));

console.log(JSON.stringify(pm.globals.toObject()));//将json对象转为字符串

pm.environment对象

pm.environment对象包含以下方法可供调用

方法描述
pm.environment.has("variableName")检测环境变量是否包含某个变量
pm.environment.get("variableName")获取环境变量中的某个值
pm.environment.set("variableName","variableValue")为某个环境变量设置值
pm.environment.unset("variableName")清除某个环境变量
pm.environment.clear()清除全部环境变量
pm.environment.toObject() 将环境变量以一个对象的方式全部输出

pm.variables对象

1、在Postman中,所有的变量都符合特定的层次结构。在当前迭代中定义的所有变量优先于当前环境中定义的变量,这些变量覆盖全局范围内定义的变量,即迭代数据<环境变量<全局变量

2、pm.variables对象包含以下方法可供调用

方法 描述
pm.variables.get("variableName") 获取变量中的某个值

pm.request对象

1、pm.request对象用来获取请求对象。但request中的参数只可读

2、在"Pre-request Script"选项卡下,pm.request对象表示:将要发送的请求

3、在"Tests"选项卡下,pm.request对象表示:上一个发送的请求(与在"Pre-request Script"选项卡下感觉没什么区别:都是同一个请求)

4、pm.request对象包含以下方法可供调用

方法描述
pm.request 获取当前发起请求的全部headers
pm.request.url获取当前发起请求的url
pm.request.headers 以数组的方式返回当前请求中的header信息

例3:pm.request

var headers = pm.request;
console.log(headers);
console.log(typeof(headers));
console.log(pm.request.body.mode);//获取请求头中具体某个值
console.log(headers.url.host[0]);
//console.log(headers.header[0].key);//不知道为什么这样就不行了(下面有另一种方法)


例3_1:pm.request.url


例3_1:pm.request.headers

pm.response对象

1、在测试脚本中,pm.response对象包含响应有关的所有信息

2、pm.response对象包含以下方法可供调用

方法描述
pm.response.code获取当前请求返回的状态码如200,404,500等
pm.response.reason() 当前请求成功返回OK
pm.response.headers以数组的形式返回当前请求成功后的response的headers
pm.response.responseTime获取执行此次请求的时间单位为ms
pm.response.text()以文本的方式获取响应里面的body的内容
pm.response.json() 将body里面的内容解析为一个json对象

例4:

//获取响应头状态码
var headers_code = pm.response.code;
console.log(headers_code);
//获取响应头状态码文本
var headers_reason = pm.response.reason();
console.log(headers_reason)
//获取响应时间
var headers_time = pm.response.responseTime
console.log(headers_time)


例4_1:响应头
获取响应头中具体某个属性的值时可以使用:postman.getResponseHeader("键名")

var headers_headers = pm.response.headers;
console.log(headers_headers);

//不知道为什么明明返回的是个数组,还不能用索引了,request header也有这个问题
console.log(headers_headers[0]);

//获取响应头中信息的具体值可以用postman.getResponseHeader
var value = postman.getResponseHeader("Transfer-Encoding");
console.log(value);

console.log(postman.getResponseHeader("Date"))


例4_2:

var response_body = pm.response.text();
console.log(response_body);

//其实这个方法就是前面说的:将pm.response方法返回的信息转换成字符串型
var body = pm.response;
console.log(body.text());

例4_3:
1、因为返回的值为json格式,因此可以使用字典的"索引"和列表的索引

2、在查找某个键的值时:
⑴如果响应内容是嵌套的字典格式,则一层层引用即可
⑵如果字典中嵌套了列表,则按照索引引用即可

var response_body = pm.response.json();
console.log(response_body);

//获取json对象中某个键的值:值为字典时就一层层的引用,值为列表时就使用索引
console.log(response_body.translateResult[0][0].src);

//其实这个方法就是前面说的:将pm.response方法返回的信息转换成JSON对象
var body = pm.response;
console.log(body.json());

例4_4:顺便补充下python
1、如果返回结果是字符串型的:要获取字符串中具体某个键的值的话,不能使用遍历的方法,可以将字符串转为字典(前提是字符串是json格式的)

2、个人感觉:不管是在python中还是在js中:只要请求返回的是一个json格式的,就可以直接用python或js处理字典的方式来进行处理了

import json

body = """
{"type":"ZH_CN2EN","errorCode":0,"elapsedTime":2,"translateResult":[[{"src":"心有猛虎,细嗅蔷薇","tgt":"The heart has the tiger, fine smell rose"}]]}"""
result = body.split(",",3)[3]
print(result)
print("--------------------")
"""
因为返回的是字符串型的。因此肯定就不能有字符串的遍历了:字符串里面的每一个符号、每一个字都是一个元素
因此可以用字符串的分片、正则表达式等
因为字符串是json格式的字符串,因此可以使用json.loads()方法将json格式的字符串转为字典,再用字典的索引
"""

new_body = json.loads(body)
print(new_body)
print(type(new_body))
print(new_body['translateResult'])

print("--------------------")
#字典的遍历:只会遍历出字典的键
body_json = {"type":"ZH_CN2EN","errorCode":0,"elapsedTime":2,"translateResult":[[{"src":"心有猛虎,细嗅蔷薇","tgt":"The heart has the tiger, fine smell rose"}]]}
for i in body_json:
    print(i)

#字典的"索引"
print(body_json["translateResult"])

"""
"translateResult":[[{"src":"心有猛虎,细嗅蔷薇","tgt":"The heart has the tiger, fine smell rose"}]]}
--------------------
{'errorCode': 0, 'elapsedTime': 2, 'type': 'ZH_CN2EN', 'translateResult': [[{'tgt': 'The heart has the tiger, fine smell rose', 'src': '心有猛虎,细嗅蔷薇'}]]}
<class 'dict'>
[[{'tgt': 'The heart has the tiger, fine smell rose', 'src': '心有猛虎,细嗅蔷薇'}]]
--------------------
errorCode
elapsedTime
type
translateResult
[[{'tgt': 'The heart has the tiger, fine smell rose', 'src': '心有猛虎,细嗅蔷薇'}]]
"""


例4_5:响应内容格式相互转换
1、JSON.parse():从一个字符串中解析出json对象

2、JSON.stringify():从一个对象中解析出字符串

//返回json型响应
var body_json = pm.response.json();
//将json格式的响应转为字符串
console.log(JSON.stringify(body_json));
console.log(typeof(JSON.stringify(body_json)));

//返回string型响应
var body_str = pm.response.text();
//将字符串格式的响应转为json对象
console.log(JSON.parse(body_str));
console.log(typeof(JSON.parse(body_str)));

pm.cookies对象

pm.cookies对象包含一个与请求所创建的域相关联的Cookies列表

方法描述
pm.cookies.has("cookieName")检查请求的url站点是否存在cookie,返回值Boolean
pm.cookies.get("cookieName")获取存在的cookie的值
pm.cookies.toObject将请求的url站点中获取到的所有存在的cookie输出到一个对象中去

例5:

//判断该请求域下是否有指定的Cookies
console.log(pm.cookies.has("OUTFOX_SEARCH_USER_ID"));
console.log(pm.cookies.has("sails.sid"));

//在该请求域下获得指定键名Cookies的值
console.log(pm.cookies.get("OUTFOX_SEARCH_USER_ID"));
console.log(pm.cookies.get("sails.sid"));

//在该请求域下以对象的形式返回Cookies的键值对
console.log(pm.cookies.toObject("OUTFOX_SEARCH_USER_ID"));
console.log(pm.cookies.toObject("sails.sid"));
//可以使用JSON.stringify()方法将json对象转为字符串型
console.log(JSON.stringify(pm.cookies.toObject("OUTFOX_SEARCH_USER_ID")));

:从上面例子的输出可以看出
1、pm.cookies.has()方法:是用于判断该请求域下是否存在指定的cookies,不存在或存在与其他请求域时,返回空

2、pm.cookies.get()方法:用于获取该请求域下指定键名的cookies的值,不存在或存在与其他请求域时,返回NULL

pm.iterationData对象

iterationData对象包含数据集运行期间提供的数据文件,主要方法有如下

方法描述
pm.iterationData.get("variable") 获取指定变量的值
pm.iterationData.toObject 将数据文件集转化成一个对象



Postman中的Test

在Postman中用于测试、断言的函数主要有如下

方法描述
pm.test("testName", specFunction)测试方法,第二个方法中填写测试内容
pm.expect(assertion:*)断言

注:
1、pm.test("testName", specFunction):此函数用于在沙箱中编写测试规范。在这个函数中编写测试可以准确地命名测试,并确保在这个函数内出现任何错误的情况下,脚本的其余部分不会被阻塞

2、pm.expect是一个通用的断言函数。这个是ChaiJS expect BDD库,使用这个库可以编写可读性很高的测试 。pm.expect用于处理来自响应或变量的数据断言

3、pm.test()方法用于创建一个测试(告诉Postman这是测试)。其接受两个参数,一个是测试的相关描述,一个是一个函数:用于执行断言相关的语句

例6:

pm.test("response should be okay to process", function () {
      pm.response.to.not.be.error;//这种也是断言的一种
      pm.response.to.not.have.jsonBody('error');
  });

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

测试脚本中的响应断言API

Postman提供的测试脚本响应断言包含以下API:pm.response.to

方法 描述
pm.response.to.have.status(code:Number) 根据状态码判断响应是否成功
pm.response.to.have.status(reason:String)根据返回的状态值判断响应是否成功
pm.response.to.have.header(key:String)根据response中的headers的key判断响应是否成功
pm.response.to.have.header(key:String, optionalValue:String)对response中的header中的key和value校验,判断响应是否成功
pm.response.to.have.body()获取响应返回的资源
pm.response.to.have.body(optionalValue:String)对响应返回的body内容校验,判断响应是否成功
pm.response.to.have.body(optionalValue:RegExp) 对响应返回的body进行正则校验,判断响应是否成功
pm.response.to.have.body(optionalValue:RegExp) 判断响应返回的body是否是json,判断响应是否成功
pm.response.to.have.jsonBody()
pm.response.to.have.jsonBody(optionalExpectEqual:Object)
pm.response.to.have.jsonBody(optionalExpectPath:String)
pm.response.to.have.jsonBody(optionalExpectPath:String, optionalValue:*)

例7:

pm.response.to.be.*对象

通过pm.response.to.be对象属性,可以断言预定义的规则(判断当前请求响应的状态值)

方法描述
pm.response.to.be.info 检查响应码是否为1XX,如果是则断言为真,否则为假
pm.response.to.be.success 检查响应码是否为2XX,如果是则断言为真,否则为假
pm.response.to.be.redirection 检查响应码是否为3XX,如果是则断言为真,否则为假
pm.response.to.be.clientError 检查响应码是否为4XX,如果是则断言为真,否则为假
pm.response.to.be.serverError 检查响应码是否为5XX,如果是则断言为真,否则为假
pm.response.to.be.error 检查响应码是否为4XX或5XX,如果是则断言为真,否则为假
pm.response.to.be.ok检查响应码是否为200,如果是则断言为真,否则为假
pm.response.to.be.accepted检查响应码是否为202,如果是则断言为真,否则为假
pm.response.to.be.badRequest检查响应码是否为400,如果是则断言为真,否则为假
pm.response.to.be.unauthorised检查响应码是否为401,如果是则断言为真,否则为假
pm.response.to.be.forbidden 检查响应码是否为403,如果是则断言为真,否则为假
pm.response.to.be.notFound检查响应码是否为404,如果是则断言为真,否则为假
pm.response.to.be.rateLimited 检查响应码是否为429,如果是则断言为真,否则为假

例8:

拓展:

测试脚本

在Postman中关于测试脚本有不同的写法;且同样的断言也有不同的写法

例1:

//检查response body中是否包含某个string
pm.test("测试1:检查响应是否含有某个字符串", function () {
    pm.expect(pm.response.text()).to.include("心有猛虎,细嗅蔷薇");
});

tests["测试2:检查响应是否含有某个字符串"] = responseBody.has("心有猛虎,细嗅蔷薇");

//检测JSON中的某个值是否等于预期的值
var data = JSON.parse(responseBody);
tests["测试3:某个值是否等于预期的值"] = data.translateResult[0][0].src === "心有猛虎,细嗅蔷薇";

//检查json中某个数组元素的个数(这里检测programs的长度)
var data = JSON.parse(responseBody);
tests["测试4:检查某个数组元素的个数"] = data.translateResult.length === 1;

获取request.data值

1、本文章前面说过一个pm.request对象,用该对象在获取headers信息时,会有点问题,因此这里介绍另一种

2、获取请求头可以使用这个方法,获取响应头可以使用postman.getResponseHeader方法

方法描述
request.data用于获取请求头的表单内容
request.headers 用于获取请求头
request.method 用于获取请求的请求方法
request.url 用于获取请求的URL

例2:

数据转换时报错

在使用JSON.parse()方法进行数据转换时,报错:JSONError | Unexpected token 'o' at 1:2 [object Object] ^
1、首先看下函数作用
⑴JSON.parse():用于从一个字符串中解析出json对象
⑵JSON.stringify():用于从一个对象解析出字符串

2、报错的原因:
因为要转换的数据本来就是object,这个方法是把一个字符串解析出json对象,再转换就会报错

3、为什么会有这样的错误:
因为把Object作为参数传到JSON.parse()里时,它会默把Object转为string,
就会先调用原型上的toString()方法;结果为”[object Object]”,JSON.parse将第一个字符’[‘理解为数组的开始,第二字符’o’不知道怎么处理;所以就抛出了上面的错误信息 Unexpected token o in JSON at position 1。

4、JSON字符串:

var str1 = '{ "name": "cxh", "sex": "man" }'; 

5、JSON对象:

var str2 = { "name": "cxh", "sex": "man" };

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP