一.工具下载和准备:
- 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来进行匹配。当指定的名称不存在时,不执行任何元素