赖珊 发表于 昨天 12:35

每周读书与学习->初识JMeter 元件(一)

每周读书与学习是由清华大学出版社出版的《JMeter核心技术、性能测试与性能分析》一书的作者推出,分享作者多年的IT从业经历,希望对很多计算机科学技术IT类专业毕业生以及IT从业者有所帮助。
Jmeter元件是使用Jmeter来完成性能测试的基础,是整个Jmeter的核心,Jmeter是由很多个不同种类的元件来共同组成的,每个元件具有不同的功能,编写Jmeter的性能测试脚本就是将多个功能不同的元件串联起来完成一个性能测试场景的过程,如下图所示,下图中展示的就是Jmeter中常用到一些元件的种类,每个不同种类的元件可以在性能测试中起到不同的作用,通常需要不同的元件来共同协作,才能完成一个性能测试场景。

1、测试计划
Jmeter 测试计划是Jmeter中最底层的逻辑运行容器,是用来描述和组织一个性能测试脚本和测试场景的前提,所有的Jmeter元件都必须运行在一个测试计划下面,如下图所示。

从图中可以看到,测试计划主要包括:

[*]测试计划的名称和注释:整个测试计划命名的名称,和对该测试计划的详细注释,通常可以自定义填写,当然建议最好能表达脚本的意义,方便将来对历史脚本进行追溯时,能知道当初编写的性能测试计划和脚本的含义。
[*]用户定义的变量:Jmeter允许用户在测试计划中添加自定义的变量,这里定义的变量是整个测试计划中使用到的全局变量。
[*]独立运行每个线程组:由于在测试计划中,可以添加多个线程组,该选项主要用于控制多个线程组的执行顺序。当勾选该选项时表示每个线程组都是独立运行,通常可以做到按照顺序来执行每一个线程组,比如先运行线程组A,等待线程组A运行完后再运行线程组B,如果不勾选该选项时表示每个线程组可以同时并行运行,如下图所示。

这个选项通常适用于混合场景的性能测试的需要,如下图所示,以在淘宝商城购买商品为例。

[*]用户需要先登录然后再查询商品,而登录只需要做一次,所以多个并发用户登录,可以设置成一个线程组A,用于并发完成用户的登录。
[*]用户登录后,用户就可以查询商品或者提交订单了,所以查询商品和提交订单是可以分别设置为一个线程组,而且这两个线程组是可以并行运行的。
[*]由于登录时,每个用户只需要执行一次,并且通常都是先登录,然后再去查询商品或者提交订单,所以登录和查询商品或者提交订单之间通常建议设置成串行执行。


[*]主线程结束后运行tearDown线程组:表示是否当线程组停止运行时继续运行tearDown线程组,一般很少用到该选项。
[*]函数测试模式:表示是否保存性能测试的响应结果数据或者性能样本数据,如果勾选后,通常会消耗比较大的本地磁盘IO资源,一般不建议勾选,除非是在做性能测试脚本调试时需要特殊定位问题才建议勾选,并且在问题定位完成后,就去掉该选项的勾选。
[*]添加目录或jar包到ClassPath:用于向Jmeter中添加第三方的jar包,在前面已经提到Jmeter底层是基于Java 语言来开发的,这个功能就是用于向Jmeter中添加第三方的外部Jar包,比如我们需要通过JDBC的协议对SQL Server 数据库进行性能压测,但是由于Jmeter自身没有自带连接SQL Server数据库的驱动Jar包,所以就需要用到这个功能来添加一个SQL Server的驱动Jar包以完成通过JDBC协议来对SQL Server数据库做性能压测。
2、线程组
通常情况下,每个性能测试场景都需要先在Jmeter界面上创建一个线程组,然后才能运行后续的性能测试脚本,因为性能压测通常都是需要模拟大量的用户来进行并发操作,那么就需要线程组来通过多个线程的方式来模拟产生大量的用户。线程组主要控制整个性能测试的运行开始时间以及运行时长、线程数量(即并发用户数)等,如下图所示。

从图中可以看到线程组主要包括:

[*]名称和注释:线程组的命名,尤其是当一个测试计划中包含多个线程组时,通常建议需要填写线程组的名称和注释,方便区分以及将来对历史脚本进行追溯时,能知道当初创建线程组的明确含义。
[*]在取样器错误后要执行的动作:

[*]继续:表示当取样器发生报错时,线程组继续往下执行,这也是默认选项。
[*]启动下一进程循环:表示忽略当前的取样器报错,继续开始下一个性能压测循环。
[*]停止线程:表示退出当前取样器报错所在的线程,让该线程不再运行,由于一个线程组中通常会包含多个线程,此处的停止线程仅仅是停止当前取样器报错所在的线程,并不是停止所有的线程,如下图所示。
[*]停止测试:等待当前取样器报错所在的线程运行结束当次测试后,停止整个性能测试。
立即停止测试:不做任何等待,直接停止整个性能测试。



[*]线程属性:线程属性用于设置线程组中线程的运行参数,线程属性主要包括:

[*]线程数:用于设置该线程组需要启动的线程数(并发用户数)。
[*]Ramp-Up时间(秒):表示设置的线程数需要在多久内创建完成,此处的时长单位为秒。
[*]循环次数:表示循环进行性能压测的次数,当勾选永远选项时,表示性能压测一直运行,直到手工停止。
[*]Same user on each iteration:如下图所示,表示线程每次循环迭代运行时,每个线程都使用同一个用户,Jmeter做性能压测时,通常每次循环迭代运行时都需要通过参数化的形式去获取一个用户,当勾选了该选项时,线程每次循环迭代运行时不再重新去从参数化用户中获取一个新用户,当用户参数化数据中的用户多于线程组的线程数时,会导致超出线程数的剩余用户将永远不会被用到。
[*]延迟创建线程直到需要:表示是否要延迟创建线程,如果不勾选该选项,会在线程组初始化时,就会直接创建好预先已经设置的线程数量。
[*]调度器:用于设置性能压测持续的时长以及运行启动的延迟时长,设置时长时的单位为秒。


3、配置元件
在Jmeter中配置元件主要用于完成性能测试中需要的一些配置信息的配置以用来初始化变量或者参数的默认值、比如读取指定的CSV文件数据、设置公共请求参数、赋予变量值等,以便在后续性能测试脚本中能被取样器直接使用等,如下图所示。

从图中可以看到配置元件通常包括:

[*]CSV Data Set Config:表示从指定路径的CSV 数据中读取和设置配置信息。
[*]HTTP信息头管理器:表示设置HTTP请求的信息头管理器,这里的HTTP请求通常指的就是HTTP请求的取样器,每一个HTTP 请求都有请求头信息,而且通常会有默认的请求头信息,如果不使用默认的信息头信息,可以通过HTTP信息头管理器来进行修改。
[*]HTTP Cookie管理器:表示自定义设置HTTP请求的Cookie,Cookie通常是由服务器返回到浏览器并直接保存在浏览器上的一小块数据,浏览器在之后的的请求中,都会携带着这一小块的数据,如下图所示,Cookie的作用通常用于区分是否是同一个用户发送的请求,Cookie通常分为如下几种。

[*]会话Cookie:指的是该Cookie的生命周期是会话级的,当会话关闭时(比如浏览器关闭),Cookie就会失效。
[*]持久 Cookie:指的是可以长期使用的Cookie,但是通常也会带有具体的过期日期,并且可以在不同的浏览器中都可以使用。



[*]HTTP缓存管理器:指的是HTTP请求的缓存管理设置,通常用于在性能测试中模拟浏览器的缓存行为,HTTP缓存管理器用于设置JMeter 如何处理 HTTP 请求的缓存。
[*]HTTP请求默认值:用于设置HTTP请求的默认值,比如请求的协议、服务端的IP或者域名地址、服务端的端口号、默认的HTTP请求参数等。
[*]Bolt Connection Configuration:用于配置Bolt 协议连接,Bolt 是一种基于TCP的网络应用连接协议,比如连接Neo4j数据库(一个高性能的NOSQL图形数据库)时,采用的就是这种协议。
[*]计数器:通常用于在测试时,生成连续不重复的数字,计数器的用途通常用于生成一个唯一的数字或者Id,比如当向数据库中插入数据时,需要保证数据的唯一性,就可以用计数器来构造唯一不重复的数据。当定义了一个计数器后,就可以通过引用名称来引用这个计数器,此时就可以把计数器当成一个变量来引用和使用。
[*]DNS缓存管理器:通常用于设置自定义的DNS解析,其实就是在Jmeter中设置了一个自定义域名和服务端IP的映射关系,当访问自定义的域名时,就直接将请求发送到对应的服务端IP上。
[*]FTP默认请求:用于设置FTP取样器请求的默认配置,包括FTP服务端的IP、端口号、远程文件的路径等信息。
[*]HTTP授权管理器:用于设置和管理HTTP 请求的授权认证方式,当HTTP 服务端需要做授权认证时,就需要用到该授权管理器,授权管理器允许为服务端指定一个或者多个认证用户,并且为这些认证用户指定默认的用户名和密码,使用的场景通常是在一些服务端身份证验证的网站中,当用户浏览某个页面时,会自动弹出一个身份认证的登录界面或者登录对话框,Jmeter在遇到这种场景时,就会自动传入默认设置的授权认证信息,授权认证时需要在Jmeter界面中设置的参数配置包括:

[*]Base URL:用于设置与待鉴权的一个或者多个HTTP URL地址匹配的部分或者完整URL地址。
[*]Username:用于设置待授权的用户名。
[*]Password:用于设置待授权的用户名对应的密码。
[*]Domain:用于设置待授权的域名地址。
[*]Realm:用于设置待授权的领域。
[*]Mechanism:用于设置身份验证类型,JMeter可以根据使用的Http请求取样器来执行不同类型的身份验证,比如当Http请求取样器的客户端实现为 纯Java语言实现时(即客户端实现的下拉框选择为Java),其Mechanism为BASIC,而当为HttpClient4实现时, Mechanism则可以支持BASIC、 DIGEST 和Kerberos这三种类型,如下图所示。



[*]JDBC Connection Configuration:用于设置JDBC取样器请求的默认配置信息,通常包括JDBC URL、JDBC 驱动的Class名称、用户名、密码、JDBC的超时配置等信息,具体包含的详情如下:

[*]Variable Name for created pool:用于设置创建的连接池的变量名称,在Jmeter测试计划中可以同时创建多个JDBC Connection Configuration,然后在每个JDBC Connection Configuration中设置一个不同的变量名称,然后每个JDBC取样器可以绑定对应的不同的连接池变量,因为在一个Jmeter测试计划中,可以创建多个JDBC取样器。
[*]Max Number of Connections:用于设置连接池中最大的连接数,如果将其设置为0,则表示Jmeter多并发用户线程中,每个线程都可以获得自己的连接池,并且每个线程自己的连接池中都只有1个线程,以达到每个线程之间不会共享连接,如果需要使用共享连接池,那么建议需要将最大的连接数设置为与线程总数相同,以确保线程不会相互等待连接释放。
[*]Max Wait (ms):设置Jmeter尝试检索获取连接的最大等待时长,单位为毫秒,如果超出该时长,会抛出异常,如果设置为0或者小于0则表示设置为无限期等待。
[*]Time Between Eviction Runs (ms):用于设置空闲对象驱逐线程运行之间会休眠的时长,单位为毫秒,默认为“60000”,即1分钟,空闲对象驱逐线程通常用于对一些空闲不用的连接进行释放以节省服务器端相关资源的开销。
[*]Auto Commit:用于设置是否打开连接的事务自动提交,在数据库操作中通常是有事务的,数据库事务通常具有如下特性。


[*]
[*]原子性:事务是一个不可分割的工作单位,要么全部执行,要么全部不执行。如果事务中的任何一步操作失败,整个事务都会被回滚,回到操作之前的状态,不会造成数据的损坏或不一致。
[*]一致性:事务在执行前后,数据库从一个一致性状态转移到另一个一致性状态。即使在事务执行过程中出现异常,数据库也会通过回滚操作,将数据恢复到一致性状态。
[*] 隔离性:事务的执行不会受到其他事务的影响,每个事务在执行过程中都应该感觉不到其他事务的存在。即使多个事务同时操作同一数据,也不会互相干扰。隔离性能够防止并发事务导致的数据异常和不一致问题。
[*]持久性:一旦事务被提交,其所做的修改将会永久保存在数据库中,并且即使系统发生故障,这些修改也不会丢失。数据库系统会将事务的修改持久化到磁盘中,以保证数据的持久性。



[*]

[*]Transaction isolation:用于设置数据库事务的隔离级别,如果数据库操作时,不设置事务隔离级别,可能会导致如下问题:


[*]
[*]脏读:一个事务会读取了另一个事务还没有提交的数据。
[*]不可重复读:一个事务的操作会引起另一个事务前后两次读取到的数据不一致。
[*] 幻读:一个事务的操作导致另一个事务前后两次查询到的数据量不一样多。

在Jmeter中,支持的隔离级别选项如下:

[*]
[*] TRANSACTION_NONE: 表示设置为无事务,即表示不使用事务。
[*] TRANSACTION_READ_UNCOMMITTED:表示设置为允许读取其他还没有被提交到数据库的并发事务做出的修改,在所有的有效的事务级别中,这个事务在查询时,查询是最快的,因为不存在太多的事务等待。
[*]TRANSACTION_READ_COMMITTED:表示设置为可以读取已经被提交到数据库中的其他并发事务所做出的修改,如果其他的并发事务修改了数据,但是还没提交,那么在该事务级别下查询数据时,该数据是不会被查询出来的。
[*]TRANSACTION_SERIALIZABLE:表示设置为等待其他的所有事务提交后才能执行当前的数据库操作,这个事务隔离级别通常是最慢的,因为此时所有的事务都是串行执行的,后一个事务必须等前面一个事务提交后才能执行。
[*]  DEFAULT:每个数据库的默认隔离级别不一样,比如常用的MySQL数据库中的默认隔离级别为TRANSACTION_REPEATABLE_READ。
[*] TRANSACTION_REPEATABLE_READ:表示设置为数据读取操作可以重复执行,即表示每次读取同样的数据应该总是得到同样的结果,这个事务级别比TRANSACTION_SERIALIZABLE要快,但是比其他的事务隔离级别都要慢。
[*] 自定义编辑:允许用户自己自定义输入事务隔离级别的类型。



[*]

[*]Pool Prepared Statements:设置连接池中待准备的SQL语句的最大数量,如果设置为0表示最大数量不受限制,如果设置为-1表示禁用该功能。
[*]Preinit Pool:用于设置连接池是否可以立即初始化,默认为False,此时使用此连接池的JDBC取样器可能会在首次查询时使用的时长较久,因为此时整个连接池的连接建立时间都包含在内。
[*]Init SQL statements separated by new line:用于设置初始化的SQL语句,该SQL语句可以在连接池创建时,就立即执行,但是这些SQL语句仅在配置的连接池创建连接时执行一次。
[*]Test While Idle:用于设置是否开启测试连接池是否可用的空闲连接。
[*]Soft Min Evictable Idle Time(ms):用于设置每个连接在连接池中可以空闲的最短时长,当超过该时长时可能就会被空闲对象驱逐线程驱逐,单位为毫秒。
[*]Validation Query:用于设置数据库的查询验证,通常用于保持数据库的连接或者检查数据库当前的状态是否正常以及是否可以正常响应查询,比如在MySQL、MariaDB、SQL Server 、PostgreSQL等数据库中,可以设置为select 1。
[*]Database URL:用于设置数据库的JDBC连接地址。
[*]JDBC Driver class:用于设置JDBC驱动的Class 名称,常见数据库的JDBC Driver class如下所示。

[*]Oracle数据库:oracle.jdbc.OracleDriver
[*]DB2数据库:com.ibm.db2.jcc.DB2Driver
[*]MySQL数据库:com.mysql.jdbc.Driver
[*]SQL Server数据库:com.microsoft.sqlserver.jdbc.SQLServerDriver 或者com.microsoft.jdbc.sqlserver.SQLServerDriver
[*]PostgreSQL数据库:org.postgresql.Driver
[*]MariaDB数据库:org.mariadb.jdbc.Driver
[*]Username:用于设置数据库的用户名。
[*]Password:用于设置数据库的密码。
[*]Connection Properties:用于设置建立JDBC连接时需要自定义指定的连接属性,比如在Oracle数据库中,可以自定义设置internal_long=sysdba。


[*]Java 默认请求:用于设置Jmeter中自带的Java取样器的默认配置信息。
[*]Keystore Configuration:用于设置Keystore,通常在HTTPS请求协议中会被使用到,使用该配置时需要先导入到Java密钥库中,Keystore配置包括预加载、别名变量、索引等选项。
[*]LDAP扩展请求默认值:用于设置LDAP扩展请求取样器的默认值的配置,LDAP是一种网络传输的应用层协议,Jmeter支持对LDAP服务做性能压测。
[*]LDAP默认请求:用于设置LDAP请求取样器的默认请求值的配置。
[*]登录配置元件/素:用于设置登录配置的用户名和密码,通常用于用户身份认证的场景设置。
[*]Random Variable:用于设置获取随机值,并且可以将该随机值赋予给一个变量,然后在Jmeter中,可以直接引用这个变量来产生随机数。
[*]简单配置元件:指可以通过简单的方式来配置元素的值。
[*]TCP取样器配置:用于设置TCP请求取样器的默认配置,Jmeter 支持直接对TCP协议的服务发起性能压测请求,该配置界面支持的配置如下。

[*]TCPClient classname:用于设置TCP客户端的类名。
[*]服务器名称或IP:用于设置TCP服务端的域名或者IP。
[*]端口号:用于设置TCP服务端的端口号。
[*]连接超时:用于设置TCP连接的超时时长,单位为毫秒。
[*]响应超时:用于设置TCP请求的响应超时时长,单位为毫秒。
[*]Re-use connection:如果选中该选项,TCP连接将始终保持打开状态。否则,当数据被读取完后,它将关闭。
[*]关闭连接:如果选中该选项,则在运行取样器结束后将关闭连接。
[*]设置无延迟:用于是否将nodelay 属性设置为true。
[*]SO_LINGER:用于设置在socket连接创建时,指定延迟时长,单位为秒。如果将延迟的时长设置为0,将可以避免大量TCP连接状态为TIME_WAIT的连接存在,TIME_WAIT是TCP连接中的一种中间状态,用于确保连接可靠关闭的关键状态,通常持续60秒左右,但是如果大量的连接都处于TIME_WAIT状态,将会导致连接不能及时释放,从而导致性能测试时,连接不够用,从而造成一定的性能瓶颈。
[*]行尾(EOL)字节值:用于设置行尾的字节值,如果将其设置为-128到+127范围之外的值,则可以跳过TCP请求中的EOL检查。
[*]要发送的文本:设置TCP请求需要发送的文本内容。

[*]用户定义的变量:用于设置用户自定义的全局变量,该全局变量可以在整个Jmeter性能测试计划中生效和使用。
4、本次学习总结
本次主要是对Jmeter中的元件做一个基础的入门介绍,Jmeter元件是使用Jmeter来完成性能测试的基础,也是核心,所以本章的内容是读者们需要重点进行掌握的,通过本章的学习,建议读者们需要掌握:

[*]Jmeter测试计划以及线程组的使用。
[*]配置元件的使用,包括CSV Data Set Config、HTTP信息头管理器、HTTP Cookie管理器、HTTP缓存管理器、HTTP请求默认值、Bolt Connection Configuration、计数器、DNS缓存管理器、FTP默认请求、HTTP授权管理器、JDBC Connection Configuration、Java 默认请求、Keystore Configuration、LDAP扩展请求默认值、LDAP默认请求、Random Variable、简单配置元件、TCP取样器配置、用户定义的变量等,其中CSV Data Set Config、HTTP信息头管理器、HTTP Cookie管理器、HTTP缓存管理器、HTTP请求默认值、HTTP授权管理器、JDBC Connection Configuration等配置元件在Jmeter性能测试中会经常被用到,建议读者们进行重点掌握。
出处:本次学习的内容参考自清华大学出版社出版的《JMeter核心技术、性能测试与性能分析》一书

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 每周读书与学习->初识JMeter 元件(一)