Jmeter自动化-先登录再获取Cookie进行业务操作(跨线程组进行变量调用)

相信做过自动化测试的朋友经常会遇到这样的场景:我想调系统的某个接口进行操作业务,但是需要先登录系统。本文主要是通过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. 贪婪和非贪婪

提到正则表达式,必须要说一下匹配的两种模式:贪婪和非贪婪。

1、贪婪与非贪婪模式是两种不同的表达式匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配,即匹配第一个。

2、下面举个例子,假设有如下响应结果(只截取了其中一部分):

"code":"0","msg":"请求成功","bizSeqNo":"1804242UD01154300109392900987311" ,"result":{"bizSeqNo":"1804242UD01154300109423800987316","transactionTime":"20180424094239"

3、现在从中提取bizSeqNo的值:

"bizSeqNo":"(.*)":贪婪模式,提取结果是:1804242UD01154300109392900987311" ,"result":{"bizSeqNo":"1804242UD01154300109423800987316","transactionTime":"20180424094239

"bizSeqNo":"(.*?)":非贪婪模式,提取结果是:1804242UD01154300109392900987311

大家可以自行体会一下其中的差别。
 

 

相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页