JMeter接口测试:参数化配置

2024-08-23 16:52 胡钇臣 345

一、介绍

Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。JMeter 可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter 能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证程序是否返回了期望结果。

JMeter 还可以进行接口测试,上篇文章讲解了如何使用JMeter来测试一个抽奖接口的中奖概率是否符合需求的要求,其中用到了JMeter的CSV Data Set Config配置元件,本文将详细讲解一下如何使用这个配置元件将接口的入参进行参数化。

二、添加参数化的配置元件

如下图所示,选中需测试的HTTP请求,右键点击,找到配置元件,选择CSV Data Set Config,即可完成添加。需注意,参数化的配置元件一定要放在HTTP请求的结构树下,否则可能不生效。

三、CSV Data Set Config参数说明

3.1Filename

txt或csv文件的路径,可以是绝对路径,也可以是相对路径。

3.2File encoding

编码格式。若没有设置,则以操作系统的字符编码去读取数据文件。可以指定以何种编码去读取数据文件,以防止出现乱码。数据文件(CSV文件)的编码一般为UTF-8,这种情况下需设置为UTF-8才能正常读取。

3.3Variable Names(comma-delimited)

变量名称(英文逗号间隔)。如果文件中只有一个变量名,直接填写此变量名即可;如果有多个变量名,需要用英文逗号隔开,例如:record_uuid,user_uuid

如果此处不填写,JMeter则将数据文件的第一行各字段值作为各个变量名(不论是否忽略第一行),即不受Ignore first line (only used if Variable Names is not empty)设置的影响。

比如数据文件中第一行和第二行值为:

test,test1

TEST,TEST1

在没有设置变量名的情况下,第一行的test,test1会被设置为变量名。{{test},{{test1}的值分别是TEST,TEST1

如上所述,这里需要根据实际情况来填写,如果文件中第一行是变量名,那么这里可以不用填写;如果文件中第一行不是变量名,那么这里就需要填写变量名。

3.4Ignore first line (only used if Variable Names is not empty)

是否忽略文件的第一行,默认为False。这个设置项只有在设置了变量名称(3.3Variable Names(comma-delimited))才会起作用。

选择True则表示忽略第一行,选择False则表示不忽略第一行。一般情况下我们在准备参数化文件时都会填写列的标题的,第一行不是变量值,所以这里一般选择True来忽略。但如果没有列标题,这里需要选择False。

比如数据文件中第一行和第二行为:

record_uuid,user_uuid

test,test1

TEST,TEST1

如果设置为False,则会将record_uuid,user_uuid当做变量的值读取;设置为True会忽略此行,从第二行开始读取。在测试过程中,需要检查文件中的第一行和此设置是否冲突,否则运行脚本会报错。

3.5Delimiter (use' 'for tab)

文件中变量名称和变量值的分隔符。默认值为,(英文逗号)分隔。

3.6Allow quoted data?

文件中的值是否允许使用双引号,默认为False。True表示允许,False表示不允许。一般用于当值中包含分隔符时,可考虑将值用双引号括起来,屏蔽分隔符的特殊含义。

比如文件中填写了商品名称、价格的变量值:

name,price

手机,“6,000”

参考上述举例,变量值中的,其实代表着千分位符号,与设置中的,分隔符冲突了。如果没有双引号,商品的价格则为6;加上双引号后,商品价格为6,000。

3.7Recycle on EOF?

读取完文件最后一行变量值后,是否回到第一行变量值重新读取,默认为True。True为循环读取,False为不循环读取。

这里有个前提条件,当线程数超出文件中变量值的行数后,这里的配置才生效:假设线程数为100,文件中变量值只有60行,那么跑完第60行后会再回到变量值的第一行重新读取(每个变量值仅供一个线程使用)。

3.8Stop thread on EOF?

读取完文件最后一行变量值后,是否停止线程,默认为False。True为停止线程,不再继续运行脚本;False为不停止线程,继续循环取变量值运行脚本。

3.9Recycle on EOF?和Stop thread on EOF?的关联关系

Recycle on EOF?为True时,Stop thread on EOF?选择True或False都没有意义了。因为前面的设置已经明确了文件是循环读取,后面的控制停止线程就相当于失效了。优先级:Recycle on EOF?大于Stop thread on EOF?。

Recycle on EOF?为False时,Stop thread on EOF?为True,当线程数超出文件中变量值的行数后,实际请求数为变量值的行数。假设线程数为100,文件中变量值行数为60,那么实际请求数只有60个。

Recycle on EOF?和Stop thread on EOF?都为False,当线程数大于文件中变量值的行数后,实际请求数为线程数;当请求次数超过变量行数后,后续的请求都是失败的。假设线程数为100,文件中变量值行数为60,那么会有60次请求成功(这里假设100%请求成功),40次的请求失败,因为这40次请求是没有入参的。

上述参数按照实际情况配置好以后,就可以在HTTP请求的入参中来引用对应的变量了。