相信做过自动化测试的朋友经常会遇到这样的场景:我想调系统的某个接口进行操作业务,但是需要先登录系统。本文主要是通过Jmeter实现该操作,先登录系统,然后通过获取登录后的Cookie,将Cookie带到后面的业务操作中。
1. 使用响应断言;
2. 使用正则表达式提取器自动获取想要的文本;
3. 使用BeanShell断言将第一个线程组的变量设置为全局变量,并传递到其它线程组;
4. 使用HTTP Cookie 管理器;
5. 使用HTTP请求;
1. 创建2个线程组,一个是setUp Thread Group,一个就是正常的Thread Group;
2. 第一个线程组里面新建http请求,用于做登录接口;
3. 在登录接口中分别创建响应断言、正则表达式提取器、BeanShell断言;
4. 第二个线程组里面添加“HTTP Cookie 管理器”,并将第一个线程组中获取到的Cookie值使用变量方式放进去;
5. 再使用HTTP请求进行业务操作;
1. 创建第一个线程组,setUp Thread Group线程组,并重新命名为自己觉得更有意义的名字(我这里命名为:预置条件-登录获取token)。
2. 在第一个线程组下面新建一个HTTP请求,用于调登录接口
协议:一般是http或者https
服务器名称或IP:登录接口的IP地址
端口号:登录接口的端口号
方法:一般是post或者get,当然还有其它很多,可以根据实际情况进行选择
路径:需要调用的接口,这里是登录接口,/spacex/login
3. 新增一个查看结果树,新增完后不需要做任何操作,只等执行后查看结果就好,如下是执行后的结果
从上图可以看出来Cookie是存放在信息头中,且是在子接口中获取的
4. 在登录接口下面新增一个正则表达式提取器,用于获取前面登录接口登录成功后的Cookie值
1. Apply to:
- Main sample and sub-samples:作用于主节点的取样器及对应子节点的取样器,从上面那张图中可以看出是子接口
- Main sample only:仅作用于主节点的取样器
- Sub-samples only:仅作用于子节点的取样器,子接口也可以选择这个
- JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称),从指定变量值中提取需要的值。
2. 要检查的响应字段(Field to check):
- 主体:响应报文的主体,最常用
- Body(unescaped):主体,是替换了所有的html转义符的响应主体内容,注意html转义符处理时不考虑上下文,因此可能有不正确的转换,不太建议使用
- Body as a Document:从不同类型的文件中提取文本,注意这个选项比较影响性能
- Response Headers:响应信息头(如果你使用的是中文版的Jmeter,会看到这一项是信息头,这是中文翻译问题,应以英文为准)
- Request Headers:请求信息头
- URL:请求url
- Response Code:响应状态码,比如200、404等
- Response Message:响应信息
3. 引用名称(Reference Name):
Jmeter变量的名称,存储提取的结果;即下个请求需要引用的值、字段、变量名,后文中引用方法是$,跨线程组不可直接使用
4. 正则表达式(Regular Expression):
使用正则表达式解析响应结果,()括号表示提取字符串中的部分值,前后是提取的边界内容,类似于loadrunner中的左边界和右边界。
5. 模板(Template):
正则表达式的提取模式。
如果正则表达式有多个提取结果,则结果是数组形式,模板$1$,$2$等等,表示把解析到的第几个值赋给变量;从1开始匹配,以此类推。
若只有一个结果,则只能是$1$;
6. 匹配数字(Match No):
正则表达式匹配数据的结果可以看做一个数组,表示如何取值:0代表随机取值,正数n则表示取第n个值(比如1代表取第一个值),负数则表示提取所有符合条件的值。
7. 缺省值:
匹配失败时候的默认值;通常用于后续的逻辑判断,一般通常为特定含义的英文大写组合,比如:ERROR等。
5. 新增一个“BeanShell断言”,用于将上面正则表达式中的变量变成全局变量
新增如下内容:
${__setProperty(JSESSIONID,${JSESSIONID})}
其中第一个JSESSIONID是新定义的全局变量,后面跨线程组使用时是使用的这个变量名,第二个JSESSIONID是之前正则表达式中的变量(引用名称)
6. 创建第二个线程组,用于存放业务接口调用
7. 在第二个线程组中新增“HTTP Cookie 管理器”
值:${__P(JSESSIONID)}
JSESSIONID是前面“BeanShell断言”中定义的全局变量名称,这样就可以获取到登录的Cookie值了。
8. 下面就可以开始调用业务接口了,比如这里调用一个查询接口,新增HTTP 请求(该接口必须登录才能调用,因为我们前面登录并将Cookie保存在Cookie管理器中了,所以我们这里就可以直接调用业务接口了)
9. 新增响应断言,用于检查调用结果是否正确,相当于新增检查点
这样这条用例就结束了,总体包含用户登录、通过正则表达式获取Cookie、保存Cookie到Cookie管理器、调用业务接口、检查业务接口是否正确。
提到正则表达式,必须要说一下匹配的两种模式:贪婪和非贪婪。
1、贪婪与非贪婪模式是两种不同的表达式匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配,即匹配第一个。
2、下面举个例子,假设有如下响应结果(只截取了其中一部分):
"code":"0","msg":"请求成功","bizSeqNo":"1804242UD01154300109392900987311" ,"result":{"bizSeqNo":"1804242UD01154300109423800987316","transactionTime":"20180424094239"
3、现在从中提取bizSeqNo的值:
"bizSeqNo":"(.*)":贪婪模式,提取结果是:1804242UD01154300109392900987311" ,"result":{"bizSeqNo":"1804242UD01154300109423800987316","transactionTime":"20180424094239
"bizSeqNo":"(.*?)":非贪婪模式,提取结果是:1804242UD01154300109392900987311
大家可以自行体会一下其中的差别。