二、jmeter-基本操作及场景设计--jmeter基本操作
脚本设计前提:
1.jmeter中,做功能测试、自动化测试时,你可以使用 Beanshell元件,但是,在**性能测试**中,能不用,坚决不要用带有任何Beanshell。如果你要写java脚本,也不要使用Beanshell任何元件,JSR223 开头元件,
jmeter可以支持: java、jython、python、groovy、js
beanshell 元件替换,为何替换:相比于BeanShell 取样器,JSR223取样器+groovy脚本具有可大大提高性能的功能(编译),同时支持更多的脚本语言,其中包括BeanShell脚本,所以在编写脚本时不建议使用BeanShell 取样器
2.性能测试,要尽可能的降低jmeter**工具自身**对资源消耗
3.为何自动化脚本不能做性能:接口测试、自动化测试脚本,一定会添加**断言**,断言的目的是判断,是否有bug,断言这个元件在执行时,资源消耗,来自jmeter工具的资源,这个时间和资源的消耗,都是本机的,不是服务器消耗的时间和资源
常用操作:
1.变量:
用户定义变量: 位置:配置元件—添加;作用域:作用于整个‘**测试计划**’,全局变量,可跨线程组;在启动运行时,获取一次值,在运行过程中,不会动态获取值,在运行过程中,值一直都不变(不可实时变化,可用于值不变的参数)
用户参数: 位置:前置处理器–添加; 作用域:作用于当前线程组或当前的取样器,局部变量;在启动运行时,获取一次值,在运行过程中,还会动态获取值(局部变量不可跨取样器)----怎样修改为全局变量,参考下文
格式: 定义格式:var_user: 1888888888; 引用变量格式: ${var_user} -----$字符串的拼接
2.函数:
Tools–函数对话框,如果一个函数参数包含一个逗号,那么一定要用”\”来转义,否则JMeter将把它作为一个参数分隔符。
备注:下文只介绍几个常用函数,其余函数自行查询学习
${__setProperty(set_per,${per},)}:作用:设置**属性函数**,设置jmeter的动态属性;在第一个线程组获取数据,转为公共数据,第二个线程组调用上面的公共数据
2.参数全局变量设置:https://blog.csdn.net/BaiXuePrincess/article/details/103933969
实例:解决问题:变量值如何跨线程组使用
解决方案:${__setProperty(global_cooike,${set-cooike},)} 将set-cooike设置为全局变量,名称为global_cooike
适用场景:跨线程组调用参数值,将上一个线程组值通过函数设置为全局变量,通过—P函数获取使用
关联操作:取样器:BeanShell 取样器:将set-cooike设置为全局属性,做功能测试可使用该取样器,做性能测试不可使用该取样器,太耗性能
JSR223 Sampler: 将set-cooike设置为全局属性,做性能测试可使用该取样器
涉及函数:${__property(global_cooike,)};${__P(global_cooike,)}
${__P(,)} **获取属性函数**
${__property(,,)} **获取属性函数**,可以简单理解,P 只是property这个函数的简写
${__V(,)拼接函数 : 实例:V(可变)功能返回评估可变名称表达式的结果
解决问题:${var_${__counter(,)}} -----通过函数拼接计数器,我们**期望**它得到过程是${var_1} ${var_2} ${var_3} ,但是仅仅2个函数拼接达不到预期结果
解决方案:${__V(var_${__counter(,)},)} 通过__V函数拼接
使用场景:var_1 var_2 前缀相同,后缀是递增数字的变量名称,常见于 jdbc从数据库中获取数据时
3.逻辑控制器:逻辑控制器可以控制采样器(samplers)的执行顺序。由此可知,控制器需要和采样器一起使用,否则控制器就没有什么意义了。放在控制器下面的所有的采样器都会当做一个整体,执行时也会一起被执行。
性能测试脚本中,会使用逻辑控制器,但是,使用了逻辑控制器,并不是混合场景。混合场景,是 不同数量的并发用户,发起不同接口请求
分为2类:控制测试计划执行过程中节点的逻辑执行顺序;
对测试计划中的脚本进行分组、方便JMeter统计执行结果,以及进行脚本的运行时控制等
常用控制器:简单控制器(Simple Controller),循环控制器(Loop Controller),仅一次控制器(Once Only Controller)可与循环控制器一起使用 ,ForEach控制器(ForEach Controller),
事务控制器(Transaction Controller),if条件控制 ,Critical Section Controller 临界控制器,吞吐量控制器 ,swith 控制器 ,随机控制器,随机顺序控制器
4. 属性:以.properties结尾的文件,都是jmeter的属性配置文件;属性是什么?是jmeter**工具自身**带有的标签
jmeter工具属性:jmeter属性:可能被改变;+ 静态属性: 写在properties文件中属性信息,都是静态属性; + 动态属性:运行过程中,动态定义属性;动态属性,是在运行过程中产生的,关闭jmeter,就是自动释放了。
系统属性: os、jdk ===这个系统属性信息,**是不可改变**
属性 vs 参数 \ 变量 区别:属性是jmeter工具具有,所有,jmeter中的线程组要使用属性,都可以使用; + 参数、变量,有局限访问
顺序:+ jmeter中,多个启用线程组,在执行时,**默认是并行执行**,先到先执行;查看结果树中的显示顺序是,根据**收到响应的先后顺序**显示,jmeter中**取样器的执行顺序**:在没有逻辑控制器控制时,
顺序是**从上往下**,不管多少人并发,每个线程用户都是从上往下执行。会出现 取样器的执行顺序与 查看结果树中的显示顺序不一致。
5. 响应值提取:Json提取:1.在取样器上右键 > 后置处理器 > json提取器;
2. 当确定响应信息为json格式时,我们**优先**选择用 json提取器提取我们响应的信息,+ $.根路径.二级路径 json提取式 ----绝对路径写法+ $..末梢节点名称 -----相对路径写法, **推荐**(防止路径名写错)
正则提取: 如果想要提前请求中内容、响应的头部内容、或者响应体格式非json格式,这些使用 优先选择 **正则提取器**
提取方式:在取样器上右键 > 后置处理器 > 正则提取器;+ 正则提取式: 左边界(正则式)右边界 万能正则式: .*?
+ 除换行符之外,都可以匹配 参考文档:响应头数据 https://blog.csdn.net/QWERTY55555/article/details/96428481
6.数据参数化-ddt
1) CSV 数据文件设置 读取csv,txt 文件数据作为参数 每循环一次读取一次数据(设置并发数/循环控制器–进行遍历数据)
2)链接数据库读取数据 2.1执行sql语句–不带传参 2.2执行sql语句–带传参
7.fiddle 如何执行执行python脚本
1)执行脚本python脚本: BeanShell 取样器:通过cmd命令执行python脚本
String command = "cmd /c start python D:\\test.py";
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);
2)执行python代码—只支持python2
JSR223 Sampler------执行代码 正则表达式提取器------获取对应值
3)执行python脚本,获取对应值
OS进程取样器 ------通过执行 .bat文件,执行代码
test.py 需要将获取的值打印出来
print("222222")
.bat文件 @echo off -----作用:https://blog.csdn.net/fly_as_tadpole/article/details/85177379
cd C:\Users\huixiaoer\Desktop\jmeter\ &python test.py
正则表达式提取器------获取对应值 ----正则详解:https://blog.csdn.net/u011391839/article/details/107406836
* 匹配0次或多次,如图应该为(.+)匹配1次或多次,确保有数值
8.fiddle抓jmeter包:https://www.cnblogs.com/wintest/p/11779186.html