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" };
|