2)File encoding:csv文件编码,可以不填
3)Variable Names:变量名,多个变量用“,”(英文逗号)分开。变量使用格式${OA_VendingMachineNum}和${Name}【注:JMeter2.3.4以后的版本,支持CSV标题行,如果变量名为空,那么文件的第一行将被读取,并被解释为列名的列表。这些变量名必须使用分割符加以区分,他们可以使用双引号加以引用。默认情况下,该文件仅打开一次,而每个线程会使用文件中不同的数据行。至于数据行传递给线程的顺序,依赖于他们执行的顺序,数据行在每次测试循环的开始阶段读取,文件名和模式在第一次循环时解析。】
Delimiter:csv文件中的分隔符(用”\t”代替tab键)(一般情况下,分隔符为英文逗号)
4)Allow quoted data:是否允许引用数据(尚不清楚)
5)Recycle on EOF :到了文件尾处,是否循环读取参数,选项:true和false。因为CSV Data Set Config一次读入一行,分割后存入若干变量交给一个线程,如果线程数超过文本的记录行数,那么可以选择从头再次读入
6)Stop thread on EOF:到了文件尾处,是否停止线程,选项:true和false
当Recycle on EOF 选择true时,Stop thread on EOF选择true和false无任何意义,通俗的讲,在前面控制了不停的循环读取,后面再来让stop或run没有任何意义
当Recycle on EOF 选择flase时,Stop thread on EOF选择true,线程4个,参数3个,那么只会请求3次
当Recycle on EOF 选择flase时,Stop thread on EOF选择flase,线程4个,参数3个,那么会请求4次,但第4次没有参数可取,不让循环,所以第4次请求错误
7)Sharing mode:共享模式,All threads –所有线程,Current thread group—当前线程组,Current thread—当前线程。经试验得出来的结果是(不考虑线程组迭代):
如果测试计划中有线程组A、线程组B,A组内有线程A1到线程An,线程组B内有线程B1到线程Bn,CSV Data Set Config放在线程组A的下级组织树,不管怎么设置Sharing mode,都只针对线程组A且取之情况一样:线程A1取第一行,线程A2取第二行。CSV Data Set Config放在测试计划下级组织树(与线程组并列),情况如下 :
8)All threads:测试计划中所有线程,线程组A、线程组B共用一个CSV文件,所取数据与线程实际执行顺序有关(先执行先取)。补充一点:线程组之间是并行执行,各线程实际执行时间根据Ramp-UP Period而来,如下图,若线程A、线程B均设置Ramp-Up Period:2,取之情况是:线程A1取第1行,线程B1取第2行,线程A2取第3行,线程B2取第4行。
Current thread group:取之情况是:线程A1取第1行,线程A2取第2行,线程B1取第1行,线程B2取第2行。(线程组互不影响)
Current thread:当前线程。A1取第一行,A2取第一行;B1取第一行,B2取第一行(均取第一行)
被用来为其作用域内的HTTP请求提供缓存功能,如果“Use Cache-Control/Expires header When ..."选中,那么会根据当前时间来选择,如果请求是”GET",而时间指向未来,那么采样器就会立即返回,而无须从远程服务器请求URL,这样是为了模拟浏览器的操作,请注意Cache-Control头必须是“pulic”的,并且只有"max-age"终结选项会被处理,如果请求文档自从其被缓存以来没有发生任何改变,那么响应包体就会为空。
5.5 HTTP Cookie 管理器
储存在用户本地终端上的数据,主要用于默认cookie管理
通常情况下,当用户结束浏览器会话时,系统将终止所有的cookie,当web服务器创建了Cookie后,只要在其有效期内,当用户访问同一个Web服务器时,浏览器首先要检查本地的cookies,并将其原样发送给web服务器
作用:
1)发送请求,经常要校验cookies信息
2 )录制时使用的cookie管理器,只能在指定的域下面使用,如果服务器地址切换,发现发送请求时,就会出现no cookies
最典型的应用:
(1)判断注册用户是否已经登录网站,用户可能会收到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续
(2)购物车之类的处理,用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入cookies,以便在最后付款时提取信息
如图,禁用了cookie,登录成功,但访问其它页面时仍跳转到了登录页面
缺少cookie页面不能访问.png
如何设置:
1、自动管理cookies,jmeter配置文件中设置(bin目录)CookieManage.save.cookies=true,去掉前面的#,然后重启jmeter
2、手动添加cookies,可以利用Firefox中导出cookies之后,再导入Jmeter中轻松完成(浏览器需安装Firebug)
5.6 HTTP信息头管理器
可添加或者重载HTTP请求头,JMeter目前支持多个信息头管理器,信息头目将被合并起来构成采样器列表。如果一个待合并条目匹配一个已经存在的信息头名,那么它就会替代目前的条目,除非条目值是空,在这种情况下已经存在的条目会被移除,这容许用户设置一系列默认信息头,并对特定采样器加以调整。
内容为空,有需要的时候进行添加,否则无需处理
一般的请求格式:
1、类似form表单
2、参数json格式,添加Content-Type:application/json,utf-8
3、参数是XML,添加text/xml
注:HTTP请求下的【HTTP信息头管理器】,有些值是发送请求必须的头信息,比如Referer、X-Requested-With、Content-Type(目前发现这几个可能会影响请求是否成功)
5.7 HTTP授权管理器
可以理解为用户名和密码的验证过程,也是一种验证机制,比如说客户端或浏览器与服务端发生交互、发生请求时,需要提供凭证(URL、用户名、密码),提交后服务端通过后才会继续后续的请求或者交互
5.8 HTTP请求默认值
该组件可以为我们的http请求设置默认的值。假如,我们创建一个测试计划有很多个请求且都是发送到相同的server,这时我们只需添加一个 Http request defaults组件并设置“Server Name or IP”,然后添加多个http请求且不设置"server name or ip",这些http请求会默认使用Http request defaults组件设置的值。
参数列表:
Attribute |
Description |
Required |
Name |
组件名 |
No |
Server |
域名或IP |
No |
Port |
端口 |
No |
Connect Timeout |
连接超时时间(单位毫秒) |
No |
Response Timeout |
响应超时时间(单位毫秒) |
No |
Implementation |
实现方式,默认值为Jmeter属性:jemter.httpsampler |
No |
Protocol |
协议,HTTP or HTTPS |
No |
Method |
请求方法:HTTP GET or HTTP POST |
No |
Path |
请求资源路径 |
No |
Send Parameters With the Request |
参数列表 |
No |
Server (proxy) |
代理服务器的域名或IP |
No |
Port |
代理服务器的端口 |
No, unless proxy hostname is specified |
Username |
代理服务器的用户名 |
No |
Password |
代理服务器的密码 |
No |
Retrieve All Embedded Resources from HTML Files |
告诉Jmeter解析HTML文件并发送所有资源请求(包括图片,java小程序,JS,CSS等) |
No |
Use concurrent pool |
用一个连接池来获取嵌入的资源 |
No |
Size |
用于获取嵌入式资源的并发连接池大小 |
No |
Embedded URLs must match: |
URL匹配,过滤 |
No |
☆特别注意:
在Jmeter之Http Cookie Manager这里我们说过,一个测试计划最好只有一个Manager组件,因为Jmeter无法处理多个Manager的情况。但在一个测试计划中可以有多个Defaults组件,多个Defaults组件的默认值会叠加。
例子:
如下,定义了两个HTTP Request Defaults组件,一个Http sampler(one什么也不填写),一个View Resuls Tree:
HTTP Request Defaults1:Server Name or IP: www.baidu.com,一个参数:aaa=111
HTTP Request Defaults2:Server Name or IP: www.qq.com,两个参数:bbb=22,aaa=333
运行结果:
总结:
1、一个测试计划中可以有多个Defaults组件,多个Defaults组件的默认值会叠加,如上图,虽然两个Defaults 组件都定义了参数aaa,但发出的请求还是会叠加起来。
2、两个default中都定义的"Server Name or IP",显示在发送请求时只能使用一个,这里使用的是第一个default定义的值www.baidu.com
在说下默认请求的作用域,可以设置成全局变量,也可以设置成局部变量,当在线程外设置,线程内也设置了,使用线程内的默认值
如果在Jmeter 中想用到连接数据库的功能,必须下载jar包,常见的关系型数据库jar包见以下共享链接
链接:https://pan.baidu.com/s/1t-k9RW141lw0j_QSw53rqg
提取码:p8ip
jar包下载之后存放的路径,网上大多数资料让保存在D盘根目录下,我一般建议保存在对应Jmeter的lib下的扩展目录,比如 D:\00G_jmeter4.0\lib\ext
若是第一种: 下载的jar包保存在D盘根目录下,则需要jmeter工程中测试计划原件下指定一下jar包路径,如图:【图中jar包只是示意,不是jdbc依赖的jar包】
若是第二种: 下载的jar包保存在Jmeter的文件的lib下的ext目录下,则不需要做其他的配置了,也不用担心以后给其他电脑copy文件,忘记copy某个文件夹了。
有了依赖的jar包后,从配置元件中选择JDBC Connection Configuration,如下
将以上分为4个区域,先来介绍1区域Variable Name for created pool:
由于版本不同,我这边是jmeter4.0版本,叫做Variable Name for created pool;其他的版本有叫做Variable Name...
Variable Name for created pool: 填写入一个变量名,需要和用到的JDBC request 中,或者JDBC PreProcessor,或者JDBC PostProcessor中的变量名一致;如此一来,一个测试计划中可以绑定多个DB源;
其次介绍2区域,数据库连接的配置,将数据库url/port/db name/用户名和密码等填入
按照下面常用的sample填写即可
1.mysql数据库
Database URL :jdbc:mysql://localhost:3306/test --有时候会加上字符编码等,如 jdbc:mysql://ip:3306/数据库名?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
JDBC Driver class: 选择com.mysql.jdbc.Driver
Username:root
Password:root
2. sqlserver数据库
Database URL :jdbc:sqlserver://localhost:1433;databaseName=test
JDBC Driver class: 选择com.microsoft.sqlserver.jdbc.SQLServerDriver
3. Oracle数据库 【未亲测】
Database URL : jdbc:oracle:thin:user/pass@//host:port/service
JDBC Driver class: 选择 oracle.jdbc.OracleDriver
接下来介绍3区域,一般默认,Validation Query 一般选择 select 1
最后是4区域,关于数据库连接池的配置,你在一般使用中,默认即可;但是你想压测,单独负载测试DB,想找出DB最适合的连接池,就要稍加注意。我之后会再总结下.
MySQL
com.mysql.jdbc.Driver
jdbc:mysql://host:port/{dbname}
PostgreSQL
org.postgresql.Driver
jdbc:postgresql:{dbname}
Oracle
oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:user/pass@//host:port/service
Ingres (2006)
ingres.jdbc.IngresDriver
jdbc:ingres://host:port/db[;attr=value]
MSSQL
com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc:sqlserver://IP:1433;databaseName=DBname
或者
net.sourceforge.jtds.jdbc.Driver
jdbc:jtds:sqlserver://localhost:1433/"+"library"
lOutput Format -可选格式,比如000,格式化为001,002,Minimum Value,Maximum Value都设置为1,Number format设置为000,那么格式化后,第一个参数值为001,第二个为002,……,以此类推,假设format设置为user_000,那么格式化后,第一个参数值为user_001,第二个参数值为user_002,...,以此类推。默认格式为Long.toString()
lMinimum Value 生成的最小随机数
lMaximum Value 生成的最大随机数
lSeed for Random function - 供随机数生成器使用的seed.如果为空,则使用默认的Random构造器。
lPer Thread(User)? - 如果设置为False,那么所有线程共享同一个随机数生成器,如果设置为True,那么每个线程独享各自的随机数生成器
多线程运行的情况下:
l假如Seed for Random function不为空,为手动输入的某个固定常量,
1) Per Thread(User)? 设置为True,那么每个线程都使用自己的随机数生成器,因为Seed相同,所以,每次运行脚本,每个线程获取到的随机数变量值是一样的。
2) Per Thread(User)? 设置为False,那么每个线程共享同一个随机数生成器,所以,每次运行脚本,每个线程获取到的随机数变量值是不一样的。
l假如Seed for Random function不为空,即按默认,那么不管per Thread(User)?设置为True还是设置为False,生成的随机数都不相同
lseed相同,per Thread 设置为True ,每个线程使用各自的随机数生成器,所以两个生成的随机数相同,要不同则设置为False
不管是多线程还是单线程,使用相同的Seed,运行相同次数,对应次数生成的随机数完全相同。
,也就是说,随机数生成器是根据Seed,然后按照某种算法一步一步生成随机数的,如果Seed一定,算法相同,那么对应步骤产生的随机数也就一样
推荐设置:
无特殊需求的情况下,建议Seed for Random function 不填,使用默认,Per Thread(User)?
设置为False
简单来说,tcp取样器的使用和HTTP请求流程基本一样,都是建立sampler之后填写必要的信息即可。如下图
参数填写介绍
如上图基本我们就是要注意红框里的几处即可,下面分别做一个介绍。
TCPClient classname有三种设置:
TCPClientImpl:文本数据
BinaryTCPClientImpl:传输二进制数据,指定包结束符
LengthPrefixedBinaryTCPClientImpl:数据包中前2个字节为数据长度。可在bin/jmeter.properties配置文件中tcp.binarylength.prefix.length设置。
tcp的数据还是以二进制之类的居多吧,所以为了方便一般会选择第二个设置。所以填写org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl
服务器ip和端口:应该不用多说了,根据实际情况填写即可;
要发送的文本:这里就是16进制的数据了,可能会有朋友问这数据从哪里获取啊!当然是抓包获取了。。。。。可以用wireshark来搞,类似下图(从网上找的图)
如果在其他地方定义了一个同样名称的变量,该变量的值会跟着更新。
引用已定义的变量:${变量名},比如: ${name}
如果变量未定义的话,引用变量会直接返回表达式
比如变量 a 未定义,引用变量 ${a},返回值就是:${a}
1.Jmeter对于变量名好像没有什么限制,任意字符都可以,比如数字、中文、特殊符号什么的,甚至表达式本身也可以做为变量名,比如变量名设置为 ${age},最终结果变量名会是12(age的值是12),但一般不建议设置比较奇葩的变量名,免得不知道什么时候就会出现个奇怪的问题
2.变量值尽量不要使用函数去生成不同的值,比如age值为:${__Random(1,10,),它事实上每次运行只会产生一个值,而不会在每个请求中分别生成的不同的随机值。
需要说明的是,服务器IP地址和端口号以及接口共同的请求路径部分,作为变量引用时,需要在路径填充表格的最前面添加两个斜杠“//”,不加的话会引用失败。
PS:如果遍历一次后已经达到最大值了,但还达到线程的循环数,此时又会重头开始遍历
为了看起来更直观一点,把线程数改成15,重新运行,结果如下:
作者:倔强的潇洒小姐
链接:https://www.jianshu.com/p/a36d964c5f0f
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。