文 | Judy警官
jmeter是基于java语言的压力测试工具,除了通过命令来执行压测脚本,还提供图形界面功能。用户在图形界面中可以设置“测试计划”、“线程组”、“取样器”、“逻辑控制器”、“定时器”、“配置项”、“断言”、“变量”、“观察结果树”、“结果报表”、“结果图”。一开始接触这个工具时就感觉好多名词,记一遍忘一遍,忘一遍再记一遍。为了理清思路,我们可以从测试用例四大要素:条件、输入、执行、预期结果,来理解这些组件。先准备好条件和输入,然后执行测试,当实际结果与预期结果一致时,测试用例通过。正所谓万变不离其宗。
条件 1.配置项(config element) 添加方式:右键test plan-选择add-选择config element。 这里常用的有http header manager(用于设置http的头信息)、http cookie manager(用于设置http的cookie信息)、http request default(设置一些http通用属性,可被取样器个性化设置覆盖)、jdbc connection configuration(数据库链接设置)
2.前置处理器(pre processors) 添加方式:右键test plan-选择add-选择pre processors。 这里常用的有user parameters(可以为不同的线程提供不同的参数)、jsr223 preprocessors(在采样器运行前通过js脚本设置一些参数,比如加密)、beanshell preprocessors(在采样器运行前通过beans hell脚本设置一些参数,比如加密)、jdbc preprocessors(在采样器运行前设置一些数据库操作)
输入 1.配置项(config element) 添加方式:右键test plan-选择add-选择config element。 这里常用的有csv data set config(预设压测需要的一些参数,比如post请求中的参数)、user defined variables(定义用户变量,全局有效)、counter(计数器,为请求提供参数值)
2.前置处理器(pre processors) 添加方式:右键test plan-选择add-选择pre processors。 这里常用的有user parameters(可以为不同的线程提供不同的参数)
执行 1.线程组(thread group) 添加方式:右键test plane-选择add-选择thread group 线程组也叫用户组,是性能测试的用户资源池,可以用来设置时间和并发数,是测试计划的起点。它有几个关键属性,number of threads:待启动的线程数;ramp-up period (in seconds):在n秒内启动number of threads个线程;loop count:循环的次数;scheduler:是一个复选框,一般在loop count为forever时勾选该复选框,且设置duration,如果loop count不是forever时,一般不选此复选框。比如我设置number of threads=10,ramp-up period (in seconds)=1,loop count=10,1秒内启动10个线程,循环10次,共请求100次;number of threads=10,ramp-up period (in seconds)=1,loop count=forever,scheduler的duration=10,在1秒内启动10个线程,持续10s,启动线程不一定是几个。
2.采样器(sampler) 添加方式:右键test group-选择add-选择sampler(种类很多,下面介绍常用的) 常用的sampler有:http request、jdbc request、beanshell sampler、udp request(需要安装插件)、tcp request(需要安装插件)、dummy sampler(需要安装插件)。采样器顾名思义就是要采一个样本,以http request为例说明sampler,一个http请求包含请求地址、请求协议、请求方法、请求路径、输入参数、header信息、body信息。所以在建立一个http request的采样器的时候,我们其实就是在构建这些信息,以模拟一个http请求。其他几种也是同样的,jdbc请求要构建sql语句;udp sampler请求要构建ip、端口、请求参数;tcp sampler请求要构建ip、端口、请求参数;dummy sampler可以用作mock服务,模拟响应。
3.逻辑控制器(controller) 添加方式:右键test group-选择add-选择logic controller(种类很多,下面介绍常用的) 常用的controller有:if controller、loop controller、once only controller、random controller、inclued controller、throughput controller、runtime controller、transaction controller、foreach controller、switch controller。 在我们学习编程的时候,最基本的逻辑控制就是:顺序、if-else for,这三种基本逻辑就能组成很复杂的逻辑世界。这里的逻辑控制器也是一样的,if controller,当满足某种条件的时候才能执行其下面的子节点;loop controller,指定子节点的执行次数;once only controller,无论有多少循环,都只执行一次这个控制器下子节点;random controller 随机执行其下的子节点;inclued controller 用于导入外部测试片段(test fragement);throughput controller控制其下的子节点执行次数或负载比例分配;runtime controller控制其下的子节点执行时间;transaction controller 用于将 test plan 中的特定部分组织成一个 transaction,jmeter 中 transaction 的 作用在于,可以针对 transaction 统计其响应时间、吞吐量等。 比如说,一个用户操作可能 需要多个 sampler 来模拟,此时使用 transaction controller,可以更准确地得到该用户 操作的性能指标,如响应时间等。这个时间包含该控制器范围内的所有处理时间,而不仅仅是采样器的;foreach controller 依次调用用户定义的变量,直到最后一个,结束循环;switch controller和编程语言中的 switch 语句类似,执行 switch value 中指定的请求。
4.后置处理器(post processors) 添加方式:右键sampler-选择add-选择post processors 常用的后置处理器有regular expression extractor(正则表达式抽取器)、xpath extrator、以及beanshell processors、jdbc processors等等。以xxxx processors命名的后置处理器和前置处理器的概念类似,只是后置处理器是在sampler之后运行的,不同的后置处理器需要设置各自的属性。最常用的是regular expression extractor,我们可以用正则表达式匹配响应结果,抽取出我们想要的值,作为参数保存起来,以便其他请求使用;xpath extrator和regular expression extractor类似,只不过是抽取内容的语法不同,使用xpath语法。
5.定时器(timer) 添加方式:右键sampler(或者线程组)-选择add-选择timer 常用的timer有:constant timer、uniform random timer、gaussian random timer、constant throughput timer、precise throughput timer。 定时器可以让我们根据现实情况设置等待时间,还可以设置集合点使得多线程并发操作。定时器有作用域,定时器在sampler之前执行,当前作用域内的所有定时器累加的时间为最终时间。如果只想让一个sampler等待,可以把timer加到该sampler 下。constant timer:等待时间可以设置固定值;uniform random timer等待时间设置在一个范围内随机;gaussian random timer按照高斯分布的规律随机等待时间;constant throughput timer固定吞吐量定时器可以设定n次/min的吞吐量,比如一分钟运行60次;precise throughput timer精准吞吐量定时器,可以设定持续时间、吞吐量单位时长、吞吐量(n次/吞吐量单位时长),比如运行10分钟,每1s启动10个线程。可以设置集合点,集齐n个线程后,一起执行。
预期 1.断言(assertion) 添加方式:右键sampler-选择add-选择assertion 常用的有:response assertion、json assertion、xpath assertion、beanshell assertion。 断言就是为了检查响应的数据是否符合预期,用以保证性能测试过程中的数据交互与预期一致。response assertion响应断言,通过将预期的响应文本(text response)、响应码(response code)和真实返回的响应文本、响应码进行判断,一致则用例通过。比较的方式有很多,可以是equals、正则匹配、子串检测;json assertion:响应的数据是json格式时,可通过json表达式提取真实的响应数据,从而可以通过和预期对比进行判断是否用例通过,对比方式也包括正则或equals;xpath assertion:响应数据是xml格式的时候使用此种断言,类似json;beanshell assertion:可以通过写bean shell脚本断言,更为灵活。
2.listener(监听器) 观察结果树(view results tree) 添加方式:右键thread group-选择add -选择listener-选择view results tree 观察结果树可以很方便的查看请求数据和响应数据,包括http请求的header和body、请求方法、路径、cookie,以及响应的header和body。当出现问题时,用来分析问题,使用率很高。当运行失败后会显示红色,并显示原因;成功则显示绿色。
结果表格(view results in table、aggregate report) 添加方式:右键thread group-选择add -选择listener-选择view results in table 该表格中包含了每个样本的请求开始时间、响应时间、状态、请求和响应字节数,是描述样本的表格。
添加方式:右键thread group-选择add -选择listener-选择aggregate report 该表格包含了sampler、平均响应时间、tp50(tp单位是时间,意思是50%的样本不超过这个时间) 、tp90、tp99,最大时间、最小时间、错误百分比、吞吐量等数值,大部分是反应性能的指标。
结果图形(多种) 自带的graph results不是很方便看,安装插件可以更方便观察,安装Additional Graphs、Basic Graphs插件,可以查看active threads over time、bytes throughput over time、transactions per second、response times over time。 添加方式:右键thread group-选择add -选择listener-选择对应的项目。active threads over time 可以观察启动线程的情况、bytes throughput over time可以观察字节吞吐量、transactions per second可以观察每秒处理的事务数、response times over time可以观察响应时间。
以上就是从测试用例四要素:条件、输入、执行、预期结果来认识jmeter的组件。只是简单的描述了各自的功能,没有给出实例,从感性上先认识一下jmeter。