jmeter使用详解

1、如何在jmeter中调用自己写的方法
a、先在IDEA工具里用Java编写工具类(如加解密方法),然后打包成jar文件;
b、将jar包放到\apache-jmeter\lib\ext目录里
c、在beanshell里就可以用import的方式导入工具包
举例:

import cn.vv.vone.testengine.utils.EncryptUtils;

String str ="{\"pageSize\":10,\"pageNo\":1,\"reviewflag\":0}";
String body =EncryptUtils.encryptRequest(str);
vars.put("body",body);

2、jmeter常用内置变量
1)vars
不跨线程

vars.put(String key,String value);
vars.get(String key);

更多方法可参考:org.apache.jmeter.threads.JMeterVariables

2)props
该变量引用了JMeter的配置信息,可以操作jmeter属性(跨线程,可当全局变量使用,只能操作String类型)

props.get("START.HMS");  注:START.HMS为属性名,在文件jmeter.properties中定义 
encoding = props.get("sampleresult.default.encoding");
props.put("PROP1","1234");

3)log
写入信息到jmeber.log文件

log.info("XXXX");
log.info("sampleresult.default.encoding="+encoding);

4)prev
获取前面的sample返回的信息,常用方法:

prev.getResponseDataAsString():获取响应信息
prev.getResponseCode() :获取响应code
prev.setResponseCode("222");
prev.setResponseMessage("响应值返回成功");
prev.setResponseData("qiaoyeye你好","UTF-8");

更多方法可参考:org.apache.jmeter.samplers.SampleResult

5)sample

6)ctx
该变量引用了当前线程的上下文

ctx.getThreadNum();

更多方法可参考:org.apache.jmeter.threads.JMeterContext

3、jmeter BeanShell使用方法
BeanShell是一种松散类型的脚本语言,比如变量可以不用定义变量类型,此时默认为全局变量;打印方法print()。Java代码可以在BeanShell中正常运行。
常用BeanShell脚本命令:
· source(), run() – 读取,或者运行一个脚本文件
· frame() – 显示一个窗口
· load(), save() – 读取或者保存一个脚本对象到文件
· cd(), cat(), dir(), pwd(), etc. 使用Unix下面的命令
· exec() – 运行一个本地的方法
· javap() –使用javap命令.
· setAccessibility() – 设置可以接收private(私有)和protected(受保护)类型的变量

1)BeanShell预处理

import cn.vv.vone.testengine.utils.EncryptUtils;

String str ="{\"cityId\":null}";
String body =EncryptUtils.encryptRequest(str);
vars.put("body",body);

2)BeanShell后置处理器

import cn.vv.vone.testengine.utils.EncryptUtils;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray;

String response = EncryptUtils.decodeResponse(prev.getResponseDataAsString());

JSONObject responseObject = JSONObject.parseObject(response);
JSONArray ruleRows = responseObject.getJSONArray("rows");

String performanceRuleId = ruleRows.getJSONObject(0).getString("id");
String performanceRuleType = ruleRows.getJSONObject(0).getString("type");

vars.put("performanceRuleId",performanceRuleId);
vars.put("performanceRuleType",performanceRuleType);

注:
cn.vv.vone.testengine.utils.EncryptUtils为自己写的加解密工具包,将jar包放入\apache-jmeter\lib\ext目录里;
com.alibaba.fastjson.JSONObject和com.alibaba.fastjson.JSONArray包同样要放入\apache-jmeter\lib\ext目录里,才能调用得到。

4、jmeter断言
1)响应断言

断言类型:
· Contains:上面选中的部分包含下面的正则表达式就算Pass
· Match:上面选中的整个部分匹配下面的正则表达式就算Pass。
· Equals:上面选中的整个部分和下面的字符串相等就算Pass。不支持正则表达式,同时对大小写敏感。
· Substring:上面选中的部分包含下面的字符串就算Pass。不支持正则表达式,同时对大小写敏感。
· Not:勾选上之后,会对前面选择的进行反转。比如Match + Not 就是不匹配就算Pass。
· Or:勾选上之后,会对配置内容多条件匹配。任一条件符合就算Pass。

2)json断言

Additionally assert value(额外校验value):
· 是否额外验证根据JSONPath提取的值。
· 不勾选,验证JSONPath能否在JSON文档中找到路径;
· 勾选,验证根据JSONPath提取值是否预期。
Match as regular expression(匹配正则表达式):
· 预期值是否可以使用正则表达式。
· 不勾选,预期值不能使用正则表达式表示;
· 勾选,预期值可以使用正则表达式表示。
Expected Value(预期值):
· 期望为空:若验证提取的值为null,则勾选此项。
· 这里有两个地方需要额外注意:
· a.验证null值,还是需要勾选“Additionally assert value”,否则验证的是JSONPath能否找到路径;
· b.预期值不填表示空字符,与null不等价。

json元素路径规则见附录

3)BeanShell断言

import cn.vv.vone.testengine.utils.EncryptUtils;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray;

String response = EncryptUtils.decodeResponse(prev.getResponseDataAsString());

JSONObject responseObject = JSONObject.parseObject(response);
JSONArray periodList = responseObject.getJSONArray("periods");
String startAction = periodList.getJSONObject(0).getString("startAction");
String endAction = periodList.getJSONObject(0).getString("endAction");

if(!(startAction.equals("0")&&endAction.equals("1"))){
    Failure = true; 
    FailureMessage = "次数区间校验失败";
    return;
}

if(!("${transportMethod_1}".equals("1"))){
    Failure = true; 
    FailureMessage = "交通类型校验失败";
    return;
 }

5、jmeter变量参数化
1)用户定义的变量
· name和value,一对一,每次都取同一个值
· 调用方式:${name}

2)用户参数
· name和value,一对多,不同线程从value中依序取值;同个线程循环多次,值一样
· 调用方式:${name}

3)CSV文件引入
· 从CSV文件中遍历取值(可应用于代码一样,只有数据不一样的正反用例;或者避免同份数据有缓存的影响)

· 调用方式:${变量名称}

{
      "lng": ${lng},
      "lat": ${lat}
}

4)用Jmeter中的函数获取参数值

${__Random(,,)}
· 第一个参数为随机数的下限,第二个参数为随机数的上限,第三个参数为储存随机数的变量名

${__RandomString(,,)}
· 第一个参数为字符串长度,第二个参数为要生成的字符范围,第三个参数为储存随机数的变量名

${__CSVRead(,)}
· 第一个参数是文件名,第二个参数是文件中的列(列数从0开始)

${__StringFromFile(,,,)}。
· 第一个参数是文件名,${__StringFromFile(,,,)}方法中没有指定读取文件中的哪一列的参数,所以${__StringFromFile(,,,)}只能读取包含一列的文件

参看Jmeter函数的使用,通过菜单“工具”->“函数助手对话框”,即可在“函数助手”弹出框上找到Jmeter的函数。

5)数据库取值
见第6点

6、jmeter数据库操作,取值
第一,导入mysql包:将mysql-connector-java-8.0.15.jar包放到\apache-jmeter\lib\ext目录里
第二,配置JDBC Connection Configuration

第三,JDBC Request


注:多个变量用逗号隔开
调用方法:${uid_#}表示结果数量,${uid_N}表示第N个结果;vars.getObject("riderUid").get(0).get("uid")表示uid列的第一个值

参数说明:
· Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字保持一致
· Query:填写的sql语句未尾不要加“;”
· Parameter valus:参数值
· Parameter types:参数类型,可参考:Javadoc for java.sql.Types
· Variable names:保存sql语句返回结果的变量名
· Result variable name:创建一个对象变量,保存所有返回的结果
· Query timeout:查询超时时间
· Handle result set:定义如何处理由callable statements语句返回的结果

7、jmeter逻辑控制
1)if控制器
使用变量表达式
· 借助__jexl3函数来计算表达式的值: ${__jexl3(${var}==1,)}
表达式对所有子节点生效
· 即if逻辑控制器下的所有子节点会先判断是否满足if条件,满足才执行

8、jmeter设置延迟
单位:毫秒

Thread.sleep(5000);

9、jmeter常用函数
1)__BeanShell(要执行的语句,保存结果的变量名称)

${__BeanShell(11*11)}
${__BeanShell(11*11,result)};

2)__regexFunction:正则表达式函数

3)__counter:计数器函数

4)__StringFromFile:读取文件中的字符串函数,支持读取多个文件
· 每次调用函数,都会从文件中读取下一行。当到达文件末尾时,函数又会从文件开始处重新读取,直到最大循环次数。
· 如果在一个测试脚本中对该函数有多次引用,那么每一次引用都会独立打开文件,即使文件名是相同的(如果函数读取的值,在脚本其他地方也有使用,那么就需要为每一次函数调用指定不同的变量名)
示例:

${_StringFromFile(demo.txt,,,)} 读取demo.txt
${_StringFromFile(PIN#'.'DAT,,1,2)} 读取demo1.txt, demo2.txt
${_StringFromFile(PIN.DAT,,,2)} 读取demo.txt两次

函数的第三个参数:初始的序列号,如果省略,那么结束序列号就代表文件的循环读取次数。
函数的第四个参数:结束序列号,如果省略,那么序列号会无限增长。

5)__Random:返回指定最大值和最小值之间的随机数

${__Random(1,10,num)} 返回1-10之间的随机数,存储在num变量里

6)__RandomString():随机字符串函数

${__RandomString(5,abcdefg123456,value)} 在“abcdefg123456”中随机取5个字符,存储进value里

7)__property:返回一个JMeter属性的值
· 如果函数找不到属性值,而又没有提供默认值,则它会返回属性的名称。
举例:

${__property(user.dir)}:返回属性user.dir的值。
${__property(user.dir,UDIR)}:返回属性user.dir的值,并保存在变量UDIR中。
${__property(abcd,ABCD,atod)}:返回属性abcd的值 (如果属性没有定义,返回"atod"),并保存在变量ABCD 中。
${__property(abcd,,atod)}:返回属性abcd 的值(如果属性没有定义,返回"atod"),但是并不保存函数的返回值。

8)__P:简化版的属性函数,目的是使用在命令行中定义的属性。
· 不同于函数_property,本函数没有提供选项用于设置保存属性值的变量。另外,如果没有设置默认值,默认值自动设为1。
举例:
定义属性值:jmeter -Jgroup1.threads=7 -Jhostname1=www.realhost.edu

${__P(group1.threads)}:返回属性group1.threads的值。
${__P(group1.loops)}:返回属性group1.loops 的值。
${__P(hostname,www.baidu.com)}:返回属性hostname的值,如果没有定义该属性则返回值www.baidu.com。

在上面的例子中,第一个函数调用返回7,第二个函数调用返回1,而最后一个函数调用返回www.baidu.com(除非这些属性在其他地方有定义)。

9)__log
· OUT 和ERR的日志级别,将会分别导致输出记录到System.out和System.err中。在这种情况下,输出总是会被打印(它不依赖于当前的日志设置)。

${__log(Message)}:写入日志文件,形如"...thread Name : Message"。
${__log(Message,OUT)}:写到控制台窗口。
${__log(${VAR},,,VAR=)}:写入日志文件,形如"...thread Name VAR=value"。

10)__split:字符串分割函数
· 函数__split会通过分隔符来拆分传递给它的字符串,并返回原始的字符串。如果分隔符紧挨在一起,那么函数就会以变量值的形式返回"?"。拆分出来的字符串,以变量${VAR_1}、{VAR_2}…以此类推的形式加以返回。
· 分隔符默认是逗号,如果你想要多此一举,明确指定使用逗号,需要对逗号转义,如“,”
举例:
在测试计划中定义变量VAR="a||c|":
${__split(${VAR},VAR),|} :该函数调用会返回VAR变量的值,例如"a||c|",并设定VAR_n=4、VAR_1=a、VAR_2=?、VAR_3=c、VAR_4=?、VAR_5=null变量的值。

11)__XPath
· 函数__XPath读取XML文件,并在文件中寻找与指定XPath相匹配的地方。每调用函数一次,就会返回下一个匹配项。到达文件末尾后,会从头开始。如果没有匹配的节点,那么函数会返回空字符串,另外,还会向JMeter日志文件写一条警告信息。
· 整个节点列表都会被保存在内存之中。
举例:

${__XPath(/path/to/build.xml, //target/@name)} 

这会找到build.xml文件中的所有目标节点,并返回下一个name属性的内容。

12)__setProperty:设置JMeter属性的值
· 函数的默认返回值是空字符串,因此该函数可以被用在任何地方,只要对函数本身调用是正确的。
· 通过将函数可选的第3个参数设置为"true",函数就会返回属性的原始值。
· 属性对于JMeter是全局的,因此可以被用来在线程和线程组之间通信。

13)__time:通过多种格式返回当前时间
· 如果省略了格式字符串,那么函数会以毫秒的形式返回当前时间。其他情况下,当前时间会被转成简单日期格式。包含如下形式:
· YMD = yyyyMMdd。
· HMS = HHmmss。
· YMDHMS = yyyyMMdd-HHmmss。
· USER1 = JMeter属性time.USER1。
· USER2 = JMeter属性time.USER2。
· 用户可以通过修改JMeter属性文件来改变默认格式,或者自定义格式,例如修改YMD格式: time.YMD=yyMMdd。

14)__evalVar:用来执行保存在变量中的表达式,并返回执行结果
· 用户可以从文件中读取一行字符串,并处理字符串中引用的变量。
举例:
假设变量"query"中包含有"select ${column} from ${table}",而 "column"和"table"中分别包含有"name"和"customers",那么${__evalVar(query)}将会执行"select name from customers"。

15)__eval:用来执行一个字符串表达式,并返回执行结果。
· 用户可以对字符串(存储在变量中)中的变量和函数引用做出修改。
举例:
给定变量name=Smith、column=age、table=birthdays、SQL=select ${column} from ${table} where name='${name}',那么通过${__eval(${SQL})},就能执行"select age from birthdays where name='Smith'"。这样一来,就可以与CSV数据集相互配合,例如,将SQL语句和值都定义在数据文件中。

16)__escapeHtml
· 函数__escapeHtml用于转义字符串中的字符(使用HTML实体)。支持HTML 4.0实体。

17)__unescapeHtml
· 函数__unescapeHtml用于反转义一个包含HTML实体的字符串,将其变为包含实际Unicode字符的字符串。支持HTML 4.0实体。
· 如果函数不认识某个实体,就会将实体保留下来,并一字不差地插入结果字符串中。例如,">&zzzz;x"会变为">&zzzz;x"。

18)__FileToString
· 函数__FileToString可以被用来读取整个文件。每次对该函数的调用,都会读取整个文件。
· 如果在打开或者读取文件时发生错误,那么函数就会返回字符串"ERR"。

10、正则表达式
match no(匹配数字)
· 通过正则表达式匹配,可能会有多个结果,match no为0时代表随机取值,正数n则表示取第n个值(比如1代表取第一个值),负数则表示提取所有符合条件的值
group
· 指某个match的某一个匹配内容,如([0-9]+).([0-9]+)匹配12.34和56.78,则match no=1&group=1的结果为12,match no=1&group=2的结果为34,match no=2&group=1的结果为56
模板
· 通过${group}$来指定正则表达式的匹配结果的输出格式,如$1$则只截取group=1的内容,即12和56;$1$X$2$则可以得到12X34和56X78
举例:
待匹配字符串:12.34!=56.78
引用名称:num
正则表达式:([0-9]+).([0-9]+)
模板:$1$---$2$
匹配数字:2
结果如下:
${num}:56---78
${num_g0}:56.78
${num_g1}:56
${num_g2}:78

附:
json元素路径

正则表达式规则

posted @ 2020-06-08 18:37  颜林小钦  阅读(4675)  评论(0编辑  收藏  举报