的元件)
一.Jmeter添加测试计划(Test Plan)1.JMeter脚本就是个测试计划(TestPlan)也是个管理单元1.1.JMeter请求模拟与并发数(设置线程数一个线程代表一个虚拟用户)设置都在脚本文件中一起设置1.2.JMeter不像LoadRunner把脚本与虚拟用户设置分开2.要素一脚本中测试计划只能有一个2.1.Jmeter测试计划类似LR中Controller中的测试场景同一时刻场景故然只能有一个2.2.JMeter脚本在GUI中显示时是树型结构测试计划是根节点根节点当然只能有一个3.要素二测试计划中至少要有一个线程组3.1.JMeter负裁是通过线程组驱动的所以计划中至少要出现一个线程组3.2.JMeter测试计划支持多个线程组3.3.可以在计划下面建立多个线程组类似LR中的Group方式的场景3.3.1.可以把JMeter计划理解成LR中的Group方式场景3.3.2.把不相关联的业务分布在不同的线程组中(LR中的不同Group)4.要素三至少要有一个取样器4.1.测试的目的就是要模拟用户请求没有取样脚本就毫无意义5.要素四至少要有一个监听器5.1.测试结果用来衡量系统性能我们需要从结果中分析系统性能二.Jmeter测试计划(Test Plan)元件1.打开Jmeter页面包括测试计划工作台2.注意最新版的jmeter去掉了工作台2.1.不要大惊小怪的导出截图问JMeter为什么没有工作台同事的有工作台2.2.如果想要就下载一个低版本的JMeter安装好启动以后就可以看到JMeter也有工作台三.Jmeter测试计划(Test Plan)1.TestPlan(测试计划)用来描述一个性能测试包含与本次性能测试所有相关的功能1.1.也就说本次的性能测试的所有内容是于基于一个计划的2.右键单击测试计划弹出菜单它用来描述一个测试方案包含与本次性能测试所有相关的功能2.1.也就说本次测试的所有内容是于基于一个计划的3.测试计划对象具有一个名为“ 函数测试模式 ” 的复选框3.1.如果选择它将使JMeter记录每个样本从服务器返回的数据3.2.如果在测试侦听器中选择了文件则此数据将被写入文件3.3.如果要进行少量运行以确保正确配置JMeter并确保服务器返回预期结果这将很有用3.4.结果是文件将快速增长JMeter的性能将受到影响3.4.1.如果要进行压力测试则应禁用此选项(默认情况下处于禁用状态)3.5.如果没有将数据记录到文件中则此选项没有区别3.5.1.还可以使用监听器上的“ 配置”按钮来确定要保存的字段四.Jmeter线程组Threads(Users)1.线程组元素是任何测试计划的起点1.1.所有控制器和采样器必须在线程组下1.2.其他元素(侦听器)可以直接放置在测试计划下它们将应用于所有线程组1.3.线程组元素控制JMeter将用于执行测试的线程数2.设置线程数每个线程将完整地执行测试计划并且完全独立于其他测试线程2.1.多个线程用于模拟与服务器应用程序的并发连接3.设置加速时间加速时间告诉JMeter将“加速”到所选线程的总数需要多长时间3.1.如果使用10个线程并且启动周期为100秒那么JMeter将花费100秒来启动和运行所有10个线程3.1.1.每个线程将在上一个线程开始后10(100/10)秒开始3.1.2.如果有30个线程启动周期为120秒则每个连续线程将延迟4秒3.2.加速需要足够长的时间来避免在测试开始时工作量过大3.2.1.并且还必须足够短以使最后一个线程在第一个线程完成之前开始运行(除非有人希望这种情况发生)3.2.2.从“上升线程数”开始然后根据需要向上或向下调整4.设置执行测试的次数默认情况下线程组配置为在其元素之间循环一次5.线程组还提供调度程序5.1.单击线程组面板底部的复选框以启用/禁用其他字段5.1.1.可以在其中输入测试的持续时间启动延迟运行的开始和结束时间5.2.可以配置持续时间(秒)和启动延迟(秒)来控制每个线程组的持续时间以及启动后的秒数5.3.当测试开始时JMeter将在启动线程组的线程之前等待启动延迟(秒)然后运行配置的持续时间(秒)5.3.1.请注意这两个选项会覆盖“ 开始时间”和“ 结束时间”5.4.另外也可以使用其他两个字段Starttime和Endtime(尽管不建议这样做)5.4.1.测试开始时如有必要JMeter将等待直到达到启动时间5.4.2.在每个周期的末尾JMeter会检查是否已达到结束时间如果已结束则运行将停止5.4.3.否则将允许测试继续进行直到达到迭代限制五.Jmeter线程组的添加【测试计划】-【THreadsUsers线程组】1.添加线程组选中要添加线程组的测试计划(TestPlan)右键点击Add选中Threads(Users)1.1.目前可以看到三个线程组1.1.1.虽然有三个添加线程组的选项名字不一样 创建之后其界面是完全一样的1.1.2.之前的版本只有一个线程组的名字1.1.3.现在多一个setUp thereadGroup与terDownThreadGroup2.setup thread group特殊类型的ThreadGroup的可用于执行预测试操作2.1.这些线程的行为完全像一个正常的线程组元件2.1.1.不同的是这些类型的线程执行测试前进行定期线程组的执行2.2.setUpThreadGroup类似于lr的init.可用于执行预测试操作3.teardown thread group.特殊类型的ThreadGroup的可用于执行测试后动作3.1.这些线程的行为完全像一个正常的线程组元件3.1.1.不同的是这些类型的线程执行测试结束后执行定期的线程组3.2.tearDownThreadGroup类似于lr的end.可用于执行测试后动作4.threadgroup(线程组)是通常添加运行的线程4.1.一个线程组可以看做一个虚拟用户组线程组中的每个线程都可以理解为一个虚拟用户4.1.1.线程组中包含的线程数量在测试执行过程中是不会发生改变的六.Jmeter线程组界面1.一个线程组可以看做一个虚拟用户组线程组中的每个线程都可以理解为一个虚拟用户2.名称就如字面意思起个有意义的名字就行3.注释可以为空4.线程数这里选择55.Ramp-UpPeriod单位是秒默认时间是1秒5.1.它指定启动所有线程所花费的时间5.1.1.比如当前的设定表示“在5秒内启动5个线程每个线程的间隔时间为1秒”5.1.2.如果需要Jmeter立即启动所有线程将此设定为0即可6.循环次数表示每个线程执行多少次请求七.Jmeter拓展1.SteppingThreadGroup可用于模拟阶梯加压八.Jmeter控制器(Controllers)1.JMeter有两种控制器采样器和逻辑控制器用这些元件来驱动测试的进行2.采样器告诉JMeter将请求发送到服务器2.1.例如如果希望JMeter发送HTTP请求则添加个HTTPRequestSampler2.1.1.还可以通过将一个或多个配置元素添加到采样器来自定义请求3.逻辑控制器可以自定义JMeter用于决定何时发送请求的逻辑3.1.例如可以添加个InterleaveLogicController在两个HTTPRequestSamplers之间交替九.Jmeter采样器(Samplers)1.采样器用来模拟用户的操作向服务器(被测系统)发出Http请求、WebService请求或者Java请求等2.可以把Http请求元件看成是个没有界面的浏览器它可以发送Http请求接收服务器的响应数据3.采样器(Sampler)是测试中向服务器发送请求记录响应信息记录响应时间的最小单元3.1.JMeter原生支持多种不同的sampler3.1.1.如HTTPRequestSampler、FTPRequestSampler、TCPRequestSampler、JDBCRequestSampler等3.1.2.高版本的jmeter支持更丰富的Sampler4.采样器的添加路径【测试计划】-【线程组】-【采样器】5.采样器告诉JMeter将请求发送到服务器并等待响应5.1.它们按照它们在树中出现的顺序进行处理控制器可用于修改采样器的重复次数6.每个采样器都有几个可以设置的属性6.1.可以通过向测试计划中添加一个或多个配置元素来进一步自定义采样器7.如果要将相同类型的多个请求(例如HTTP请求)发送到同一服务器请考虑使用默认配置元素7.1.每个控制器都有一个或多个Defaults元素(请参见下文)8.切记在测试计划中添加个侦听器以查看和/或将请求结果存储到磁盘十.Jmeter逻辑控制器(Logic Controllers)1.逻辑控制器可以自定义JMeter用于决定何时发送请求的逻辑可以更改来自其子元素的请求的顺序1.1.可以自己修改请求使JMeter重复请求等等2.逻辑控制器器的添加路径【测试计划】-【线程组】-【逻辑控制器】3.此测试的第一件事是登录请求将仅在第一次执行。随后的迭代将跳过它3.1.这是由于“OnceOnlyController(仅一次控制器)”的作用3.2.登录后下一个Sampler将加载搜索页面3.2.1.(测试场景用户登录到Web应用程序然后转到搜索页面进行搜索)3.2.2.这只是简单的请求不会通过任何逻辑控制器进行过滤4.加载搜索页面后要进行搜索。实际上要进行两种不同的搜索4.1.但是希望在每次搜索之间重新加载搜索页面本身4.1.1.可以通过具有4个简单的HTTP请求元素4.1.1.1.(加载搜索搜索A加载搜索搜索B)来实现4.1.2.相反使用InterleaveController(交替控制器)该控制器每次通过测试都会传递个子请求4.1.3.它保持子元素的顺序(它不会随机传递而是记住其位置)4.1.4.交叉处理2个子请求可能会过多但很容易会有8个或20个子请求5.注意HTTP请求默认值属于InterleaveController(交替控制器)5.1.搜索A和搜索B共享相同的PATH信息5.1.1.(HTTP请求规范包括域端口方法协议路径和参数以及其他可选项)5.1.1.这都是搜索请求都命中相同的后端搜索引擎规则5.1.2.与其在PATH字段中为两个HTTPSamplers配置相同的信息5.1.2.1.不如将这些信息抽象到单个ConfigurationElement中5.1.3.当InterleaveController(交替控制器)传递来自搜索A或搜索B的请求时5.1.3.1.它将使用HTTPdefaultrequest(HTTP请求默认值)配置元件中的值填充空白5.1.4.因此对于这些请求将PATH字段留空并将该信息放入配置元素5.1.4.1.在这种情况下充其量是次要的好处但可以证明其功能6.树中的下个元素是另个HTTPdefaultrequest(HTTP请求默认值)这次已添加到线程组本身6.1.线程组具有内置的逻辑控制器因此它完全如上所述使用此配置元件6.1.1.它填补所有通过的请求的空白6.2.因此在Web测试中将所有HTTPSampler元件中的DOMAIN字段保留为空白6.2.1.然后将该信息放入HTTP默认请求元素(添加到线程组中)非常有用6.3.这样只需更改测试计划中的字段即可在另一台服务器上测试应用程序6.3.1.否则将必须编辑每个采样器Sampler7.最后个元件是HTTPCookieManager(HTTPCookie管理器)7.1.HTTPCookieManager(HTTPCookie管理器)应添加到所有Web测试中否则JMeter将忽略cookie7.2.通过在线程组级别添加它确保所有HTTP请求将共享相同的cookie8.逻辑控制器可以组合使用以获得各种结果十一.Jmeter测试片段(Test Fragments)1.测试片段元素是种特殊类型的控制器它与线程组元素位于同一级别的测试计划树上1.1.它与线程组的区别在于除非被模块控制器或Include_Controller引用否则它不会执行2.此元件仅用于测试计划中的代码重复用它是辅助的组件2.1.在此节点下几乎可以放置任何JMeter测试元件但它不会被运行那么作用到底是什么了2.2.在脚本开发的过程中可以用来备份元件2.3.可以被模块控制台调用可以用它模块化请求供模块化控制器调用2.3.1.(是不是有点似曾相识的感觉就是程序开发中的将业务封装成个方法供复用)十二.Jmeter监听器(Listeners)1.监听器提供对JMeter运行时收集的有关测试用例的信息的访问图形结果曲线在曲线图上的响应时间1.1.查看结果树侦听器显示采样器请求和响应的详细信息并可以显示响应的基本HTML和XML表示形式1.1.1.其他侦听器提供摘要或聚合信息2.监听器将数据定向到文件以供以后使用JMeter中的每个监听器都提供个字段来指示要将数据存储到的文件2.1.还有配置按钮可用于选择要保存的字段以及使用CSV还是XML格式3.注意所有监听器都保存相同的数据唯一的区别在于数据在屏幕上的显示方式4.可以在测试中的任何位置(包括直接在测试计划下)添加监听器将从其级别或以下级别的元素收集数据5.JMeter附带多个监听器JMeter的测试结果需要添加监听器来收集6.监听器的添加路径【测试计划】-【监听器】7.Jmeter监听器的任务7.1.添加监听器可以保存测试结果到文件中这些测试结果可以供再次分析使用7.2.JMeter可以以表格以及图形的形式展示测试结果方便测试人员分析测试结果7.2.1.在开发测试脚本的时候不可避免需要调试监听器也提供辅助7.2.1.1.(例如查看结果树在其中可以看到请求与响应的数据)十三.Jmeter定时器(Timer)1.默认情况下JMeter线程按顺序执行采样器而不会暂停1.1.可通过用计时器添加到线程组来指定延迟1.2.如果不添加延迟JMeter可能会在很短的时间内发出太多请求1.2.1.从而使服务器不堪重负这就是通常说的负载2.为了真实模拟用户负载有时候需要模拟这些请求在同一时刻发送2.1.就好像把大家集合在同一起跑线上然后扣动发令枪的扳机同时向终点冲去3.定时器将导致JMeter在其范围内的每个采样器之前延迟一定的时间4.如果选择在一个线程组中添加多个定时器JMeter将使用定时器的总和4.1.并在执行该定时器所适用的采样器之前暂停该时间4.2.可以将定时器作为采样器或控制器的子级添加以限制将它们应用到的采样器5.定时器的添加路径【测试计划】-【线程组】-【定时器】十四.Jmeter断言1.断言用来验证结果是否正确是用预设的结果与实际结果匹配匹配到成功反之失败1.1.(期望值、表达式、时间长短等条件)2.断言使您可以断言有关从被测试服务器收到的响应的事实2.1.使用断言基本上可以“测试”应用程序正在返回期望的结果2.1.1.例如可以断言对查询的响应将包含哪些特定的文本2.1.2.指定的文本可以是Perl样式的正则表达式并且可以指示响应包含文本2.1.3.或者应与整个响应匹配3.可以将断言添加到任何采样器3.1.例如可以将断言添加到HTTP请求中以检查文本/HTML3.1.1.JMeter将检查该文本是否出现在HTTP响应中3.1.2.如果JMeter找不到文本则它将标记为失败的请求4.注意断言适用于其范围内的所有采样器4.1.要将声明限制为单个采样器请将该声明添加为采样器的子级5.要查看断言结果请将断言侦听器添加到线程组5.1.失败的断言还将显示在树视图和表侦听器中并将计入错误百分比5.1.1.例如在“汇总”和“摘要”报告中十五.Jmeter配置元件1.性能测试中为了模拟大量的用户操作系统往往需要做参数化1.1.JMeter的参数化可以通过配置元件来完成2.例如CSVDataSetConfig它可以帮助从文件中读取测试数据2.1.JMeter也提供众多函数来帮助动态的生成数据3.当然配置元件的作用不仅于此它还可以记录服务器的返回数据3.1.【HTTP缓存管理器】自动记录服务器返回的Cache信息3.1.就是它为取样器提供预备数据然后由取样器发出请求3.1.1.配置元素与采样器紧密配合3.1.2.尽管它不发送请求(HTTPS测试脚本记录器除外)但是它可以添加或修改请求4.配置元素只能从放置该元素的树枝内部访问4.1.如果将【HTTPCookie管理器】放置在【简单逻辑控制器】中4.1.1.则放在【简单逻辑控制器】中的HTTP请求控制器将只能访问此“CookieManager”4.1.2.【HTTPCookie管理器】可用于HTTP请求“网页1”和“网页2”但不能访问“网页3”5.而且树枝内部的配置元素比父分支中的相同元素具有更高的优先级5.1.定义两个【HTTP请求默认值】元素Web默认值1和Web默认值25.1.1.由于在【循环控制器】内放置WebDefaults1因此只有WebPage2可以访问它5.1.2.其他HTTP请求使用Web默认值2因为将其放置在线程组(所有其他分支的父级)中6.在【用户定义的变量】配置元素是不同的6.1.无论在何处放置都将在测试开始时对其进行处理6.1.1.为简单起见建议将元素仅放置在线程组的开始处7.配置元件的添加路径【测试计划】-【配置元件】十六.Jmeter前置处理器1.预处理器在发出“采样器请求”之前执行一些操作2.如果将预处理器附加到【采样器-Http请求】元素则它将在该【Http请求】元素运行之前执行3.预处理器最常用于在【采样器请求】运行前修改其设置或更新从响应文本中提取的变量4.场景在请求发送之前可能会做些环境或者参数的准备工作4.1.那么可以在前置处理器中来完成这些工作5.例如对数据库进行操作前需要建立数据库连接那么前置处理器就可以完成功能6.前置处理器的添加路径【测试计划】-【前置处理器】十七.Jmeter后置处理器1.后置处理器放在“采样器请求”之后用来处理服务器的返回结果1.1.例如Web应用程序登录后会返回SessionID1.1.1.这个SessionID在登录之后的业务操作过程中会作为验证条件1.1.2.验证用户是否合法登录后才进行的业务操作2.发出”采样器请求“后后置处理器将执行某些操作2.1.如果将后置处理器附加到【Http请求】元素则它将在该【Http请求】元素运行后立即执行3.后置处理器最常用于“处理响应数据”经常从中“提取值”十八.Jmeter执行顺序1.配置元件2.前置理器3.定时器4.取样器5.后置理器(除非SampleResult为null)6.断言(除非SampleResult为null)7.监听器(除非SampleResult为null)8.注意定时器断言前置理器和后置理器只有在有适用的采样器时才被处理9.“逻辑控制器”和“采样器”按照它们在树中出现的顺序进行处理10.其他测试元素将根据其发现范围和测试元素的类型进行处理10.1.【在一种类型中元素按照它们在树中出现的顺序进行处理】10.2.Jmeter执行顺序预处理器1计时器1计时器2采样器1后处理器1后处理器2断言1预处理器1计时器1计时器2采样器2后处理器1后处理器2断言1十九.Jmeter范围鉴定规则1.JMeter测试树包含分层和有序的元素1.1.测试树中的某些元素严格地是分层的1.1.1.(监听器配置元件后置理器前置处理器断言定时器)1.2.而有些元素则主要是有序的(逻辑控制器取样器)1.3.创建测试计划时将创建采样器请求的有序列表(通过Samplers)1.3.1.该列表表示要执行的一组步骤2.请求的顺序将为一二三四3.其他元素是分层的3.1.例如断言在测试树中是分层的3.1.1.如果其父项是一个请求则将其应用于该请求3.1.2.如果其父级是Controller则它将影响该Controller的所有后代请求4.断言1仅适用于请求1而断言2仅适用于请求2和35.实例这次树中使用【固定时间】5.1.实例中对请求进行命名以反映其执行顺序5.1.1.定时器1将应用于请求2、3和4(请注意顺序与分层元素无关)5.1.2.断言1仅适用于请求三计时器2将影响所有请求6.这些示例可以清楚说明如何应用配置(分层)元素6.1.如果想象每个请求都在树枝上传递给它的父级然后传递给它的父级的父级等等6.1.1.并且每次收集该父级的所有配置元素那么您将了解它是如何工作的7.配置元素【信息头管理器】【Cookie管理器】和【授权管理器】与配置默认元素的处理方式有所不同7.1.配置“默认值”元素中的设置会被合并为【采样器】可以访问的一组值7.1.1.但是“管理器”中的设置不会合并7.2.如果在一个【取样器】的范围内有多个重复的Manager则仅使用一个Manager7.2.1.但是目前无法指定使用哪个Manager二十.Jmeter属性和变量1.JMeter属性在jmeter.properties文件中定义2.JMeter属性对Jmeter是全局的并且用于定义JMeter使用的某些默认值2.1.例如属性remote_hosts定义JMeter将尝试远程运行的服务器2.1.1.可以在【测试计划】中引用属性-请参阅功能-读取属性-但不能用于特定于线程的值3.JMeter变量是每个线程局部的每个线程的值可以相同也可以不同4.如果某个变量由线程更新则仅更改该变量的线程副本4.1.例如【正则表达式】提取器将根据其线程读取的样本设置其变量4.1.1.这些变量稍后可在同一线程中使用5.注意在启动时将使“测试计划”中的【用户定义的变量】配置元素定义的值可用于整个测试计划6.如果同一变量由多个UDV元素定义定义多个值则最后一个变量生效7.线程组启动后会将初始变量集复制到每个线程7.1.其他元素(用户参数预处理器或正则表达式提取器后处理器)可用于重新定义相同的变量(或创建新变量)7.1.1.这些重新定义仅适用于当前线程8.所述的setProperty函数可以用来定义JMeter的属性8.1.这些对于【测试计划】是全局的因此可以用于在线程之间传递信息8.1.1.如果需要的话变量和属性都区分大小写二十二.Jmeter使用变量对测试参数化1.变量不必更改可以定义一次并且如果单独保留则不会更改值1.1.因此可以将它们用作【测试计划】中经常出现的表达式的简写形式1.1.1.或对于在运行期间保持恒定但在运行之间可能有所不同的项目2.例如主机名或线程组中的线程数3.在如何构建【测试计划】时请记下哪些项目对于运行是恒定的但在运行之间可能会改变3.1.为此确定一些变量名称也许使用命名约定3.1.1.例如以C_或K_前缀或仅使用大写字母将它们与测试期间需要更改的变量区分开4.还应考虑哪些项目需要在线程本地进行4.1.例如使用【正则表达式】后处理程序提取的计数器或值4.1.1.可能希望对它们使用不同的命名约定5.实例主机www.example.com 底线10圈数206.可以在【测试计划】中将它们称为${HOST}${THREADS}等6.1.如果以后要更改主机只需更改HOST变量的值即可6.1.1.这对于少量的测试工作正常但是在测试许多不同的组合时变得乏味6.1.2.一种解决方案是使用属性来定义变量的值主机${__Phostwww.example.com}螺纹${__Pthreads10}循环${__Ploops20}7.然后可以在命令行上更改某些或所有值jmeter…-Jhostwww3.example.org-Jloops13