JMeter是Apache组织开发的开源项目,设计之初是用于做性能测试的,同时它在实现对各种接口的调用方面
做的比较成熟,因此,常被用做接口功能测试和性能测试。
有如下特点:
jemter可以通过http://jmeter.apache.org/download_jmeter.cgi 下载,根据自己平台,下载对应文件。
jmeter的目录结构主要如下:
在上述目录结构中,bin目录和lib目录是最为重要的两个目录,其中bin目录存储了jmeter的脚本文件和可执行文件,lib目录存储了jmeter和其他相关库的jar文件,是jmeter的核心库之一。其他目录则是一些辅助性的目录,用于存储一些文档、扩展和示例文件。
常用的功能和组件如下:
如下为各个组件使用的顺序关系:
使用配置元件配置公共参数,使用前置处理器作为一些前置处理,如设置cookie等等。使用定时器定时执行,模拟真实场景。取样器模拟用户行为的核心元素。后置处理器可以提取变量,清除缓存等等。断言,用于判断结果是否符合预期。监听器,用了记录测试的性能指标和结果数据。
查看结果数作用于测试计划,在取样器外面,则对整个测试计划是有效的,如果在线程组里面则单独对于该线程有效。
Badboy是一款免费的Web自动化测试 工具,采用C++开发,拥有强大的屏幕录制和回放功能,可提供图形结果分析功能,同时Badboy提供了将Web测试脚本直接导出生成Jmeter脚本的功能,为Jmeter支持的jmx格式脚本,意味着Badboy一般常用于与JMeter结合使用。
BadBoy下载官网:http://www.badboy.com.au/
下面是badboy录制脚本的一般步骤:
常见的 JMeter 参数化的实现方式:
- CSV Data Set Config:将参数化的数据放入文件中,参数化读取依赖于文件操作。这样的参数化方式很常用,尤其适用于参数化数据量较多的场景,而且维护比较简单灵活。
- User Defined Variables:一般来说可以配置脚本中的公共参数,如域名,端口号,不需要随着压测进行动态改变,一般用于环境切换。
- Function Helper 中的函数:使用函数的方式生成参数,如果你需要随机数、uuid 等都可以使用函数生成。
关联是将上个请求的数据提取需要的内容放到下个请求中,通过关联我们可以获取到满足业务特性的不同数据,因此可以认为关联也是一种特殊的参数化形式。
JMeter实现关联常用有 3 种方式:
- Json Extractor提取器,针对返回的 json 数据类型;
- 正则表达式提取器,通过正则表达式去提取数据,实现关联。
◆ 边界提取器,通过左右边界的方式关联需要的数据;
Jemter分布式压测是选择其中一台作为调度机(master),其他机器作为执行机(slave);当然一台机器也可以既做调度机,也做执行机。
调度机执行脚本的时候,master将会jmx脚本分发到slave上,slave拿到脚本后以非GUI的形式开始执行。
slave执行完毕后将结果回传给master,并由master进行结果的汇总。
jmeter分布式加压需要master和slave机器,以下为详细步骤
slave机器配置
1.1 关闭各slave机器上防火墙,修改server.rmi.ssl.disable=true
1.2 启动jmeter-server.bat文件
mater机器配置,打开bin目录下的jmeter.properties文件,找到里面的remote_hosts部分,修改内容为:remote_hosts=xx,xx代表的是压力机的ip。如果是多个压力机,之间使用【,】分隔。
如上也可以通过脚本运行的方式
jmeter -n -t G:\Test\1.1login_linux.jmx -l G:\Test\result\1.jtl -e -o G:\Test\html\1 -R 192.168.30.132:1099,192.168.30.130:1099
jmeter -n -t jmx脚本路径 -l jtl文件路径 -e -o 报告路径 -R salve的IP地址:端口,salve的IP地址:端口
使用jmeter进行压测的时候,使用图形化界面本来就是耗费资源的,所以图形化界面适合调试,真正的压测要使用命令行的方式,以下为参数详细的解释
命令行运行脚本格式:jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
◆ -n 表示在非 GUI 模式下运行 JMeter;
◆ -t 表示要运行的 JMeter 测试脚本文件,一般是 jmx 结尾的文件;
◆ -l 表示记录结果的文件,默认以 jtl 结尾;
◆ -e 表示测试完成后生成测试报表;
◆ -o 表示指定的生成结果文件夹位置。
BeanShell 是由 Java 编写的,相当于一个小巧的 Java 源码解释器,简单来说就是你可以在里面写代码,然后通过
Beanshell 翻译成插件可以识别的指令去执行相关操作。官网: http://www.BeanShell.org/
jmeter如下元件都有beanshell
◆ 定时器: BeanShell Timer
◆ 前置处理器:BeanShell PreProcessor
◆ 采样器: BeanShell Sampler
◆ 后置处理器:BeanShell PostProcessor
◆ 断言: BeanShell断言
◆ 监听器: BeanShell Listener
编写beanshell脚本,需要熟悉beanshell常用内置变量,以下为beanshell常用内置变量
◆ log.info(“开始请求…”)
◆ log.error(“接口报错”)
◆ ctx.getCurrentSampler(); 获取当前 sampler 请求
◆ ctx.getPreviousSampler(); 获取前一个 sampler 请求
◆ ctx.getThreadNum(); 获取当前线程的序号,从 0 开始计数
◆ ctx.getThread(); 获取当前线程
◆ ctx.getThreadGroup(); 获取当前线程组
◆ ctx.getProperties(); 获取所有属性
◆ ctx.getVariables(); 获取当前线程的所有变量
◆ vars.get(String key):从jmeter中获得变量值;
◆ vars.put(String key,String value):数据存到jmeter变量中;
◆ prev.getResponseDataAsString():获取响应信息
◆ prev.getResponseCode() :获取响应code
JMeter不支持直接调用Python脚本,但可以通过以下两种方式实现Python脚本的调用。
from subprocess import call
call(["python", "path/to/your/python_script.py"])
这个脚本将调用Python的subprocess模块中的call函数来运行Python脚本。在实际使用中,你需要将路径替换为你的Python脚本路径。
2. 使用外部命令
另一种调用Python脚本的方法是使用外部命令。这种方法可以通过JMeter的OS Process Sampler来实现。
首先,你需要在OS Process Sampler中添加一个执行命令的命令,例如:
python path/to/your/pythonscript.py
你需要将路径替换为你的Python脚本路径。然后,你可以将这个请求添加到你的测试计划中,调用OS Process Sampler来执行Python脚本。
JMeter线程组中,Ramp-Up和集合点是两个不同的配置选项。
Ramp-Up指的是在一定时间内逐步增加线程数,直到达到所需的最大线程数。比如,如果需要模拟100个用户同时访问网站,则可以将线程数设置为100,并将Ramp-Up时间设置为10秒,这意味着每秒增加10个用户,最终达到100个用户。
集合点则用于等待所有线程同时达到某个特定的点,然后再继续执行测试计划。这在某些场景下非常有用,例如需要模拟许多用户同时登录系统,但需要确保所有用户都已经登录成功之后才进行下一步操作。
因此,Ramp-Up和集合点是两种不同的配置选项,但都很重要,可以帮助测试人员更好地模拟真实的负载条件并确保测试的准确性。
如下图通过随机变量生成随机数,if控制器根据随机数进行判断执行那个sample,模拟真实场景
每秒事务数(TPS)每秒响应请求数(OPS){一个页面的一次访问形成一个tps;但每一次页面访问可能产生多次对服务器的请求,多次请求ops}
想实现一个功能,但需要多个接口,这种接口需要上一个接口的数据做参数,我们看数据都是单个的请求,对于这种看一个功能包含多个请求的,我们就需要添加事务,这样会把此事务下的所有接口,都当作一个请求来计算。接口统一看作一个事务,进行性能测试,得到的性能测试结果才会更加接近真实的场景。
Jmeter是一款常用的压力测试工具,可以模拟多种不同的压力测试场景,但是对于梯度式加压测试,需要手动设置多个线程组以达到加压效果,比较繁琐。因此,可以使用插件来自动完成这个过程。
下面是添加梯度式加压插件的步骤:
- Number of Threads: 线程数目
- Ramp-Up Time: 每秒钟增加的线程数
- Hold Target Rate Time: 达到峰值后持续的时间
- Start Threads Count: 初始时的线程数目
- Stop Threads Count: 最大线程数目
根据需要进行参数配置,然后启动测试即可。
jmeter自带的监听器功能有限,可以使用第三方插件 perfmon-agent: perfmon-agent ,具体使用如下
JMeter PerfMon插件是一个非常有用的工具,可以用于在JMeter中收集系统性能指标。在使用时,需要使用perfmon-agent来收集数据。以下是使用jmeter perfmon-agent的步骤: