JMeter使用手册
在使用JMeter之前,需要理解JMeter工具所使用的术语:
名词 |
解释 |
Test Plan |
测试计划,实际上是一个或一组测试用例,在一个测试计划中可以有多个用例 |
WokrBench |
工作台,可以在工作台中配置HTTP代理服务器,将录制的脚本存入工作台中,进行初步编辑,然后将脚本复制/战体到测试计划中,主要用来保存暂时不使用的测试元素,保存测试计划时,这部分内容不会一起被保存 |
Thread Group |
线程组,可以理解为一个测试用例。虚拟用户,在LR中叫VUser,实际上在这些压力测试工具实现虚拟用户的时候使用的技术就是线程,用一个线程来模拟一个虚拟用户,在JMeter中线程组用于配置虚拟用户的数目、迭代次数等 |
Config Element |
配置元件配合取样器工作,虽然它不发送请求(除了HTTP代理服务器),但是它可以添加或修改请求 |
Timer |
定时器,同LR的思考时间,通过添加定时器指定一个延迟 |
Pre Processors |
前置处理器在取样器请求建立前执行一些行为 |
Post Processors |
后置处理器在取样器请求后执行一些行为 |
Assertions |
断言,允许你断言关于从测试服务器收到时收到的响应结果 |
Listener |
监听器,用来收集当JMeter运行时的关于测试计划的信息 |
Logic Controller |
逻辑控制器,用来模拟程序语言的逻辑结构,如顺序、分支、循环等 |
Sampler |
取样器告诉JMeter发送请求到服务器,发送HTTP请求时添加一个HTTP请求取样器,可以通过添加一个或多个配置元件到一个取样器来定制一个请求 |
工作原理
jmeter作为web服务器与浏览器之间的代理网关,它通过代理方式截取客户端和服务器之间交互的数据流,这样服务器和客户端都以为是在一个真实运行环境中。jmeter通过线程组来模拟真实用户对服务器的访问压力,而线程组提供了各种属性来设置对线程组的调度作用以产生不同的压力。jmeter也提供了各种监控脚本以对服务器、响应结果等各项指标进行收集统计及展现。
测试计划描述了测试过程中jmeter的执行过程和步骤。一个完整的测试计划包括一个或多个线程组、逻辑控制器、取样器、监听器、定时器、断言、配置元件等元素。
jmeter执行顺序规则:
1.配置元件
2.前置处理器
3.定时器
4.采样器
5.后置处理器(除非服务器响应为空)
6.断言(除非服务器响应为空)
7.监听器(除非服务器响应为空)
注意:只有当作用域内存在采样器时,定时器、断言、前置处理器、后置处理器才会被执行。逻辑控制器和采样器按照在测试树中出现的顺序依次执行,其它测试元件会依据自身的作用域来执行。同一类型的测试元件,会按照它们在测试树中出现的顺序依次执行。
建议:最好能按实际的情况进行测试元件顺序的编排,不要通过默认的顺序含义来执行,容易导致程序可读性差。
jmeter测试树包含的测试元件有两种规则,包括分层规则和顺序规则:
分层规则:监听器,配置元件,前置处理器,后置处理器,断言,定时器。
顺序规则:控制器,取样器
当创建测试计划时,你将创建一个描述被执行步骤集的请求有序列表,而我们又会经常将请求组合在有序的控制器中。
配置元件与默认配置元件(元件名中包含default,如http请求默认值)的处理方式不同,默认配置元件包含的设置会被合并起来,而配置元件的设置值则不会被合并。对于一个取样器而言,如果在相同的作用域范围内有多个配置元件,那么只有一个配置元件会被应用,切目前无法执行时哪个配置元件被使用。
Synchronizing Timer
Synchronizing定时器的目标时阻塞线程,直到指定数量的线程数到达此定时器,然后再一起释放掉,从而模拟瞬间大量负载不断地同事发起请求的场景,与LR中的集合点类似。
固定定时器
如果你需要让每个线程在请求之前按相同的指定时间停顿,那么可以使用这个定时器,这个功能与LR的思考时间类似。
高斯随机定时器
如果你需要让每个线程在请求之前按随机的时间停顿,那么可以使用这个定时器。
前置处理器,用来修改它所作用范围内的取样器发送出去的报文。
断言,用来对取样器执行额外的检查,为了确保断言作用在特定的取样器中,需要将断言添加到取样器的子节点。除非有文档标识,否则断言是不会作用到子节点的取样器,仅会作用在父节点的取样器。
用户定义的变量(UDV)
用户定义变量元件,可以用来初始化多个变量,与测试计划中定义的变量相同。需要注意,在测试计划中所有的UDV元素,无论这个元件放在什么位置,都将会在测试开始执行时被初始化。UDV的变量不应该与每次调用会产生不同结果的函数一起使用,只有第一次调用结果会被保存到变量中,然而,UDV可以与如_P()这样的函数一起使用,例如:HOST${_P(host,localhost)},这个函数的意思为:定义变量名为"HOST",其值为jemter的属性"host",未定义值的情况下,默认取值为"localhost"。
UDV在测试计划中被处理的顺序是按元件的位置从上到下处理的。一般建议UDV放在线程组子节点的第一个位置。一旦测试计划和所有的UDV处理完毕,变量的值会被复制到每个线程中,提供初始化后的值给线程使用。如果在线程运行中,有前置处理器-用户参数或后置处理器-正则表达式定义了与UDV相同的变量名,这时初始值会被替换掉,且之后的处理均会使用更新后的值。
当你有多个线程组时,需要确保你访问不同的变量值要用不同的变量名,因为UDV定义的变量是在各线程组中共享的。