细说postman变量中的local
关于local变量,手册中的原文如下:
Local variables are temporary, and only accessible in your request
scripts. Local variable values are scoped to a single request or
collection run, and are no longer available when the run is complete.
1. 一知半解
按我之前的理解个local变量的生命周期是一次单独的请求。一次最复杂的请求包括如下步骤:
集合pre-request
文件夹pre-request
请求中的pre-request
发送请求, 收到响应
集合test
文件夹test
请求中的test
也就是说,你可以在任何步骤里通过pm.variables.set设置一个变量,然后在其后续步骤中通过pm.variables.get取变量值。但无论如何,变量的生命也仅存在于这单一的一个请求中,不能跨越请求。然而真的是这样么?
2. 跨越请求的local
来看这样一个例子
Test集合中有request1和request2两个请求。
我们在request1的Tests中设置local变量name=lunar, 如下图所示:
在request2中,我们在get请求引用name值。同时在Tests中尝试取request1中的name值。
接下来,我们整体运行一次Test集合
执行后,在postman cosole中可以看到如下结果:
这说明我们在request2中可以取到request1中的name值!但name是local类型啊!居然跨越了请求!
3. 好像又不行了
还是2中的例子,我们换一种执行方式。
我们用手动send方式,分别发送request1和request2
执行后在postman console中看到如下结果:
很明显,request2中没能取到request1中设置的name。弄啥嘞!
4. 深入
再来好好看看手册中的这句话:
Local variable values are scoped to a single request or collection run
首先,local变量的作用范围是a single request run,也就是单一请求执行。这也是为什么会出现第3部分中的实验结果。
然后,local变量的作用范围还可以是a collection run! 什么是a collection run呢?就是第2部分中的操作方式了。一个集合中的所有请求,从头至尾执行一遍。整个过程中local变量都是有效的。这也是为什么会出现第2部分中的实验结果。
可见,local变量的生命周期,是一次run!无论是单一请求的一次run,还是集合的一次run。只要这次run没有全部执行完,local变量就是生效的。
5. 实践中的用法
- 类似将请求A中的结果传给请求B使用,可以使用local变量实现了。也就是
pm.variables.set
pm.variables.get
- 如果想在同一集合中实现单次发请求,仍然可以跨请求传数据(第3部分的场景),那么用collection变量比较适合(不得不说,个人认为还是有这种需要求的,比如在写测试时,这样调试比较方便)。collection变量,一旦设置会一直存在,生命跨越所有run!