1JMeter基础培训2011年7月2目录•JMeter介绍•JMeter介绍•谁在使用JMeter•JMeter与Loadrunner的对比•JMeter在测试工作的应用•JMeter二次开发3JMeter介绍•JMeter是基于Java的,开放源代码的性能测试工具•能够对HTTP和FTP服务器进行压力和性能测试•可以对任何数据库进行同样的测试(通过JDBC)•各种负载统计表和可链接的计时器可供选择•缓存和离线分析/回放测试结果•完全多线程框架•高可扩展性免费/开源4谁在使用JMeter谁在使用JMeter•移动梦网搜索项目•盘古搜索项目56目录•JMeter介绍•JMeter与Loadrunner的对比•支持的协议对比•功能对比•使用对比•JMeter在测试工作的应用•JMeter二次开发7支持的协议对比•JMeter支持的协议•Web(HTTP/HTTPS),SOAP,FTP,Database(JDBC),LDAP,JMS,Mail(POP3/IMAP),JAVA•Loadrunner支持的协议•WEB(Http/Html)、FTP、LDAP、Palm、Web/WinsocketDualProtocol•SQLServer、MSODBC、Oracle、DB2、SybaseCTlib、SybaseDBlib、DomainNameResolution(DNS)、WindowsSocket•COM/DCOM、Corba-Java、Rmi_JavaEJB、Rmi_Java•OracleNCA、SAP-Web、SAPGUI、SAPGUI/SAP-WebDualProtocol、PropleSoft_Tuxedo、SiebelWeb、Siebel-DB2CLI、Sieble-MSSQL、SiebleOracle•……JMeter支持的协议相对Loadrunner较少,但是可以通过二次开发来实现8JMeter与Loadrunner功能对比对比项JMeterLoadrunner支持的协议少多结果报表少丰富测试场景灵活灵活运行环境Windows/Unix/LinuxWindows/Linux(部分支持)IP欺骗功能无有9使用对比对比项JMeterLoadrunner安装简单复杂脚本录制很好较好脚本语言C,JAVA,VBXML编辑方式修改脚本图形界面修改成本免费昂贵学习资料较少(逐渐丰富)很多10目录•JMeter介绍•JMeter与Loadrunner的对比•JMeter在测试工作的应用•JMeter主要组件介绍•脚本录制•运行JMeter•参数化设置•动态关联•场景设置•JMeter测试实例•JMeter二次开发11JMeter主要组件(测试计划)•测试计划(TestPlan)是使用JMeter进行测试的起点,它是其它JMeter测试元件的容器。•用户定义的变量:用户可以自己定义变量,在用到此变量的时候直接用${变量名}引用即可。例如:${ip},${port}•Adddirectoryorjartoclasspath:向类路径即%JMeter-HOME%\lib中添加目录及jar包12JMeter主要组件(线程组)•名称:线程组的名字。•线程数:设置发送请求的用户数目,即并发数。•Ramp-UpPeriod(insecond):线程启动的时间,单位是秒。即所有线程在多少时间内启动。•循环次数:请求的重复次数,如果选择后面的“永远”,那么请求将一直继续;而在输入框中输入数字,那么请求将重复指定的次数,如果输入1,那么请求将执行一次。•启动时间:测试计划什么时候启动。•结束时间:测试计划什么时候结束。•持续时间:测试计划持续多长时间,会覆盖结束时间。•启动延迟:测试计划延迟多长时间启动,会覆盖启动时间。13JMeter主要组件(取样器)•名称:HTTP请求的名字。•Web服务器-服务器名称或IP、端口号,脚本录制时自动添加,也可以使用“用户自定义变量”。•HTTP请求:用默认值即可。•同请求一起发送参数:请求中的参数、值可以在此设置,需要用到参数化及动态数据关联,后面专门介绍。•同请求一起发送文件:我可以制定同请求一起发送哪个文件。•其他任务包括:从HTML文件中获取所有内含的资源、用作监视器14JMeter主要组件(监听器)•监听器(Listener)负责收集测试结果,支持将结果数据写入文件。同时也被告知了结果显示的方式。我们常用的包括:•聚合报告、•查看结果树、•用表格查看结果、•图形结果JMeter主要组件聚合报告:Label:这里对应一个HTTPRequest,显示的就是Name属性的值;#Samples:表示你这次测试中一共发出了多少个请求;Average:平均响应时间,默认情况下是单个Request的平均响应时间,当使用了“事务控制器”时,以事务为单位为单位显示平均响应时间Median:中位数,也就是50%用户的响应时间90%Line:90%用户的响应时间Min:最小响应时间Max:最大响应时间Error%:本次测试中出现错误的请求的数量/请求的总数Throughput:吞吐量,默认情况下表示每秒完成的请求数。KB/Sec:每秒从服务器端接收到的数据量JMeter主要组件查看结果树显示取样器请求和响应的细节,包括消息报头,请求的数据,相应数据JMeter主要组件表格查看结果显示每一请求的信息,包括发起请求的线程,开始时间,请求响应时间,请求字节数JMeter主要组件图形结果脚本录制•使用JMeter的代理服务器功能进行脚本录制•利用Badboy进行脚本录制,再转为JMeter脚本19使用JMeter录制•在测试计划中添加线程组,在线程组中添加“配置元件”-“HTTP请求默认值”,设置被测系统的IP和端口。•在“工作台”中添加“非测试元件”-“HTTP代理服务器”。端口:即代理服务器的监听端口,设为9999。•目标控制器选择测试计划中的线程组;分组选择:不对样本分组。排除模式:.*.jpg,.*.gif•配置浏览器代理,和“HTTP代理服务器”设置保持一致•启动JMeter工作台“HTTP代理服务器”;•打开浏览器,登录测试网站,在测试网页上进行操作;•完成后,停止JMeter工作台“HTTP代理服务器”;20使用JMeter录制21使用Badboy录制•使用Badboy录制•选择“File-ExporttoJMeter”菜单,导出为JMeter脚本,使用JMeter打开22运行JMeter进行测试•图形界面•命令行模式运行–JMeter.sh-n–ttest.jmx-llog.jtl–-n告知JMeter采用非图形化运行JMeter脚本–-t指定要运行的脚本文件–-l指定保存执行结果的文件名参数化设置•在我们的过程中,通常会提交一些参数,使用不同的参数值来模拟才更接近实际情况。•参数定义后,使用${paramName}既可以使用24参数化设置用户自定义变量•使用测试计划中的用户定义变量作为参数•一般定义全局变量,如:IP,端口文件参数•利用配置元件中的CSVDataSetConfig进行参数化设置函数参数•使用JMeter提供的函数进行参数化•JMeter提供“函数助手”的向导25用户自定义变量26文件参数•在一个HTTP请求中,要提交多个参数,其中category,query两个参数需要做参数化,数据保存在文件中27文件参数•使用配置元件-CSVDataSetConfig28•Filename文件名:即参数化要引用的文件名•Fileencoding:文件编码:可以不填。•VariableNames(comma-delimited)变量名(用逗号分割):多个变量可以引用同一个文件,用逗号分割。这里是num1,num2•Delimiter:参数文件中多个变量值的分隔符,\t表示用tab键分割,默认是逗号。•RecycleonEOF:结束后是否循环?默认是True.函数参数•JMeter函数助手的功能,里面内置了多个函数;29文件参数•选择一个功能_Random。•设定最小值为1。•设定最大值为100。•函数名称设为num1。•点击生成将生成一个引用字符串${_Random(0,100,num1},在需要的请求参数中拷贝该字符串即可。•其中函数名称用来在引用中作区别,即我们可以设定不同的名称在不同的地方引用同一个函数的功能。30动态关联•在HTTP请求的参数中经常会遇到一些参数的值是从服务器相应的动态数据,这些数据需要进行关联才能使得每一次请求都能成功得被服务器接受,在JMeter中采用正则表达式提取器来获取这些动态的数据。•正则表达式允许用户从服务器响应中获取数据,作为一个后置处理器,正则表达式提取器会在每一个请求执行后再执行,正则表达式提取请求的参数值,产生模板字符串,并将结果保存到给出的变量中。31动态关联•在脚本录制完毕以后,运行一遍录制的脚本,使用“察看结果树”监听器,分析那些需要做动态关联(一般建议先使用HttpWatch分析那些要做动态关联);•以基于WEB_BAS的SQMAS为例。经过分析,在登录时,会cookie会记录一个JSESSIONID,每次提交请求时,会post一个ticket。32动态关联•添加一个正则表达式提取器,提取JSESSIONID;•可以添加一个响应断言,测试提取结果;${jessionid_g1}表示匹配第一组数值,这里只有一个,也可以直接使用${jessionid}33动态关联•运行测试计划,测试提取结果34动态关联•修改ticket,使用提取的JSESSIONID35场景设置•JMeter的逻辑控制器提供了一系列的组件,可以实现多样化的场景控制。•常用的逻辑控制器有:循环控制器,事务控制器36JMeter测试实例•HTTPGET测试•基于WEB_BAS的测试实例•HTTPXML测试37目录38•JMeter介绍•JMeter与Loadrunner的对比•JMeter在测试工作的应用•JMeter二次开发•自定义协议实现思路•应用举例HTTPGET测试39基于WEB_BAS的测试实例40JMeter二次开发•JMeter取样器提供了一些协议的测试支持。如果不能满足测试需要,需要做二次开发。•JMeter是基于Java语言实现的,例如http请求,它只是用Java代码封装了Http的协议,内部其实使用了Java的类库来对应用发送请求的,所以通过Java请求的性能测试,我们可以做任意自定义协议请求的性能测试41JMeter自定义协议实现思路•新建一个测试类,继承org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient•实现getDefaultParameters,setupTest,runTest,teardownTest方法–getDefaultParameters是配置参数的方法–setupTest和teardownTest与JUnit中的类似,分别在测试的开始和结束时执行。–runTest为主要测试方法,所有测试程序都在这里完成。42应用举例•盘古索引项目需要对后台分布式索引系统进行性能测试,经过分析,直接对web搜索页面进行测试得到不能得到真实的性能情况。•解决方法:使用JMeter二次开发,调用分布文件系统的查询API进行性能测试43应用举例•创建一个indexBaseTest类44publicclassindexBaseTestextendsAbstractJavaSamplerClientimplementsSerializable{}应用举例•实现getDefaultParameters方法45publicArgumentsgetDefaultParameters(){Argumentsparams=newArguments();//增加一个参数,默认值为空,参数名显示为params.addArgument(KEY,);returnparams;}应用举例•实现setupTest方法4