1. 背景
为了让大家更多地了解Jmeter并轻松使用它,稍后将添加性能章节.
Debug Sampler将在响应数据中输出我们自定义的变量,这便于我们在调试时使用. 正式执行脚本后,需要删除Debug Sampler.
Dummy Sampler可以更方便地模拟测试场景并自定义请求数据和响应数据,这在学习测试脚本编写的过程中非常有用. 当然,撰写文章时您无法公开公司的界面. 输入太多代码不舒服. 虚拟采样器现在也非常舒适.
{ "resultCode": "1000", "resultMsg": "success", "userdic": { "Ali": "Moubao" }, "userlist": [ { "firstName": "Jiezai", "lastName": "Grizz", "id": 6 }, { "firstName": "Ben", "lastName": "Rose", "id": 8 } ]}
将虚拟采样器的请求数据和响应数据配置为上述json字符串
让我们演示如何提取用户列表的第一个firstName的jiezai值,提取用户列表的第二个firstName的Ben值,以及提取userlist [“ Jiezai”,“ Ben”]的firstName的所有值
在演示之前,我们将讨论我们将使用的JSON Path Extractor(也是Jmeter扩展的第三方插件)的语法.
$代表整个对象. 代表绝对路径,..代表相对路径,[0]代表列表的第一个值,[0,1]和[: 2]都代表列表的前两个元素
$. userlist
$. userlist [*]
$. userlist [-1: ]
$ .. userlist [?(@. id> 7)]
$ .. firstName
五个表达式的输出如下:
》》》 [{“” FirstName“: ” Jiezai“,” lastName“: ” Grizz“,” id“: 6},{” firstName“: ” Ben“,” lastName“: ” Rose“,” id“ : 8}]
》》》 [{“” FirstName“: ” Jiezai“,” lastName“: ” Grizz“,” id“: 6},{” firstName“: ” Ben“,” lastName“: ” Rose“,” id“ : 8}]
》》》 [{“ firstName”: “ Ben”,“ lastName”: “ Rose”,“ id”: 8}]
》》》 [{“ firstName”: “ Ben”jmeter中正则表达式大全,“ lastName”: “ Rose”,“ id”: 8}]
》》 [[Jiezai],“ Ben”]
PS:
1. 正则表达式提取器-“ value =”(. +?)“-”模板$ 1 $
(): 封装要返回的匹配字符串. . : 匹配任何单个字符串.
+: 一次或多次. ?: 找到第一个匹配项后停止.
2. JSON路径提取器的使用-“,请参阅:
阅读它之后,我知道它几乎是无所不能的,因为它具有自己的语法,例如Xpath.
1. 提取用户列表中第一个名字的值jiezai
每个人都应该非常擅长此事. 使用Jmeter提取json数据的任何人都知道
使用正则表达式提取器: “ firstName”: “(. +?)”
在Debug Sampler test3 = Jiezai中提取结果
使用JSON路径提取器
JsonPath表达式: $ .. userlist.firstName [0]
在Debug Sampler test3 = Jiezai中提取结果
2,提取用户列表Ben的第二个firstName的值
使用正则表达式提取器: “ firstName”: “(. +?)”
或使用正则表达式提取器: “ firstName”: “(. +?)” *“ firstName”: “(. +?)”
说明,模板代表正则表达式的数字“(. +?)”.
JsonPath表达式: $ .. userlist.firstName [1],该图被省略.
在Debug Sampler test4 = Ben中提取结果
3. 提取userlist [“ Jiezai”,“ Ben”]的所有firstName值
似乎不可能只使用一次正则表达式,但是您可以使用JSON Path Extractor
JsonPath表达式: $ .. userlist.firstName
在Debug Sampler中提取结果test1 = [“ Jiezai”,“ Ben”]
4,比较正则表达式提取器和JSON路径提取器
正则表达式可以提取非json数据,JSON路径提取器只能提取json数据(),但是我们通常以json格式返回HTTP请求,因为它简单直观.
当json数据的返回值为{“ firstName”: “ Jiezai”}时,正则表达式为“ firstName”: “(. +?)”,如果: (当以下位置时: 冒号),实际上是json数据,然后还需要添加正则表达式,但是不管冒号左右两侧是否有空格,JSON Path Extractor表达式都是$ .. firstName
1. 使用BeanShell和JavaScript
由于公司从事保险业务,因此保险期和犹豫期将使用时间偏移.
例如jmeter中正则表达式大全,如果我购买保险,保险期为一年,保险开始日期为当前日期2018-4-11,结束日期为一年之后的当前日期2019-4-11
. 开始日期,我们可以使用BeanShell表达式
$ {__ BeanShell($ {__ time(yyyy)})}-$ {__ BeanShell($ {__ time(MM)},)}-$ {__ BeanShell($ {__ time(dd,)}))->输出当前日期为2018-4-11或JavaScript表达式
$ {__ javaScript((new Date(). getFullYear())+'-'+(new Date(). getMonth())+'-'+(new Date(). getDate()))) ->输出当前日期2018-4-11. 如果再加一年零两个月零三天怎么办?
BeanShell表达式
$ {__ BeanShell($ {__ time(yyyy)} + 1,)}-$ {__ BeanShell($ {__ time(MM,)} + 2,)}-$ {__ BeanShell($ {__ time(dd,)} +3,)}
JavaScript表达式
$ {__ javaScript((new Date(). getFullYear()+ 1)+'-'+(new Date(). getMonth()+ 2)+'-'+(new Date(). getDate() +3),)}
输出全部为2018-5-14
似乎没有问题,但除此之外,因为今天是2018年12月30日
,上面表达式的结果是2019-14-33,哈哈哈,这个表达式不知道一年中有多少个月,一个月中有多少天,它只会累加起来. 但是,如果仅是年份偏移量,则仍可以使用上面的表达式. 如果有月或日的偏移量,我们可以使用BeanShell Sampler,它实际上是用来执行Java代码的.
2,使用BeanShell脚本
如果要执行BeanShell脚本,则可以使用BeanShell PreProcessor,BeanShell Sampler或BeanShell PostProcessor
执行顺序: BeanShell PreProcessor> BeanShell Sampler> BeanShell PostProcessor
BeanShell PreProcessor是一个预处理器,在调用接口之前执行. 我在这里用这个
BeanShell Sampler是一个接口请求,它将反映在结果树中并写入接口执行报告中,但不建议像执行Java代码一样使用它来计算时间偏移.
BeanShell PostProcessor是一个后处理器,在调用接口之后执行.
例如:
只要BeanShell PreProcessor和BeanShell PostProcessor在BeanShell Sampler的范围之内,就必须首先运行BeanShell PreProcessor,然后运行BeanShell Sampler,然后运行BeanShell PostProcessor.
BeanShell PreProcessor的Java源代码:
import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;log.info(Label); //输出原件的名称try{ log.info("*****时间偏移*****"); //输出日志 Date date =new Date(); //获取当前时间 SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); String nowDate = sf.format(date); Calendar cal = Calendar.getInstance(); cal.setTime(sf.parse(nowDate));//初始化为当前时间 cal.add(Calendar.DAY_OF_YEAR,+1); //后一天 String orderDate = sf.format(cal.getTime()); cal.setTime(sf.parse(nowDate)); cal.add(Calendar.DAY_OF_YEAR,+365); //后365天,即一年 String mouthDate = sf.format(cal.getTime()); vars.put("dayDate",orderDate);//把beanshell的变量传给Jmeter vars.put("yearDate",mouthDate); log.info("输出计算后的两个时间"); log.info("dayDate="+orderDate); log.info("yearDate="+mouthDate);}catch(Exception e){}
时移的执行结果图:
我们打开Jmeter的选项“检查日志查看器,检查Jmeter运行日志并执行上面的beanshell源代码以获取
dayDate = 2018-04-12,yearDate = 2019-04-11.
在beanshell中,log.info()可用于打印调试bean脚本的日志
说到beanshell,我不得不说我们使用beanshell脚本来加密和解密密码,因为出于安全原因,登录或付款期间的密码将被加密和解密. 这里以加密为例:
首先,您需要开发同学的帮助,将添加的Java代码键入password.jar包(以您自己命名)中,然后将password.jar包添加到Jmeter的测试计划页面,以便您可以在beanshell Java类中执行Java时导入加密. 如图所示:
Jar包的密钥代码,调用FrameDemo.java的generateKey方法:
例如,我们要加密登录密码qq1111并参考Jmeter中的步骤
1,Jmeter添加jar包
2,在Beanshell中导入FrameDemo.java
3. 调用FrameDemo.java的generateKey方法执行加密操作. GenerateKey具有3个输入参数. 前两个是加密密钥,第三个是要加密的密码. 我们的密钥是固定的,需要加密. 密码是qq1111,我们可以在beanshell中编写要加密的密码,也可以从Jmeter传递它. 然后,我们将选择从Jmeter中传递,这更加灵活.
4. Beanshell将加密的字符串发送到Jmeter,以供Jmeter引用.
BeanShell PreProcessor的Java源代码:
//在测试计划页面先添加加密jar包import com.forth.FrameDemo;//加密log.info("*****加密*****"); //输出日志String password = vars.get("login_pw");//输入登录密码-这样写会取Jmeter变量login_pw的值log.info("jmeter-loginpw="+password);String password = "qq1111"; //输入登录密码String tpk = "30818902818100ccd601e07aeffc7f5f6d20d…";String kek = "308189028181009fa6334baf70c336163222…";String loginpw = FrameDemo.generateKey(tpk,kek,password); //调用工具类中的方法进行加密vars.put("loginpw",loginpw); //把值保存到jmeter变量loginpw中log.info("loginpw="+loginpw);
PS:
Beanshell内置对象vars访问Jmeter变量
vars.get(“ login_pw”)//从Jmeter获取变量login_pw的值
vars.put(“ loginpw”,loginpw); //将bean中的loginpw值存储到Jmeter变量loginpw
中
当我们使用Jmeter进行接口测试时,每个接口都需要输入IP和端口. 如果将采样器中的IP和端口写为172.20.128.188和8077. 因此,一旦迁移了测试环境,就需要在批处理脚本中修改批处理接口的IP和端口. 修改数量=脚本数量X脚本接口数量. 那是一件非常令人恐惧的事情,没有技术含量. . 聪明,我们知道,我们必须先在Jmeter中定义IP和端口,这样修改量才会大大减少. 如图所示:
但是,通过这种方式,我们的IP和端口已更改. 我们仍然必须一个一个地打开和修改每个脚本. 修改数量=脚本数量,这仍然有些麻烦. 我们可以尝试在同一位置将Jmeter脚本中的IP和端口引用为相同的值. 实际上,它是为脚本定义一个全局变量. 然后了解jmeter属性变量,如图所示:
修改数量= 1,完美,
Jmeter的bin目录中的jmeter.properties文件可以定义jmeter属性变量
打开jmeter.properties文件并插入两行
IP=172.20.128.188PORT=8077
在Jmx脚本中引用为$ {__ P(IP,)},$ {__ P(PORT,)},修改jmeter.properties后,需要重新启动jmeter才能生效.
bin下的User.properties也可以定义jmeter属性值,那么问题是,user.properties和jmeter.properties同时定义了PORT的值,一个是8077,另一个是8078,最后是$ { __P(PORT,)}参考时值是多少?好奇的朋友可以尝试一下并发表评论,并通过其他方式讨论Jmeter的其他知识. Git尚未完成. 完成后,将代码和相关脚本放在一起.
我觉得我的排版和描述可以优化,尤其是代码和英文排版. 我希望能看到它的人能够提及它. 感谢您的阅读.
作者: 西边的人
本文来自本站,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-286368-1.html