Jmeter 环境和基本理论汇总

一.工具下载和准备:

  • JDK下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html?ssSourceSiteId=otncn
  • JMeter下载地址: https://jmeter.apache.org/download_jmeter.cgi
  • JMeter插件管理: https://jmeter-plugins.org/install/Install/
  • Badbody下载地址:http://www.badboy.com.au
  • Fiddler下载地址:https://www.telerik.com/fiddler
  • Fiddler-jmeter插件下载地址:https://pan.baidu.com/s/1mj9EDUK 参考文章:https://www.jianshu.com/p/434d62f40ffd
  • ant方式方式导出测试报告:https://blog.csdn.net/qq_37138756/article/details/80771561
    说明:JDK与Java SE/EE/ME的区别 https://www.cnblogs.com/EasonJim/p/6181981.html
    另外不同jmeter版本支持dk版本不同,目前使用最下版本jmeter支持jdk1.8或1.9,这里我选用的是jdk1.8,其他Badbody Fiddler 下载最下的适合自己的版本就可以了,目前Badbody基本废弃不用了

二.jdk环境变量配置:

jdk-8u191-windows-x64.exe
安装运行下载好的jdk,后最高配置下jdk环境变量,右击计算机→属性→高级系统设置→高级→环境变量
新建环境变量JAVA_HOME
变量名:JAVA_HOME
变量值:C:\Program Files\Java\jdk1.8.0_191  

新建环境变量CLASSPATH
变量名:CLASSPATH
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
注意:变量值前面的“.;”

配置环境变量Path
双击Path,点击新建,添加“%JAVA_HOME%\bin”;
再次点击新建,添加“%JAVA_HOME%\jre\bin”。

验证java环境变量配置:
java -version
javac -version

三.jmeter及插件的安装及简单理论说明:

pache-jmeter-5.0.zip
Jmeter不用安装,下载后,直接解压即可
然后将下载的插件plugins-manager.jar 放入到lib/ext目录
最后进入bin目录下运行jmeter.bat即可
    
jmeter.properties 

jmeter.bat 或jmeter.sh
set HEAP=-Xms512m -Xmx512m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
根据经验,堆值(HEAP)最多设置为物理内存的一半,默认设置为512m,如果堆值(HEAP)超过物理内存的一半,JMeter运行速度会变慢,设置会出现“内存溢出”的错误。
3.1 jmeter 基础概念:http://www.cnblogs.com/fnng/archive/2012/12/21/2828440.html
从性能工具的原理划分:
    Jmeter工具和其他性能工具在原理上完全一致,工具包含4个部分:
(1)负载发生器:用于产生负载,通常以多线程或是多进程的方式模拟用户行为。
(2)用户运行器:通常是一个脚本运行引擎,用户运行器附加在线程或进程上,根据脚本要求模拟指定的用户行为。
(3)资源生成器:用于生成测试过程中服务器、负载机的资源数据。
(4)报表生成器:根据测试中霍地的数据生成报表,提供可视化的数据显示方式。
3.2 测试计划元件
Test Plan (测试计划):用来描述一个性能测试,包含与本次性能测试所有相关的功能。也就说本的性能测试的所有内容是于基于一个计划的。
Threads (Users)线程 用户: 虽然有三个添加线程组的选项,名字不一样, 创建之后,其界面是完全一样的。之前的版本只有一个线程组的名字。现在多一个setUp theread Group 与terDown Thread Group 
    1) setup thread group  
      一种特殊类型的ThreadGroup的,可用于执行预测试操作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试前进行定期线程组的执行。
    2) teardown thread group.  
      一种特殊类型的ThreadGroup的,可用于执行测试后动作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试结束后执行定期的线程组。
      可能你还是不太理他们与普通的线程组有什么不同。 如果您用过junit,想必你不会对setup ,teardown这2个字眼陌生。 即时每用过,也没关系。 熟悉loadrunner的应该知道,loadrunner的脚本除了action里是真正的脚本核心内容,还有初始化“环境”的初始化脚本和测试完毕后对应的清除信息的脚本块。 那么这里 setup thread group 和 teardown thread group 就是分别指这两部分。  其实从本质上来看,他们并没有什么不同。
    3) thread group(线程组).
            这个就是我们通常添加运行的线程。通俗的讲一个线程组,,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。线程组中包含的线程数量在测试执行过程中是不会发生改变的。
测试片段(Test Fragment) : 测试片段元素是控制器上的一个种特殊的线程组,它在测试树上与线程组处于一个层级。它与线程组有所不同,因为它不被执行,除非它是一个模块控制器或者是被控制器所引用时才会被执行。
取样器(Sampler): 性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元,JMeter 原生支持多种不同的sampler ,如 HTTP Request Sampler 、 FTP  Request Sample 、TCP  Request Sample 、JDBC Request Sampler 等,每一种不同类型的 sampler 可以根据设置的参数向服务器发出不同类型的请求。
逻辑控制器(Logic Controller): 常用的有 如果(If)控制器 、switch Controller 、Runtime Controller、循环控制器等。
    说明:JMeter有两种类型的控制器:取样器(sample)和逻辑控制器(Logic Controller),用这些原件来驱动处理一个测试。
配置元件(Config Element): 用于提供对静态数据配置的支持。CSV Data Set config 可以将本地数据文件形成数据池(Data Pool),而对应于HTTP Request Sampler和 TCP Request Sampler等类型的配制无件则可以修改Sampler的默认数据。(例如,HTTP Cookie Manager 可以用于对 HTTP Request Sampler 的cookie 进行管理)
定时器(Timer):用于操作之间设置等待时间,等待时间是性能测试中常用的控制客户端QPS的手段。类似于LoadRunner里面的“思考时间”。JMeter 定义了Bean Shell Timer、Constant Throughput Timer、固定定时器等不同类型的Timer。
前置处理器(Per Processors): 用于在实际的请求发出之前对即将发出的请求进行特殊处理。例如,HTTP URL重写修复符则可以实现URL重写,当RUL中有sessionID 一类的session信息时,可以通过该处理器填充发出请求的实际的sessionID 。
后置处理器(Post Processors): 用于对Sampler 发出请求后得到的服务器响应进行处理。一般用来提取响应中的特定数据(类似LoadRunner测试工具中的关联概念)。例如,XPath  Extractor 则可以用于提取响应数据中通过给定XPath 值获得的数据。
断言(Assertions): 断言用于检查测试中得到的相应数据等是否符合预期,断言一般用来设置检查点,用以保证性能测试过程中的数据交互是否与预期一致。
监听器(Listener) : 用来监听系统资源的元件。它是用来对测试结果数据进行处理和可视化展示的一系列元件。 图行结果、查看结果树、聚合报告。都是我们经常用到的元件。
3.3 添加http接口测试 相关参数说明:
* 线程组:“测试计划”-->“添加”-->“Threads(Users)”-->“线程组”
    主要包含三个参数:线程数、准备时长(Ramp-Up Period(in seconds))、循环次数。
    1)线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线程数。
    2)准备时长: 设置的虚拟用户数全部启动的时长。如果线程数为20 ,准备时长为10(秒) ,那么需要10秒钟启动20个线程。也就是平均每秒启动2个线程。
    3)循环次数:每个线程发送请求的个数。如果线程数为20 ,循环次数为100 ,那么每个线程发送100次请求。总请求数为20*100=2000 。
       如果勾选了“永远”,那么所有线程会一直发送请求,直到手动点击工具栏上的停止按钮,或者设置的线程时间结束。

* HTTP请求取样器:(线程组”-->“添加”-->“Sampler”-->“HTTP请求)
    1)名称:本属性用于标识一个取样器,建议使用一个有意义的名称。
    2)注释:对于测试没有任何作用,仅用户记录用户可读的注释信息。
    3)服务器名称或IP :HTTP请求发送的目标服务器名称或IP地址。
    4)端口号:目标服务器的端口号,默认值为80 。
    5)协议:向目标服务器发送HTTP请求时的协议,可以是HTTP或者是HTTPS ,默认值为http 。
    6)方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。
    7)Content encoding :内容的编码方式,默认值为iso8859,常用使用utf8      
    8)路径:目标URL路径(不包括服务器地址和端口)
    9)自动重定向:如果选中该选项,当发送HTTP请求后得到的响应是302/301时,JMeter 自动重定向到新的页面。
    10)Use keep Alive : 当该选项被选中时,jmeter 和目标服务器之间使用 Keep-Alive方式进行HTTP通信,默认选中。
    11)Use multipart/from-data for HTTP POST :当发送HTTP POST 请求时,使用Use multipart/from-data方法发送,默认不选中。
    12)同请求一起发送参数 : 在请求中发送URL参数,对于带参数的URL ,jmeter提供了一个简单的对参数化的方法。
        用户可以将URL中所有参数设置在本表中,表中的每一行是一个参数值对(对应RUL中的 名称1=值1)。

四. 配合jmeter使用和测试:

  • Fiddler说明资料参考: https://www.cnblogs.com/miantest/p/7289694.html
  • Fiddler-jmeter插件参考资料:https://www.jianshu.com/p/434d62f40ffd
  • Badboy https://www.cnblogs.com/llxx07/p/7016958.html
  • Cookies Header

五.参数化(参考资料,https://www.jianshu.com/p/7cc72f97d5ab)

1.User Parameters

HTTP取样器-->Add-->Pre Processors-->User Parameters
适用于参数取值范围很小的时候使用

2.CSV Data Set Config

HTTP取样器-->Add-->Config Element-->CSV Data Set Config
适用于参数取值范围较大的时候使用,该方法具有更大的灵活性

3.User Defined Variables

Thread Group-->Add-->Config Element-->User Defined Variables
一般用于Test Plan中不需要随请求迭代的参数设置,如:Host、Port Number

4.Function Helper中的函数

Options-->Function Helper Dialog
可作为其他参数化方式的补充项,如:随机数生成的函数${__Random(,,)},参考常用的jemter 函数https://www.cnblogs.com/imyalost/p/6802173.html

补充以另外一种常用的,通过读取数据库中的数据进行参数化
参考:https://blog.csdn.net/wuhenyan/article/details/53788242
结合beanshell参考:https://blog.csdn.net/foreverlemon/article/details/73792775

Jmeter连接Mysql

1、下载连接mysql数据库jar包,地址:https://dev.mysql.com/downloads/connector/j/ (下载通用版本,解压就可以使用了)
2、将文件拷贝到Jmeter\lib\ext目录下,我的是:D:\Program Files\apache-jmeter-2.11\lib\ext
3、启动Jmeter,在测试计划点击浏览添加刚刚拷贝的jar包。(如果启动后放入的需要重启jmeter)
jdbc:mysql://192.168.1.141:3306/bugfree
com.mysql.jdbc.Driver
root
123456

六.断言(参考资料:https://www.cnblogs.com/imyalost/p/6024306.html)

  • 响应断言:https://www.cnblogs.com/raxliao/p/4332824.html
  • json断言:https://www.cnblogs.com/bell1991/p/7281567.html
  • Bean shell 断言:https://www.cnblogs.com/landhu/p/5606441.html

七.提取器

  • json提取器(https://blog.csdn.net/zha6476003/article/details/80295068)
  • 正则提取器(https://blog.csdn.net/quiet_girl/article/details/50724313)

八.变量属性范围,以及跨线程共享变量方法

1.变量范围说明:
jmeter变量、jmter属性和system属性(https://www.cnblogs.com/yangxia-test/p/4846837.html)
可以通过 添加debug Simpler,查看当前线程组的 所有变量和属性值
JMeter变量对于测试线程而言是局部变量,jmter属性和system属性是全局的
变量和属性的设置和获取方法:(https://www.jianshu.com/p/4c2c73955e1a)
- 变量: 
    1)jmeter界面中直接用 ${变量名}  
    2)beanshell脚本中使用vars变量进行 get("变量名")或put("变量名",value)
       如果是对象:getObject("变量名")putObject("变量名",value);
  - 属性: 
    1)jmeter界面中直接用 ${__getProperty(变量名)}  ${__setProperty(变量名,value)} 
    2)beanshell脚本中使用props变量进行 get("变量名")或put("变量名",value) 
      如果是对象:getObject("变量名")putObject("变量名",value);
2.jmeter跨线程共享变量方法
参考:http://note.youdao.com/noteshare?id=2a591ce7e65855f830afda242910f710
  • 方法一:将获取的cookies值(直接获取系统Cookies变量)设置为jmeter属性变量,这样所有线程组都能获取
  • 方法二:将获取的cookies值(通过提取器获取Cookies)通过线程间通信后处理器和预处理器,进行获取和设置也能获取。

九.beanshell 处理器:

Bean Shell常用内置变量
log:写入信息到jmeber.log文件,使用方法:log.info(“hello world !”);
ctx:该变量引用了当前线程的上下文,使用方法可参考: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变量中
props - (JMeterProperties - class java.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
sampler - (Sampler):gives access to the current sampler

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

10.ant 方式持续构建生成测试结果报告

参考:https://www.cnblogs.com/chengtch/p/6145867.html
逻辑控制器(参考资料:https://www.cnblogs.com/puresoul/p/4886574.html)

10.1 简单控制器(Simple Controller):

作用:这是Jmeter里最简单的一个控制器,它可以让我们组织我们的采样器和其它的逻辑控制器(分组功能),提供一个块的结构和控制,并不具有任何的逻辑控制或运行时的功能。

10.2 循环控制器(Loop Controller):

作用:指定其子节点运行的次数,可以使用具体的数值,也可以使用变量

10.3 仅一次控制器(Once Only Controller):

作用:在测试计划执行期间,该控制器下的子结点对每个线程只执行一次,登录场景经常会使用到这个控制器。
  注意:将Once Only Controller作为Loop Controller的子节点,Once Only Controller在每次循环的第一次迭代时均会被执行。

10.4 ForEach控制器(ForEach Controller):

作用:ForEach控制器一般和用户自定义变量一起使用,其在用户自定义变量中读取一系列相关的变量。该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值。
参数:
Input Variable Prefix:输入变量前缀
Output variable name:输出变量名称
Start index for loop(exclusive):循环开始的索引(这里如果不填写,默认从1开始,如果没有1开始的变量,执行时会报错)
End index for loop(inclusive):循环结束的索引
Add””before number:输入变量名称中是否使用“”进行间隔。

10.5 事务控制器(Transaction Controller):

作用: 事务控制器会生产一个额外的采样器,用来统计该控制器子结点的所有时间。

10.6 If 控制器(If Controller):

作用:根据给定表达式的值决定是否执行该节点下的子节点,默认使用javascript的语法进行判断(如下图红框内的文字)。

10.7 Switch控制器(Switch Controller):

作用:Switch控制器通过给该控制器中的Value赋值,来指定运行哪个采样器。有两种赋值方式:
第一种是数值,Switch控制器下的子节点从0开始计数,通过指定子节点所在的数值来确定执行哪个元素。
第二种是直接指定子元素的名称,比如采样器的Name来进行匹配。当指定的名称不存在时,不执行任何元素

你可能感兴趣的:(Jmeter 环境和基本理论汇总)