之前都两篇文章都是一年多之前的事情了。最开始的初衷是想把各种细节都写了,中途因为忙其他事情,就忘记了,放弃了。但我这个博客好像最火的就是这个系列,一直有人评论。针对问的最多的问题,我还是试着看看写下一些东西,看看是否有用吧。。。
虽然postman一直也有在用,但用最简单的方式构建request去测试接口已经满足我日常工作的需求,就很少有动力再去仔细研究了。这两天又看看官网,发现文档变得更全了,功能也变多了。时常有人私信我,问postman能否动态的定制化request的内容。首先,postman就是为custom request而生的,动态的定制化肯定是支持的,只是需要多点研究而已。这篇文章主要介绍postman里面的scripts,搬砖之作,希望对您有帮助。
postman集成了一个强大的,基于nodejs的script引擎,借助它,您可以为requests和collections添加动态的行为。
这样就可以在编写test suite时,构建可以包含动态参数的request,在request之间传递数据等等。您可以在流程中的两个事件中添加要执行的JavaScript代码:
1. 在发送request之前,编写pre-request script,定制化request。
2. 收到response之后,用test script,处理返回的数据。
整个流大概是这样的:
pre-request script就是一段在发送request之前执行的代码。大家可以自己脑补在什么场景可以用到它。比如,随机的URL参数,变化的requst body等。
这里要注意的是,pre-request script和test scripts一样,都是javascript,同时,和angular js一样,可以用两个{{}}访问环境变量。
还是赶紧来举例吧。
最近一直在玩elasticsearch,就用elasticsearch的API来作为例子吧。我们通过GET API,可以获取ES中的数据。我现在从tushare上把新华保险的日线数据导出为json格式的文件,存储到ES当中。每条记录都有一个id。通过postman单个调用接口,大概是这样的:(截图中的url应该是localhost:9200/xhbx/stock-record/_search?q=_id:707)
但是如果我想通过run collections的方式,一次读出100天的数据呢?那就是从712开始,每次request递增1。查询100次。
借助于pre-request script我们可以很方便的实现这个需求。
首先,查看当前的环境变量,点击右上角的眼睛图标:
你可以看到自定义的SampleHost和Globals。
我们可以定一个global变量xhbxId,用于自增。点击上图的Edit。或者点击眼睛图标旁的齿轮图标,添加一个global变量:
然后,配置我们的request使用xhbxId。点击send,你会发现,能够正确请求到id为707的数据:
点击parameter下方的Pre-request scripts选项,编辑我们的脚本:
var temp =parseInt(postman.getGlobalVariable("xhbxId"));
temp +=1;
postman.setGlobalVariable("xhbxId", temp);
脚本的意思是给xhbxId自增1。前面已经说过,pre-request script会在request被发送之前运行,所以,所以每次我们点击send,xhbxId都应该增加1。也就是下一次是708。
另外,这里要注意的是,所有的环境变量或者global变量,都是以字符串的形式存储的,所以我们的自增操作需要先转化为int。
运行结果如图:
很多人也问我,request body的问题。其实和url参数一样,直接引用就是了。
保持我们之前的Pre-request scripts不变。把request的类型改成POST,编辑我们的request body,使用{{xhbxId}}的方式获取参数。本次调用正确的递增了Id为709。
接下来,通过test script测试结果。保持我们之前的Pre-request scripts不变。如果再按一次send,则返回的结果中,应该包含如下字符串:
"_id":"710"
那么,我们就应该在test script里面,测试response里面应该包含如上字符串。test script和pre-request script是一样的,所以我们可以很方便的使用xhbxId作为判断的比较值。
vartemp = postman.getGlobalVariable("xhbxId");
tests["Body matches string"] = responseBody.has("\"_id\":\""+temp+"\"");
1
2
具体操作如下图:
选择Tests
读出xhbxId
放入response body: Contains strings的snippet
运行之后,test的结果是OK的,1/1
710被匹配上。
好了,准备好上面的条件,我们把test case保存到collection当中(我新建了一个叫test_script的collections,不知道怎么操作的话看我的教程2)。运行个100次。
测试通过,接口没问题。这时,运行了100次,global的xhbxId应该从710增加到810了。
确实是这样,postman正确运行。