《LoadRunner性能测试巧匠训练营》第5章 开源性能测试工具Apache Jmeter快速入门
3.Jmeter快速入门之HTTP脚本实战
3.1 测试计划
测试计划是使用JMeter进行测试的起点,它是其他JMeter测试元件的容器,每个测试场景/脚本都包含一个测试计划,也可以说,每个测试场景/脚本都叫一个测试计划。

下面是JMeter测试计划的一些参数说明。
1)Name:可以为测试计划取一个有意义的名称。
2)Comments:对测试计划的注释。
3)User Defined Variables:用户可以自定义变量,在用到此变量时直接用${变量名}引用即可。这里的变量相当于一个全局变量,作用于整个测试计划。
4)Run Thead Groups consecutively:勾选以后,所有线程组都是顺序执行的了。一般不勾选,让所有的线程组并发启动。
5)Run tearDown Thread Group after shutdown of main threads:结束线程运行后,停止主线程。
6)Functional Test Mode:勾选后会有详细的请求记录,消耗资源,严重影响客户端性能。一般不勾选。
7)Add directory or jar to classpath:向类路径(即%JMeterHOME%\lib)中添加目录及JAR包。例如,在使用JDBC请求前需要加载的JDBC驱动包,可以在此添加,测试Java请求时,需要引用的JAR包也可以在此处直接添加引用。
3.2 Vuser及场景设计
在测试计划基础上新建一个线程组,线程组的属性如下图所示,JMeter的场景设计以及Vuser都是在线程组下设计完成的。
线程组里的“线程数”相当于LoadRunner中的Vuser,线程数量就是实际压测过程中的并发用户数。线程组里的“循环次数”以及“调度器”相当于Loadrunner中的场景设计模块,它决定了线程组加压的方式以及持续次数或者持续时间。
JMeter线程组元素的使用说明如下。
1)Name:线程组的名称。
2)Comments:对于这个线程组的解释。
3)Action to be taken after a Sampler error:继续、启动下个线程、停止线程、停止测试。
4)Thread Properties:包含以下几个选项。
Number of Threads:相当于LoadRunner的并发用户数,代表启动多少个线程对应用进行并发。
Ramp_Up Period(in seconds):线程间的时间间隔,如200个线程在1秒内启动,类似于LoadRunner中Vuser的初始化设置。
Loop Count:请求的重复次数。如果选择后面的永远(默认),那么请求将一直继续;如果不选择永远,而在输入框中输入数字,那么请求将重复指定的次数。例如输入1,就表示请求将执行一次。但如果输入0,请求就不会被执行。如200个线程对服务器发送请求,每个线程请求1次,一共对服务器产生200次请求。这比LoadRunner中的场景设计要灵活一些,可以直接按照“多少并发×运行次数”来控制对服务器发送多次请求。
Delay Thread creation until needed:延迟创建线程,直到需要创建时创建。
5)Scheduler:包含以下几个选项。
·启动时间:测试计划什么时候启动,启动延迟会覆盖启动时间设置项。
·结束时间:测试计划什么时候结束,持续时间会覆盖结束时间设置项。
·持续时间(秒):测试计划持续多长时间,会覆盖结束时间。
·启动延迟(秒):测试计划延迟多长时间启动,会覆盖启动时间。
·备注:调度器的组合设置,可以控制JMeter测试计划什么时间执行、持续执行的时间。
3.3 Jmeter之脚本录制
- 利用badBoy录制脚本
- 利用Jmeter代理服务器功能录制
- 两种录制方式的区别
1)利用Badboy录制比较简单,不需要利用代理,录制也与LoadRunner类似,录制脚本的层次更清晰。使用Badboy进行HTTP脚本录制更加方便和直观。
2)JMeter代理录制较为复杂,但是能录制到URL相关的静态文件(CSS、JPG等)以及dwr请求,但是Badboy不能。
3)简单的HTTP直接用Badboy录制,不需要用JMeter录制后去掉无用的CSS等信息,但是比较复杂的应用,如dwr请求的,还是需要用JMeter代理录制。
3.4 Jmeter参数化
- 使用用户自定义变量
- 使用函数助手里的随机函数进行参数化(_Random函数、_threadNum函数或者CSV相关函数)
(1)方法一
1)在JMeter中选择“选项”→“函数助手对话框”,打开“函数助手”对话框,
2)选择一个函数,如_Random
①设定最小值为1。
②设定最大值为100。
③函数名称设为key。
④单击“生成”按钮将生成一个引用字符串${__Random(1,100,kye)},在需要进行参数化的地方替换生成的随机函数即可。
(2)方法二
1)与方法一类似,打开“函数助手”对话框,选择函数助手的_CSVRead函数
2)在本地生成一个参数化文件,JMeter的参数化文件与LoadRunner的参数化文件有一个显著的区别就是,JMeter参数化文件里没有文件列名,而不像LoadRunner第一行是参数化文件的列名。
3)文件生成后,输入参数化文件的路径。 - 使用配置原件中的CSV Data Set Config进行参数化设置

在该界面中可以设置以下参数。
1)Filename:文件名,指参数化的文件目录,可以是相对路径或者绝对路径。如果使用相对路径,则需要将参数化的文件放在当前测试计划所在的路径下。
2)File encoding:文件编码,可以不填,默认的编码方式是ANSI,如果文件是用其他编码方式保存的,就需要使用文本文件对应的编码方式,如GBK或者UTF-8。
3)Variable Names(comma-delimited):参数名称,这里是key,如果有多个参数,就写多个参数的名称,每个名称中间用分隔符分隔,分隔符在下面的eDelimiter中定义,如key1,key2。
4)Delimiter(use‘\t’for tab):参数文件中多个变量值列用什么分隔,\t表示用tab键分隔,默认是用逗号分隔。
5)Allow quoted data:是否允许引用数据,默认为False,表示在引用参数化文件中的值时,文件中是什么值,就传递什么值到参数中。例如,参数化文件有一个值是“安大叔”,如果为False,引用时用的是“安大叔”;如果为True,则引用到的值就是安大叔,也就是当为True时,会把参数化文件中双引号里的内容当作响应的参数化取值。
6)Recycle on EOF:结束后是否循环?选择True或者False,默认是True。CSV Data Set Config是一次读入一行数据,数据分隔后存入变量中交给一个线程,当设置的线程数超过参数化文件里的参数化数量时,可以选择数据不够用后,是否从头循环开始重新读入数据,为True表示循环读入数据,为False则表示不循环读入数据。
7)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,如果设置线程数目为10,而参数化文件里只有5行数据,那么只会请求5次。
·Stop thread on EOF选择Flase,如果设置线程数目为10,而参数化文件里只有5行数据,那么会请求10次;但是因为第6次取不到参数化数据,所以从第6次之后的请求可能会请求错误。
8)Sharing mode:共享模式,分为All threads、Current thread group、Current thread,这个地方和LoadRunner中参数化中的迭代取值相反,
·All threads:选择该项,Test plan中所有线程共享CSV文件中的数据,所有线程按照顺选方式取CSV文件中的不同记录。测试计划中的所有线程,假如设置了10个线程,线程1取了一次值后,线程2取值时,取到的是CSV文件中的下一行,即与线程1取的不是同一行。
·Current thread group:选择该项,Test plan中所有线程共享CSV文件中的记录。在当前线程组中,假设有线程组A、线程组B,A组内有线程A1到线程An,线程组B内有线程B1到线程Bn。取值的情况是:线程A1取第1行,线程A2取第2行,线程B1取第1行,线程B2取第2行。
·Current thread:选择该项,每个线程各自独立地使用CSV文件中的记录。假设设置了10个线程,则线程1取第1行,线程2也取第1行。
3.5 Jmeter关联
JMeter也有类似于LoadRunner的关联,不过JMeter的关联是用基于正则表达式和XPath Extractor等实现的。
例子:把测试结果值中返回的helloWorld作为关联值,以便在后面需要用到的地方使用。例如,这里需要将wd=helloWorld&ie=utf-8中返回的helloWorld进行关联。
首先在需要获得数据的请求上右击,依次选择“添加”→“后置处理器”→“正则表达式提取器”。
正则表达式相关界面解释如下:
Name:取一个有代表性的名称即可。
Comments:对本次正则表达式的注释,注释自己能理解的意思即可。
Apply to:默认即可。
Filed to Check:与LoadRunner中的tree视图有些类似,表示在哪个地方提取正则表达式,一般选择主体(Body)即可。
Name of Created variable:其他地方引用提取值的变量名称,这里如填写的是BT,那么其他地方具体的引用方式是${BT}。
Regular Expression:提取的正则表达式主体,这里是wd=(.*)&ie=utf-8;(.*)表示要提取的内容,wd=(.*)相当于LoadRunner中的左边界,utf-8相当于LoadRunner中的右边界。如果碰到返回结果值是多个相同的导致结果,就用正则中的“?”代替“.*”,代表找到第一个匹配项后,停止,如parent.location='/bugfree/case/(.+?)';。
Template:用$$引用起来,如果在正则表达式中有多个提取表达式,则可以是$1$、$2$等,表示将解析到的第几个值给提取到的变量,正则表达式的提取模式,值从1开始,值0对应的是整个匹配的表达式。
Match N(0代表随机):0代表随机,-1代表所有,其余正整数表示对应第几个匹配内容。例如,4代表匹配第4个结果值。如果在LR中,取出的值是一个数组,还需要处理一下,LR11版本用一个随机的函数即可,不用写大段的代码来处理数组。
Default Value:如果返回结果中没有匹配的值,则变量的值采用默认值。