『政善治』Postman — 9.Pre-request Script的使用

Postman测试沙箱其实是结合JS脚本和内置断言函数,来完成测试中的断言功能,在请求发起前后实现部分测试操作。

常用功能:

  • 请求前脚本(pre-request scripts)设置请求前置操作如设置变吊等。
  • 请求后脚本(tests)对状态码、响应头、响应正文等信息进行断言操作。

1、Pre-request Script介绍

Pre-request Script是请求发送之前需要执行的代码片段。

提示:在一个请求或者一个集合都可以定义Pre-request Script,在集合中定义Pre-request Script,表示集合中的每一个请求发送前,都需要执行Pre-request Script中的js脚本。

作用或者需求:准备数据。

  • 请求参数中包含一个随机数。
  • 请求header中包括一个时间戳。
  • 请求参数需要加密。

等等。

点击请求中的Pre-request Script标签项,如下图:

我们可以在上图看到,在Pre-request Script标签页的右侧边栏中,Postman为我们提供了一些常用的代码模版。

提示我们:

Pre-request scripts are written in JavaScript.
and are run before the request is sent.
请求前脚本是用JavaScript编写的。
并在发送请求之前运行。

Learn more about pre-request scripts。
点击这里,可以学习更多关于pre-request scripts的资料。

这里学习关于pre-request scripts的更多用法:
https://learning.postman.com/docs/postman/scripts/pre_request_scripts/

2、常用SNIPPETS(片段)说明

(1)获取变量脚本:

  • Get an environment variable

    // 获取一个环境变量
    // 1.pm表示postman
    // 2.environment表示环境变量
    // 3.get表示获取
    pm.environment.get("variable_key");
    
  • Get a global variable

    // 获取一个全局变量
    pm.globals.get("variable_key");
    
  • Get a variable

    // 获取一个变量(本地)
    pm.variables.get("variable_key");
    
  • 获取集合变量的脚本

    var collectionVariable = pm.collectionVariables.get("variable_key");
    
  • 获取数据变量的脚本

    var iterationData = pm.iterationData.get("variable_key");
    

(2)设置变量脚本:

  • Set an environment variable

    // 设置一个环境变量
    // 1.pm表示postman
    // 2.environment表示环境变量
    // 3.set表示设置
    pm.environment.set("variable_key", "variable_value");
    
  • Set a global variable

    // 设置一个全局变量
    pm.globals.set("variable_key", "variable_value");
    
  • 设置一个变量(本地)

    pm.variables.set("variable_key", "variable_value");
    
  • 设置一个集合变量

    pm.collectionVariables.set("variable_key", "variable_value");
    
  • 设置一个数据变量

    pm.iterationData.set("variable_key", "variable_value");
    

(3)清空变量脚本:

  • Clear an environment variable

    // 清空一个环境变量
    // 1.pm表示postman
    // 2.environment表示环境变量
    // 3.unset表示清空
    pm.environment.unset("variable_key");
    
  • Clear a global variable

    // 清空一个全局变量
    pm.globals.unset("variable_key");
    
  • 其他的变量同理。

(4)Send a request

Postman提供了一个“Send a request”代码段,他是已经封装好的发送请求的方法

pm.sendRequest("https://postman-echo.com/get", function (err, response) {
    console.log(response.json());
});

// 其中,https://postman-echo.com/get表示要发送的请求。
// function中的err表示请求返回的错误信息,response表示响应内容。
// console.log()是postman封装的查看日志的方法,可以调出postman的console控制台来查看代码运行情况,方便调试。

注意:该代码段默认只能发送get请求,且这样直接使用的话无法指定请求头等信息,当然大部分情况下我们不需要单独指定一些请求信息,Postman可以自动帮我们完成准备工作。

示例:在Pre-request Script中自定义发送一个Post请求

// Pre-request Script 中的js代码
// 定义请求数据体
var data = {
    "userName":"admin",
    "password":"123456"
}

// 从环境变量中获取token请求服务地址
var ip = pm.environment.get("ip");
var port = pm.environment.get("port"); 

// 定义请求
const loginRequest = {
  //url: 'http://'+ ip+':'+ port +'/login',
  url: 'http://httpbin.org/post',
  method: 'POST',
  header: ['Content-Type:application/json', 'token:123456'],
  body: {
    mode: 'raw',
    raw: JSON.stringify(data)
  }
};

// 发送请求
pm.sendRequest(loginRequest, function (err, response) {
    console.log(response.json());
});

代码说明:

  • const:是js中用来定义变量的关键字,由const定义的变量不可以修改,而且必须初始化。

  • url:表示要发送的请求url。

  • method:指定请求方法。

  • header:定制请求头信息(很重要,因为你要传json格式的数据的话,需要在这里定义请求头为Content-Type:application/json)。

  • body:表示请求body中携带的参数。

  • JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个JSON字符串。

  • 定义好const变量后再由sendRequest()来发送请求即可。

  • header的写法可以是:

    // 一条头信息
    header: 'Content-Type:application/json',
    
    // 多条头信息
    // 形式一
    header:[
              {"key1":"XXX","value1":"XXX"},
              {"key2":"XXX","value2":"XXX"}
            ]
    
    // 形式二
    header:[
             'key1:XXX',
             'key2:XXX'
         ]
    

(5)总结:

对于Postman中的变量管理,我们最好手动管理,也就是自己手动设置环境变量和全局变量,最好不用脚本来管理Postman中的变量。

参考:https://www.cnblogs.com/hanmk/p/10200887.html

3、示例1

我们以“新增学院”接口为例,如下图:

我们可以在Pre-request Script进行提交数据的准备。

编写如下JavaScript代码:

// 随机生成一个3位数字的id
var dep_id = Math.floor(Math.random()*1000);
pm.environment.set("depid" , dep_id); //设置到环境变量中

// 随机生成学院名称dep_name
// 随机生成一个10位的字符串
var data = Math.random().toString(36).slice(-10) ;
var dep_name = data+"学院";
pm.environment.set("dep_name" , dep_name);//设置到环境变量中

// 随机生成院长的名字
var first_name = ["赵","钱","孙","李","刘"];
var last_name = ["子鼠","丑牛","寅虎","牟兔","辰龙","巳蛇"];
var master_name = first_name[Math.floor(Math.random() * (first_name.length))] +last_name[Math.floor(Math.random() * (last_name.length))];
pm.environment.set("master_name" , master_name);//设置到环境变量中

// 随机生成口号
var slogan_str = ["吃饭","睡觉","打豆豆"];
var slogan = slogan_str[Math.floor(Math.random() * (slogan_str.length))];
pm.environment.set("slogan" , slogan);//设置到环境变量中

//代码很low,就是演示。

然后填写Post请求,以Json格式数据为例,参数中引用Pre-request Script脚本中添加到环境变量中的变量。

这样就能够完成自动生成数据,来完成接口的测试。

提示:

我们在实际工作中,不用这种方式准备数据,上面的例子只是说明Pre-request Script的作用。

在实际工作中,我们使用参数化来批量准备数据。

在接口测试中,有些参数是需要自动生成的,且这些参数并不参与逻辑关系。

比如说时间戳,并不会参与接口中的逻辑关系,只起到校验的作用。我们提交的时间戳参数,要和服务器的时间戳进行对比,比如我们上传的时间戳和服务器的时间戳不能超过5秒钟,如果超过5秒则不能请求成功。

所以我们需要在Pre-request Script中把时间戳生成,然后保存到环境变量中,最后再提交的参数中获取到环境变量中的刚刚保存的时间戳数据。(就如同上面步骤)

// js获取当前时间戳
// 第一种方法:(这种方法只精确到秒)
var timestamp = Date.parse(new Date()); //1613702922000

// 第二种方法:
var timestamp = (new Date()).valueOf(); //1613702956959

// 第三种方法:(推荐)
var timestamp = new Date().getTime(); //1613703043378

pm.environment.set("timestamp" , timestamp);//设置到环境变量中

请求头中所需要的数据也是一样的操作。

还有一点要提示的,如果在发送请求之后,提示js代码有错误,可以点击Postman下边框的Console控制台,来查看错误的详细信息。

4、示例2

同理,我们也可以在Body中使用其他的数据提交格式,来接收使用Pre-request Script定义在环境变量中的数据。

如下图:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容