JMeter--配置元件

1、HTTP cookie 管理器


Cookie管理器元素有两个功能:

首先,它像web浏览器一样存储和发送cookie。如果您有一个HTTP请求,并且响应包含一个cookie, cookie管理器将自动存储该cookie,并将其用于将来对该特定web站点的所有请求。每个JMeter线程都有自己的“cookie存储区域”。因此,如果您正在测试一个使用cookie来存储会话信息的web站点,那么每个JMeter线程都有自己的会话。注意,这些Cookie不会出现在Cookie管理器显示中,但是可以使用查看结果树监听器看到它们。

JMeter检查收到的cookie是否对URL有效。这意味着不存储跨域cookie。如果您有错误的行为或希望使用跨域cookie,请修改JMeter Property文件中“cookiemanager .check.cookie =false”。
*注意,该文件的默认地址是:/Users/guxuecheng/Downloads/apache-jmeter-3.3/bin/jmeter.properties *

接收到的cookie可以存储为JMeter线程变量。要将cookie保存为变量,请定义属性“cookiemanager .save.cookie =true”。另外,cookie名称在存储之前以“COOKIE_”作为前缀(这避免了局部变量的意外损坏),以还原到原始行为,定义属性“CookieManager.name.prefix=' '(一个或多个空格)。修改以后(需要重启 JMeter),带有名称TEST的cookie的值可以称为${COOKIE_TEST}
注意:每一个 cookie 的名称必须以 COOKIE_开头

第二,您可以手动向cookie管理器添加cookie。但是,如果这样做,cookie将由所有JMeter线程共享。

默认情况下,使用空值(null)的cookie会被忽略。这可以通过设置JMeter属性:cookiemanager .delete_null_cookie =false来更改。注意,这也适用于手动定义的cookie——任何这样的cookie在更新后将从显示中删除。还要注意,cookie的名称必须是唯一的——如果第二个cookie是用相同的名称定义的,它将替换第一个cookie。

JMeter--配置元件_第1张图片
HTTP Cookie管理器中文版
JMeter--配置元件_第2张图片
英文版

如果采样器的作用域中有多个Cookie管理器,那么目前无法指定使用哪个Cookie管理器。另外,存储在一个cookie管理器中的cookie对任何其他管理器都不可用,所以要小心使用多个cookie管理器。

参数
属性 描述 是否为必选项
名称 管理器的名称,可任意命名,便于自己区分记忆,可使用默认值
每次反复清除 Cookies? 如果选中,每次执行主线程组循环时都会清除所有服务器定义的cookie。没有清除GUI中定义的任何cookie。
Cookie Policy 用于管理cookie的cookie策略。“standard”是3.0以后的默认值,在大多数情况下应该可以工作。参见Cookie规范和CookieSpec实现[注:“ignoreCookies”相当于省略了CookieManager]。
Implementation HC4CookieHandler(HttpClient 4.5。X的API)。默认是3.0以后的HC4CookieHandler。[注:如果你有一个网站要测试IPv6地址,选择HC4CookieHandler(兼容IPv6)]
存储在 Cookie 管理器中的 Cookie 这使您有机会使用测试执行期间所有线程都将使用的硬编码cookie。“域”是服务器的主机名(没有http://);该端口目前被忽略。
添加 添加一行 cookie N/A
删除 删除选中的一行 N/A
载入 加载以前保存的cookie表,并将条目添加到现有的cookie表条目中。 N/A
保存测试计划 将当前cookie表保存到一个文件中(不保存从HTTP响应中提取的任何cookie)。 N/A


2、CSV Data Set Config


创建csv文件,把需要的参数写在一列中。不需要写变量名称,直接写变量值就可以。


JMeter--配置元件_第3张图片
CSV Data Set Config

CSV Data Set Config用于从文件中读取行,并将它们拆分为变量。它比__CSVRead()和__StringFromFile()函数更容易使用。它非常适合处理大量变量,并且对于使用“随机”和惟一值进行测试也很有用。

在运行时生成唯一的随机值在CPU和内存方面代价高昂,因此只需在测试之前创建数据。如果有必要,文件中的“随机”数据可以与运行时参数一起使用,以从每次运行中创建不同的值集——例如使用连接——这比在运行时生成所有东西要便宜得多。

JMeter允许引用值;这允许值包含分隔符。如果启用了“allow quoted data”,一个值可以用双引号括起来。这些都是删除。若要在引用字段中包含双引号,请使用两个双引号。例如:

1,"2,3","4""5" =>
1
2,3
4"5

JMeter支持CSV文件,这些文件的标题行定义列名。要启用此功能,请将“Variable Names”字段保留为空。必须提供正确的分隔符。

JMeter支持包含新行在内的引用数据的CSV文件。

默认情况下,文件只打开一次,每个线程将使用与文件不同的行。然而,将行传递给线程的顺序取决于它们执行的顺序,这在迭代之间可能有所不同。在每次测试迭代开始时读取行。在第一次迭代中解析文件名和模式。

有关其他选项,请参阅下面共享模式的描述。如果希望每个线程都有自己的一组值,那么需要为每个线程创建一组文件。例如test1.csv,test2.csv,…,testn.csv。使用文件名test$ { __threadNum }.csvSharing mode设置为“Current thread”。

CSV数据集变量是在每次测试迭代开始时定义的。由于这是在配置处理完成之后,所以它们不能用于某些配置项——例如JDBC Config——在配置时处理它们的内容(参见Bug 40394),但是这些变量在HTTP Auth管理器中可以工作,因为username等在运行时被处理。

作为一种特殊情况,分隔符字段中的字符串“\t”(不带引号)被视为制表符。

当到达文件(EOF)的末尾,且循环选项为true时,读取将从文件的第一行重新开始。

如果recycle选项为false,而stopThread为false,那么当到达文件末尾时,所有变量都被设置为。这个值可以通过设置JMeter属性csvdataset.eofstring来更改。

如果回收选项为false,停止线程为true,那么到达EOF将导致线程停止。

参数
属性 描述 是否为必选项
名称 树中显示的这个元素的描述性名称。
Filename 要读取的文件的名称。相对文件名是根据活动测试计划的路径解析的。对于分布式测试,CSV文件必须存储在服务器主机系统中与JMeter服务器启动位置相对的正确目录中。也支持绝对文件名,但请注意,除非远程服务器具有相同的目录结构,否则它们不太可能在远程模式下工作。如果同一个物理文件以两种不同的方式引用——例如csvdata.txt./ csvdata.txt -然后这些被当作不同的文件。如果操作系统不区分大小写,那么csvData.TXT也将被分开打开。
File Encoding 用于读取文件(如果不是平台默认值)的编码。
Variable Names 变量名称的列表。名称必须用分隔符分隔。它们可以用双引号引用。JMeter支持CSV头行:如果变量name字段为空,则读取文件的第一行并将其解释为列名列表。
Use first line as Variable Names 忽略CSV文件的第一行,它只在变量名不为空时使用,如果变量名为空,第一行必须包含头。
Delimiter 分隔符,用于分割文件中的记录。如果行上的值比变量的值少,则其余的变量不会被更新——因此它们将保留以前的值(如果有的话)。
Allow quoted data? CSV文件是否允许引用值?如果启用,则可以将值括在" --双引号-允许值包含分隔符。
Recycle on EOF? 是否应该在到达EOF时从头重新(循环)读取文件?(默认是true)
Stop thread on EOF? 如果回收是假的,线程是否应该在EOF上停止?(默认是false)
Sharing mode All threads——文件在所有线程之间共享。
Current thread group——对于出现元素的每个线程组,每个文件都会打开一次
Current thread—为每个线程分别打开每个文件
Identifier-所有共享相同标识符的线程共享相同的文件。例如,如果您有4个线程组,您可以为两个或两个以上的组使用一个公共id在它们之间共享文件。或者您可以使用线程号在不同线程组中的相同线程号之间共享文件。

注意:EOF 是一个文件结尾的意思。

JMeter--配置元件_第4张图片
.csv
JMeter--配置元件_第5张图片
两组变量值示例

如果上面的实例变量名是 username 和 password,那么就要在Variable Names一栏写上 username,password

JMeter--配置元件_第6张图片
Variable Names

这里的变量名适合 CSV 文件中的值是一一对应的。

csv 文件已经创建,变量也已经定义,那么如何让 HTTP 请求的参数获取到这些值呢?

JMeter--配置元件_第7张图片
请求参数

如图,这里的参数取值{password}是和Variable Names中定义的参数是一样的,否则无法获取到 CSV 文件中的变量值。

下面我以我们公司一个 Web 应用的登录接口为例,说明一下使用方法:

  • 首先我们可以使用浏览器的开发者工具来获取该登录接口的参数,如下图:
JMeter--配置元件_第8张图片
登录接口的获取
JMeter--配置元件_第9张图片
接口参数

通过上图我们很容易知道登录接口的 URL 和所需要的参数。

  • 下面我们使用 JMeter 创建线程组:


    JMeter--配置元件_第10张图片
    登录线程组

上图中的参数部分(Parameters) 应该是填写账号(account)和密码(password)的,此处我们使用了 CSV 参数化,你可以暂时不用管,往下阅读你就会明白。

我们知道,一个 HTTP 只能发送一次请求,如果我们要测试10个账号的路情景,就需要在一个线程组里添加10个 HTTP 请求。10个HTTP 请求我们尚且比较容易创建,但是如果是100个,1000个呢?
所以此处我们需要使用 CSV 参数化,将这些需要测试的账号都写入表格中,如下图:

JMeter--配置元件_第11张图片
测试数据参数化

这样我们把参数全都写在 Excel 表格里,清晰明了,便于维护。
我在初次使用的时候出现了下面这个问题:

  • 明明第行账号密码是正确的,但是请求结果总是提示账号或者密码错误,查看“请求”结果发现,原来是参数传入了乱码,如下图:


    JMeter--配置元件_第12张图片
    响应数据错误
JMeter--配置元件_第13张图片
接口参数传入错误

原来错误的原因是因为参数 account 的值应该是 xjx111111,结果实际传入的时候掺入了乱码,导致账号错误。
可是为什么呢?这个 Excel 表格我保存的格式也是 CSV 啊,账号也是对的,为什么就有乱码了呢?

我保存的格式如下图:


JMeter--配置元件_第14张图片
通用格式 CSV

一开始,我保存的格式是“通用格式 CSV”。后来发现下面还有一个“特殊格式”逗号分隔值(.csv),于是就尝试了一下这个,结果就正确了,先看结果,如下图:

JMeter--配置元件_第15张图片
参数传入正确
JMeter--配置元件_第16张图片
响应结果符合预期

其他9条参数正确,但是账号或者密码错误,如下图:

JMeter--配置元件_第17张图片
参数正确
JMeter--配置元件_第18张图片
账号或者密码错误

那么问题来了,我们需要的测试用例数据都写在了表格里,这个 Login 请求是怎么调用的呢?

  • 首先需要在这个线程组作用域内添加一个配置元件--CSV Data Set Config。这个配置元件有一些参数需要填写,主要有:Filename,Variable Names 这两个,如下图:


    JMeter--配置元件_第19张图片
    CSV 配置元件参数填写

这样 JMeter 就能够读取到表格中的数据了,但是我们如何在 Login 请求中准确的调用这些参数呢,调用变量格式是${变量名},如下图:

JMeter--配置元件_第20张图片
变量调用

哦,对了,还有一个小细节需要补充一下:表格里有10条数据需要依次全部执行,如果只是这样,那么就只会读取第一条数据,如何让 JMeter 自动读取全部数据呢?
在线程组里有一个参数是“循环次数”,在这里我们把这个参数设置成10,就可以了。

JMeter--配置元件_第21张图片
设置循环次数

好了,用法介绍完毕,如有问题,欢迎留言。

不过有一个问题,比如这个登录请求,如果登录的时候需要验证码,那似乎就比较麻烦了。

3、HTTP 信息头管理器(HTTP Header Manager)


主要是用来添加 HTTP 请求头。

JMeter现在支持多个头管理器。合并标题项以形成采样器的列表。如果要合并的条目与现有的标头名称匹配,它将替换以前的条目,除非条目值为空,在这种情况下,任何现有条目都将被删除。这允许您设置默认的标头集,并对特定的采样器应用调整。


JMeter--配置元件_第22张图片
HTTP Header Manager
JMeter--配置元件_第23张图片
HTTP 信息头管理器

补充一个小知识点:
HTTP 信息头管理器不仅可以用来发送 HTTP 请求头信息(比如 cookie 和 token),还有一个很好的作用, 就是反爬虫登录访问一些接口。
有些网站,对于接口请求,如果你是通过浏览器访问则可以正常,如果你是通过 JMeter等外部工具则无法访问。那么浏览器是通过什么来判断你是通过哪种方式发起的请求呢?

主要就是一个参数User-Agent,如果是通过浏览器访问该参数值就是Mozilla/5.0,如下图:

JMeter--配置元件_第24张图片
D0F3B10C-C54E-477C-9D38-F96AF7374E49.png

如果是通过 JMeter 则该参数值就是如下图所示:


JMeter--配置元件_第25张图片
DF03D6AE-FD54-42CC-89B0-D58072B41AD6.png

看到这里可能会有人说,我可以把这个参数 User-Agent 一同写在 HTTP 请求参数里啊,如下图:

JMeter--配置元件_第26张图片
HTTP 请求参数

其实这个参数并非必须的,写与不写都会请求成功。在这里尽管写出来了,参数值也指定是User-Agent: Mozilla/5.0,但是浏览器依然能够判断出你是通过某种工具发出的请求。JMeter 很强大,可以通过“HTTP信息头管理器”这个配置元件来伪装成是通过浏览器发出的请求,我们只需要在“HTTP信息头管理器”输入该参数就可以了,如下图:

JMeter--配置元件_第27张图片
通过 HTTP 信息头管理器传入请求头参数

这样我们再发送请求,该接口就会认为我们是通过浏览器发出的请求啦,如下图:

JMeter--配置元件_第28张图片
D0F14E3E-E66F-4E9C-9E51-5181E622B062.png

好了,示例讲完啦,如果有问题,欢迎留言。

4、JDBC Connection Configuration


从提供的JDBC连接设置中创建数据库连接(JDBC Request Sampler)。连接可以在线程间可选地合用。否则,每个线程都有自己的连接。JDBC采样器使用连接配置名称来选择适当的连接。使用的池是DBCP,请参阅BasicDataSource配置参数。

JMeter--配置元件_第29张图片
JDBC Connection Configuration
参数
属性 描述 是否为必须
名称 树中显示的连接配置的描述性名称。
Variable Name for created pool 连接所连接的变量的名称。可以使用多个连接,每个连接都绑定到不同的变量,允许JDBC Samplers选择适当的连接。

每个名字必须是不同的。如果有两个使用相同名称的配置元素,则只会保存一个。如果检测到重复的名称,JMeter将记录一条消息。
Max Number of Connections 池中允许的最大连接数。在大多数情况下,将其设置为0(0),这意味着每个线程都将得到自己的池,其中只有一个连接,即线程之间不共享连接。

如果您真的想使用共享池(为什么?),那么将最大数量设置为与线程数量相同,以确保线程之间不会互相等待。
Max Wait (ms) 如果在尝试检索连接的过程中超过超时时间,则Pool抛出一个错误,请参阅BasicDataSource.html#getMaxWaitMillis
Time Between Eviction Runs (ms) 空闲对象回收线程运行之间的睡眠毫秒数。当非正数时,将不会运行空闲对象驱逐器线程。(默认为“60000”,1分钟)。请参阅BasicDataSource.html#getTimeBetweenEvictionRunsMillis
Auto Commit 为连接打开或关闭自动提交。
Test While Idle 测试池的空闲连接,请参阅BasicDataSource.html#getTestWhileIdle.验证查询将用于测试它。
Soft Min Evictable Idle Time(ms) 在空闲对象回收器回收连接之前,连接可能会在池中闲置最少的时间,但额外的条件是,至少minIdle连接仍保留在池中。请参阅BasicDataSource.html#getSoftMinEvictableIdleTimeMillis
默认为5000(5秒)
Validation Query 用于确定数据库是否仍在响应的简单查询。这默认为jdbc驱动程序的‘isValid()’方法,该方法适用于许多数据库。然而,有些可能需要不同的查询;例如,Oracle可以使用“SELECT 1 FROM DUAL”之类的东西。
验证查询的列表可以使用jdbc.config.check配置。查询属性,默认为:

hsqldb
select 1 from INFORMATION_SCHEMA.SYSTEM_USERS
Oracle
select 1 from dual
DB2
select 1 from sysibm.sysdummy1
MySQL
select 1
Microsoft SQL Server (MS JDBC driver)
select 1
PostgreSQL
select 1
Ingres
select1
Derby
values 1
H2
select1
Firebird
select 1 from rdb$database

列表来自 stackoverflow entry on different database validation queries,它可能不正确

请注意,这个验证查询用于池的创建,以验证它,即使“Test While Idle”表明查询只在空闲连接上使用。这是DBCP行为。
Database URL 数据库的JDBC连接字符串
JDBC Driver class 驱动器类的全限定名称。(必须在JMeter的classpath中——最容易将.jar文件复制到JMeter的/lib目录中)。

验证查询列表可以使用jdbc.config.jdbc.driver配置。类属性,默认为:

hsqldb
org.hsqldb.jdbc.JDBCDriver

Oracle
oracle.jdbc.OracleDriver

DB2
com.ibm.db2.jcc.DB2Driver

MySQL
com.mysql.jdbc.Driver

Microsoft SQL Server (MS JDBC driver)
com.microsoft.sqlserver.jdbc.SQLServerDriver
或者
com.microsoft.jdbc.sqlserver.SQLServerDriver

PostgreSQL
org.postgresql.Driver

Ingres
com.ingres.jdbc.IngresDriver

Derby
org.apache.derby.jdbc.ClientDriver

H2
org.h2.Driver

Firebird
org.firebirdsql.jdbc.FBDrivery

Apache Derby
org.apache.derby.jdbc.ClientDriver

MariaDB
org.mariadb.jdbc.Driver

SQLite
org.sqlite.JDBC

Sybase AES
net.sourceforge.jtds.jdbc.Driver
Username 连接为的用户名。
Password 密码联系。(注意:此存储在测试计划中未加密)

不同的数据库和JDBC drivers需要不同的JDBC settings。Database URL和JDBC Driver class由JDBC implementation提供者定义。

下面显示了一些可能的设置。请查看JDBC driver文档中的详细信息。

如果JMeter报告No suitable driver,那么这可能意味着:

  • 没有找到driver类。在这种情况下,会有一个日志消息,比如DataSourceElement: Could not load driver: {classname} java.lang.ClassNotFoundException: {classname}

  • 找到驱动类,但是类不支持连接字符串。这可能是由于连接字符串中的语法错误,或者使用了错误的classname。

如果数据库服务器不运行或不可访问,那么JMeter将报告java.net.ConnectException。

下面给出了一些数据库及其参数的示例。

MySQL
 Driver class
  com.mysql.jdbc.Driver
 Database URL
  jdbc:mysql://host[:port]/dbname

如下图所示:

JMeter--配置元件_第30张图片
Database URL 和 JDBC Driver class

解释:
  - Driver class:因为测试的是 MySQL 数据库,所以这里选择com.mysql.jdbc.Driver,这个选项是可选的,不需要手动输入。

  - Database URL:就是你的数据库地址,因为我是在自己的电脑上创建的 MySQL 数据库,所以 host 是localhost;创建的数据库默认端口是3306,所以这里 port 是3306;因为我创建的数据库名称叫 my_db,所以dbname是 my_db。

PostgreSQL
 Driver class
  org.postgresql.Driver
 Database URL
  jdbc:postgresql:{dbname}

Oracle
 Driver class
  oracle.jdbc.OracleDriver
 Database URL
  jdbc:oracle:thin:@//host:port/service  或者 jdbc:oracle:thin:@(description=(address=(host={mc-name})(protocol=tcp)(port={port-no}))(connect_data=(sid={sid})))

Ingress (2006)
 Driver class
  ingres.jdbc.IngresDriver
 Database URL
  jdbc:ingres://host:port/db[;attr=value]

Microsoft SQL Server (MS JDBC driver)
 Driver class
  com.microsoft.sqlserver.jdbc.SQLServerDriver
 Database URL
  jdbc:sqlserver://host:port;DatabaseName=dbname

Apache Derby
 Driver class
  org.apache.derby.jdbc.ClientDriver
 Database URL
  jdbc:derby://server[:port]/databaseName[;URLAttributes=value[;…]]

以上可能不正确——请检查相关的JDBC驱动程序文档。

你可能感兴趣的:(JMeter--配置元件)