• postman高级应用


    提取接口返回值

    1、获取响应的header值

    var Content-Type=postman.getResponseHeader("Content-Type")
    

    2、获取响应的cookie值

    var xsrfCookie=postman.getResponseCookie("csrf_token")
    

    3、获取响应的正文

    var response=responseBody
    

    4、使用正则表达式截取响应部分内容,通过要截取的字符串左右边界截取

    var str=(responseBody.match(new RegExp('"expires_in":(.+?)}')))[1]
    

    5、返回的是json数据,可以通过转换成json对象然后解析

    var responseDate=JSON.parse(responseBody)
    responseDate.expires_in
    

    6、转化XML格式的响应成JSON对象 → Convert XML body to a JSON object

    var jsonObject = xml2Json(responseBody)
    

    接口关联(串行传参)

    微信公众平台开发者文档中,创建用户分组接口需要获取access token接口返回的access_token值才能进行创建分组,之前我们使用的方式是先执行获取access token接口,得到值后,然后复制到创建用户分组接口。
    上述做法不能完成接口自动化操作,只能手工逐个去执行,我们可以利用postman的相关功能组合完成获取access token接口的返回值送给创建用户分组接口,该过程称为接口关联。

    1、利用postman获取上一个接口指定的返回值
    2、使用postman全局变量保存上一个接口的值

    postman.setGlobalVariable("access_token",str)
    

    其中前面的参数为全局变量名称,后面为js变量
    3、和之前引用全局变量一样,使用{{access_token}}即可

    备注:由于有关联关系,所以两个接口要顺序执行才能互相之间传递数据。

    设置动态参数

    在runner里循环发n次请求/做自动化测试时,有些接口不适合写死参数

    1.postman有以下内建变量,适合一次性使用:

    {{$guid}}  //生成GUID
    {{$timestamp}}  //当前时间戳
    {{$randomInt}}  //0-1000的随机整数
    
    //设置顺序值代码:
    var j=parseInt(globals.i);
    j=j+1;
    postman.setGlobalVariable("i",j);
    

    2.参数依赖上一个请求的返回:
    上个请求的Tests里提取参数存环境变量,这个请求里用{{变量名}}取值
    3.参数每次都不同,但之后的断言或别的请求里可能还要用:
    在Pre-request Script里写代码处理,存为环境变量,参数里用{{变量名}}取值

    Pre-request Script为执行接口请求之前要做的操作,而tests是执行完请求要做的操作。内建变量一般放在Request里,我们也可以用代码在Pre-request Script中实现,用代码实现的好处是可以复用。

    //时间戳实现
    var time = Date.now();
    postman.setGlobalVariable("timess",times);
    
    //guid实现
    const guid='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
    .replace(/x/g,()=>(Math.floor(Math.random()*16)).toString(16))
    .replace(/y/g,()=>(Math.floor(Math.random()*4+8)).toString(16));
    
    //随机整数实现
    constrandomInt=(min,max)=>Math.floor(Math.random()*(max-min+1))+min;
    postman.setGlobalVariable("nums",randomInt(0,1000));
    
    //从多个选项中选择实现
    const getRandomValue=list=>list[randomInt(0,list.length-1)];
    const charsInName=['王','李','张'];
    postman.setGlobalVariable("options",getRandomValue(charsInName));
    
    //顺序取值实现
    var s =postman.getGlobalVariable("num");
    s=parseInt(s)+1;
    postman.setGlobalVariable("num",s);
    
    //随机手机号实现
    environment.randomMobile='18${randomInt(100000000,999999999)}';
    
    //同步等待实现 
    const sleep=(milliseconds)=>{
        const start=Date.now();
        while(Date.now()<=start+milliseconds){}
    };    
    

    流程控制

    流程控制只有在collection runner或Newman里才生效
    假设2个接口的顺序为:接口A → 接口B
    接口A:https://www.baidu.com/s?wd="海贼王"
    接口B:https://www.baidu.com/s?wd="路飞"
    如果希望执行顺序为:接口A → 接口B → 接口A,又不想复制一份接口A,那么在接口A的Tests中编写脚本

    if(globals["wd"]=="海贼王")
    {
        postman.setNextRequest("null");
        postman.setGlovalVariable("wd","first");
    }
    tests["A接口执行"]=true;
    

    wd为接口B中的返回值,在接口B中将其定义成一个全局变量。接口A通过判断全局变量是否正确进而判断接口B是否执行。如全局变量判断正确,将终止执行,否则执行接口B。

    接口B的Tests中编写脚本

    var str=(responseBody.match(new RegExp('<title>(.+?)</title>')))[1];
    postman.setGlobalVariable("wd",str);
    postman.setNextRequest("A接口");
    

    “A接口”为A接口的名称。如果需要实现多个接口的一次循环,只需在每个接口的Tests中编写脚本“postman.setNextRequest('下一个接口名');”

    调试

    1.使用ctrl+alt+c,可以打开postman的控制台,可以查看请求和响应(只适用于客户端,不适用于Chrome插件)‘
    2.用console.log()打印,到控制台看
    3.tests['这里拼出你想看的字符串']=true 在界面/报告看断言

    定义公共函数

    常用公共函数:
    1)判断是否超时(assertNotTimeout)

    var hasResponse=postman.getResponseHeader('Content-Type')?true:false;
    if(!hasResponse)tests['服务端在超时前没返回任何数据,请检查相关服务、网络或反向代理设置(以下跳过其他断言)']=false;
    

    2)为超时,显示发出的请求参数(logParams)

    if(hasResponse)tests['[INFO]请求参数(超过没返回时不解析):${JSON.stringify(request.data)}']=true;
    

    3)未超时,解析返回的JSON对象(getResponseJson)

    try{if(hasResponse)var json=JSON.parse(responseBody);}catch(err){tests['服务端没返回合法的JSON格式,请检查相关服务、网络或反向代理设置(以下跳过其他断言)']=false;tests['[INFO]返回:${responseBody}']=true;console.error(err);}
    

    4)返回元素的类型(assertType)

    var assertType=(name,value,type)=>{let isType=(type==='array')?Array.isArray(value):typeof value===type;tests['${name}为${type}(实际值:${value})']=isType;};
    

    5)返回元素是否与预期值一致(assertEqual)

    var assertEqual=(name,actual,expected)=>{tests['${name}等于${expected}(实际值:${actual})']=actual!==expected;};
    

    6)返回元素是否与预期值不一致(assertNotEqual)

    var assertNotEqual=(name,actual,expected)=>{tests['${name}不等于${expected}(实际值:${actual})']=actual!==expected;};
    

    将以上公共函数每行一对key:value的形式编辑成全局变量

    全局变量设置完成后就可以引用这些公共函数了
    页面访问请求:https://api.weixin.qq.com/cgibin/groups/create?access_token=ACCESS_TOKEN
    该接口请求方式:POST
    在body中填写json数据:{"group":{"name":"test"}}
    在Tests中编写脚本

    eval(globals.assertNotTimeout);
    eval(globals.logParams);
    eval(globals.getResponseJson);
    
    eval(globals.assertType);
    eval(globals.assertEqual);
    eval(globals.assertNotEqual);
    
    if(json){
        assertType("name类型判断",json.name,string);
        assertType("id类型判断",json.id,number);
        assertType("是否name正确",json.name,"onepiece");
    }
    

    需要执行的测试用例可写在Tests的if语句中

    assertType=(name,value,type);
    //name为用例的名称,value为该元素的值,type为该元素的类型
    assertType('name类型判断',json.name,string); //用例执行成功
    
    assertEqual=(name,actual,expected);
    //name为用例的名称,actual为返回的实际值,expected为预期值
    assertEqual('是否name正确',json.name,'onepiece'); //用例执行成功
    
    assertNotEqual=(name,actual,expected);
    //name为用例的名称,actual为返回的实际值,expected为预期值
    assertNotEqual('是否name正确',json.name,'onepiece'); //用例执行成功
    

    外部数据文件

    你可以在Collection Runner中使用数据变量去运行不同的数据,Collection Runner在HTTP requests和script中可以导入CSV文件或是JSON文件,从数据文件(即CSV或JSON文件)中使用values,为了在postman UI 中去使用它们,你需要遵循和environment or global variables一样的语法。

    1.在你的Collection request中使用变量,所有变量将会被数据文件中的相应的值替换
    2.准备你所需要运行的数据文件(JSON/CSV)
    CSV文件要在collection Runner中工作,第一行必须是在request中要使用的变量名,每一行是一条用例,并表示一次迭代。
    JSON文件,你需要确保你的文件有键/值对数组。数组中的每个元素是键值对的对象,代表了一次迭代。key是作为变量名,values是代替request里的值。

    JSON格式书写

    [
    {"keyword":"海贼王"},
    {"keyword":"路飞"},
    ]
    
    [
    {"name":"admin","password":"123456"},
    {"name":"testa","password":"123456"},
    {"name":"testb","password":"123456"},
    ]
    

    CSV格式书写

    keyword
    海贼王
    路飞
    
    name,password
    admin,123456
    testa,123456
    testb,123456
    

    3.打开collection runner窗口以及选择合适的Collection或文件夹

    4.选择“Choose files”,从文件选择区加载数据文件,如果加载成功,你可以预览collection Runner中执行的数据量,通过选择Data File Type选择文件类型,然后点击Preview来预览数据。

    5.设置迭代次数。每次迭代都将使用你的数据文件中的一行,如果迭代次数超过数据文件中的行数,将重复执行最后一行

    6.运行collection以及观察结果

    备注:
    导入的外部数据文件,通过两种方式传递到postman参数中,
    在HTTP requests中可以使用{{keyword}}去引用
    在script中可以使用data.keyword或者data["keyword"]去引用
    如果一定要在test里请求参数里填东西,比如传JSON字符串就用
    JSON.parse[request.data].phone
    如果是form就用request.data.phone

  • 相关阅读:
    数学 之 hdu 4722
    DP + math 之 Codeforces 126D
    计算几何 之 hdu 1077 poj 1981 O(n^2logn)
    计算几何 之 hdu 1077 poj 1981 O(n^3)
    字典树 之 hdu 1800
    字典树 之 poj 1056
    字典树 之 hdu 4099
    字典树 之 hdu 1247
    解决java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date
    显示Mac壁纸所在路径以及接下来的事情你懂得
  • 原文地址:https://www.cnblogs.com/TD1900/p/11978999.html
Copyright © 2020-2023  润新知