美文网首页自动化
Jmeter中的函数及变量摘录

Jmeter中的函数及变量摘录

作者: 佛系小懒 | 来源:发表于2020-02-06 18:41 被阅读0次

    函数

    内置函数在线程间共享,每个内置函数的调用使用一个独立的实例进行处理

    __CSVRead

    CSV file to get values from | *alias  指${__CSVRead(,)}中()内的第一个参数,指定具体csv文件的路径

    CSV文件列号| next| *alias 指${__CSVRead(,)}中()内的第二个参数,调用csv文件中的第几列参数,第一列为0,第二列为1,依此类推

    Jmeter执行的时候,如果线程Number of threads=1读取第一行的数字,Number of threads不等于1,顺序读取,如果线程组多于文件中的行数,则循环读取 (与Loop Count数没有关系)

    生成函数操作参见下图:

    jmx中的引用参见下图:

    直接在需要变量的地方将函数赋值过去即可

    __BeanShell(bean  shell)

    使用beanshell脚本进行类java的数据处理后,通过vars在jmx中进行传递

    定时器:BeanShell Timer

    前置处理器:BeanShell PreProcessor  : 数据预处理(从jmeter中读取数据data1,data2,经过beanshell转换,在通过其他变量data3输出到jmeter中)

    采样器:BeanShell Sampler ,相当于执行类似java类测试,response结果为bean shell中return的结果

    后置处理器:BeanShell PostProcessor

    断言:BeanShell断言

    监听器:BeanShell Listener

    以BeanShell Sampler为例进行描述

    使用java的CSVReader读取csv文件,

    int thread_number = (int)${__threadNum}-1;    通过内置的${__threadNum}获取线程组的线程数

    通过vars.put(key,value) 将value通过key存入jmeter中,通过vars.get(key)拿到数据返回给jmeter

    示例代码如下:

    import com.helger.commons.csv.CSVReader;

    CSVReader reader = new CSVReader(new FileReader("scripts/test.csv"));

    List row;

    String name;

    int counter = 0;

    int thread_number = (int)${__threadNum}-1;

    log.info("1:"+thread_number);

    while ((row = reader.readNext()) != null) { //要求设置的线程数要小于准备的测试数据

        if (thread_number == counter){

            c_id = row.get(1).toString();

            vars.put("c_id", c_id);

        }

        counter++;

    }

    注意:beanshell中读csv文件要使用相对路径(${JMETER_HOME}/bin目录下的路径),绝对路径会出现问题;vars.put中涉及的key不需要之前就通过User Defined Variable先进行定义,只是为了方便监听各类结果才预先定义的(添加Debug PostProcessor),图示如下:

    Bean Shell常用内置变量

    JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下:

    log用来记录日志文件,写入到jmeber.log文件,使用方法:log.info(“This is log info!”);

    ctx(JmeterContext)通过它来访问context,具体参考:org.apache.jmeter.threads.JMeterContext

    vars - (JMeterVariables):操作jmeter变量,提供读取/写入访问变量的方法。这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法:

        a) vars.get(String key):从jmeter中获得变量值

        b) vars.put(String key,String value):数据存到jmeter变量中

                  c) vars.putObject("OBJ1",new Object());

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

    props - (JMeterProperties - classJava.util.Properties):操作jmeter属性,该变量引用了JMeter的配置信息,可获取Jmeter属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。

        a) props.get("START.HMS");  注:START.HMS为属性名,在文件jmeter.properties中定义 

        b) props.put("PROP1","1234"); 

    prev - (SampleResult):获取前面的sample采样的结果,常用方法:

        a) getResponseDataAsString():获取响应信息

        b) getResponseCode() :获取响应code

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

    sampler - (Sampler):gives access to the current sampler 访问当前采样

    如果编写beanshell的过程依赖三方的jar包,需要先导入: 指定要用的jar包的位置:测试计划→浏览(Add direction or jar to classpath)→需要使用的jar包

    __regexFunction

    包含6个参数,具体截图如下

    函数参数描述如下:

    第1个参数:必须项,用于解析服务器响应数据的正则表达式,它会找到所有匹配项;

    如果希望将表达式中的某部分应用在模板字符串中,一定记得为其加上圆括号。例如,

    接的值存放到第一个匹配组合中(这里只有一个匹配组合)。又如,<input type="hidden"

    name="(.*)"value="(.*)">,在这个例子中,链接的name作为第一个匹配组合,链接的value会

    作为第二个匹配组合,这些组合可以用在测试人员的模板字符串中。

    第2个参数:必须项,模板字符串,函数会动态填写字符串的部分内容。要在字符串中引用正则表达式捕获的匹配组合,请使用语法:[groupnumber][groupnumber]。例如11或者22,模板可以是任何字符串。

    第3个参数:非必须项,默认值为1,用于指定JMeter使用第几次匹配;对于找到多个匹配项的详情,有4种选择选择可以设置:

    n     整数,使用第几个匹配项,如“1”对应第一个匹配,“2”对应第二个匹配,以此类推;

    n     RAND,随机选择一个匹配项;

    n     ALL,使用所有匹配项,为每个匹配项创建一个模板字符串,并将它们连接在一起

    n     0到1之间的浮点值,根据公式(总匹配数目*指定浮点值)计算使用第几个匹配项,计算值向最近的整数取整

    第4个参数:非必须项,第3个参数中选择了“ALL”,那么这第4个参数会被插入到重复的模板值之间否

    第5个参数:非必须项,如果没有找到匹配项返回的默认值否

    第6个参数:非必须项,重用函数解析值的引用名,参见上面内容否

    第7个参数:非必须项,变量名称。如果指定了这一参数,那么该变量的值就会作为函数的输入,而不再使用前面的采样结果作为搜索对象

    Regular Expression Extractor

    (1)Field to check

    Body:响应的body,不包含头信息

    Body (unescaped):响应的body  HTML中的转义字符被替换(不到万不得已尽量不用)

    Body as a Document :通过Tika抽取的多类document对应的文本信息, 会影响性能

    Request Headers: 不出现在非http的采样器中

    Response Headers : 不出现在非http的采样器中

    URL: 请求的URL

    Response Code: 响应状态码

    Response Message : 响应消息

    (2)Reference Name

    抽取的表达式对应的变量名. 包含匹配的多个组,访问具体的组:通过 [refname]_g#, 其中[refname] 为reference name栏设置的变量名,  #是组序号, 0是全部匹配, 1匹配第一个组

    (3)Regular Expression

    正则表达式,用于匹配响应数据. 至少包含一个 "()"来捕获字符串的一部分.不要使用 / /将表达式括起来,除非你整整想要匹配这些字符

    (4)Template

    用于引用具体匹配出来的组,'$1$' 对应group 1, '$2$' 对应group 2, $0$ 对饮匹配的整个表达式

    (5)Match No. (默认0 for Random) ,包含如下取值:

    0 随机,

    正数n 第n个(

        refName 表示Template的取值  一定意义上与refName_gn等价

        refName_gn, where n=0,1,2 表示具体匹配到的第n组字符串, g0:整个串

        refName_g 表示匹配到的group组数 ,与正则表达式中()括号的个数相关)

    负数:用于循环遍历   结合ForEach Controller使用  (结合ForEach Controller使用时的必填字段)

    针对ForEach Controller,如果使用用户定义的变量,需要变量前缀一致,且是在ForEach Controller下一层添加User Defined Variables ;同名出现的变量名,取第一个;后面的数字可以乱序但是不能间断;注意,start index 是不包含的,所以对于正则表达式提取出来的,要从0开始

    (6)关于正则表达式的构造

    参看官方文档,其中 ()截取子串  .匹配任意次任意字符    + 大于0次匹配   ?第一次匹配成功就停止继续匹配

    (7)Default Value

    没有匹配结果时的默认值;主要用于调试

    jmx样例中的:http请求~Regular Expression Extractor   依赖上一个请求后的Regular Expression Extractor -access_token即可

    __eval

    支持在一个变量中插入变量或者函数

    _ StringFromFile

    从文件中读取字符串,赋值给jmeter变量 

    第一个参数: 指定文件路径,可以是绝对路径,也可使用相对路径(基于$JMETER_HOME/bin目录)

    第二个参数: 指定传递给jmeter进行保存的变量名

    第3个参数、4个参数:分别指定起始行、结束行;如果不指定,默认第三个参数是文件第一行,默认第四个参数是文件最后一行

    函数每调用一次,读取一行(一行中无论什么字符都会读出来)

    示例:

    读取jmeter_strfromfile.csv文件中的一行数据存于strfile,jmx可以通过${strfile}使用

    ${__StringFromFile(D:\soft\apache-jmeter-4.0\bin\scripts\jmeter_strfromfile.csv,strfile,,)}

    __Random

    生成随机数

    第一个参数:随机数下限

    第二个参数:随机数上限

    第三个参数:在jmeter中保存该随机数的变量名

    两个${__Random(,,)}中间加上字符.实现浮点数的随机生成

    示例:

    insert into  jmeter_tab(name,fenshu) values ('${__StringFromFile(D:\soft\apache-jmeter-4.0\bin\scripts\jmeter_strfromfile.csv,strfile,,)}',${__Random(50,100,grade)}.${__Random(0,999,grade)});

    备注: 随机数只是数字,通过拼接双引号,变成字符串, 通过拼接‘’ 可以作为varchar插入mysql中

    _counter

    计数器,

    第一个参数:True:局部计数器 FALSE: 全局计数器

    第二个参数: 计数器在jmeter中存储的变量名

    示例:

    ${__counter(TRUE,inner_cnt)}

    计数器Counter

    属于config element:

    (1)启动(start):给定计数器的起始值,第一次迭代时,会把该值赋给计数器

    (2)递增(Increment):每次迭代后,给计数器增加的值

    (3)最大值(Maximum) :计数器的最大值,如果超过最大值,重新设置为初始值(Start),默认的最大值为Long.MAX_VALUE,2^63-1

    (4)数字格式(Number format) :可选格式,比如000,格式化为001,002。默认格式为Long.toString(),可当作数字使用

    (5)引用名称(Reference Name) :在jmeter中存储或被引用的名称

    (6)每用户独立的跟踪计数器(Track Counter Independently for each User):如果不勾选,即全局的,比如用户#1 获取值为1,用户#2获取值为2;勾选,每个用户有自己的值,比如用户#1 获取值为1,用户#2获取值还是为1;每次线程组迭代重置计数器(Reset counter on each Thread Group Iteration) :可选,仅勾选与每用户独立的跟踪计数器时可用,如果勾选了,每次线程组迭代,都会重置计数器的值。当线程组是在一个循环控制器内时比较有用

    _intSum

    计算多个整数的和,可以是计算正整数和负整数的和,它有N个参数,最少有3个参数,最多不限。最后一个参数是函数名称,前面的其它参数是要求和的整数

    变量

    (1) 大小写敏感

    (2)首位空格自动剔除

    (3)作用于线程

    (4)不能在变量里面嵌套变量,如${Var${N}}, 不过可以通过${__V(Var${N})}替代实现,也可以通过${__BeanShell(vars.get("Var${N}")}实现

    属性

    作用于整个测试计划

    借助__P or __property来引用

    部分不带参数的内部变量,如${__machineIP},可以直接在jmx请求名字中拼接来进行测试

    相关文章

      网友评论

        本文标题:Jmeter中的函数及变量摘录

        本文链接:https://www.haomeiwen.com/subject/kgpuxhtx.html