JMeter CSV 数据文件设置(CSV Data Set Config) 的内容。
1. 作用和添加位置
从外部 CSV 文件中逐行读取数据,并把每一列的值赋给变量(如 ${username}),供后续取样器使用。
在测试计划中:右键 线程组 → 添加 → 配置元件 → CSV 数据文件设置,一般放在 HTTP 请求等取样器的上层。
2. 配置参数
文件名
CSV 文件的途径。可以是绝对途径,也可以是相对途径(相对于 JMeter 的 bin 目录或 .jmx 文件所在目录)。如 data/users.csv。
文件编码
文件的字符编码。如果 CSV 中包含中文等非 ASCII 字符,建议设为 UTF-8。
变量名称
为 CSV 的每一列定义变量名,用英文逗号分隔。
如文件有两列,依次是用户名和密码,就填 username,password。
如果留空,JMeter 会以 CSV 文件的第一行作为变量名,并且会读取该行内容作为数据,除非同时设置了“忽略首行”。
忽略首行
如果 CSV 第一行是标题头(如 用户名,密码),需要设为 True 才会跳过,否则标题行会被当作一条数据使用。
注意:当你已经在“变量名称”中手动指定了变量名,且 CSV 第一行确实是标题时,必须设为 True,否则首行数据会被读出(导致变量值变成标题文字)。
分隔符
列之间的分隔字符。默认为逗号 ,。如果 CSV 用制表符分隔,可以填 \t。
是不是允许带引号?
设为 True 时,允许字段被双引号包裹。
当某个字段内包含了分隔符(如 "San Francisco, CA")或换行符时,需要用引号,此时应开启此项。
遇到文件结束符再次循环?
当所有行都被读完一遍后,是不是从头重新读取。
如果希望数据能反复使用(如线程数多于数据行数),可设为 True。
该选项和下一个“停止线程”一般互斥:一个为 True 时另一个应为 False。
遇到文件结束符停止线程?
读完文件所有行后,是不是直接结束当前线程。
常用于“每条数据只用一次,用完线程就结束”的场景,此时设为 True,同时不要勾选“再次循环”。
线程共享方式
控制多个虚拟用户怎样共同读取 CSV 数据。有三个选项:
所有线程:整个测试计划中所有虚拟用户共用一个文件读取指针,你读一行、我读下一行,一行数据不会被重复分配给不同用户(除非循环)。
当前线程组:同一个线程组内的所有用户共享一个指针,不同线程组之间各自独立。
当前线程:每个虚拟用户都有自己独立的文件指针,从第一行开始单独读取,互不干扰。
3. 配置举例
假设 CSV 文件 users.csv 内容如下(无标题行):
text
user1,pass1
user2,pass2
user3,pass3
配置方案:
文件名:users.csv(放在 JMeter 的 bin 目录)
变量名称:username,password
忽略首行:False
分隔符:,
线程共享方式:所有线程(3 个用户各取一行,不重复)
然后在 HTTP 请求的参数中,使用 ${username} 和 ${password} 即可。
4. 线程共享方式的行为差别
假设有 3 个虚拟用户,且 CSV 正好有 3 行数据:
所有线程
三个用户共用一个指针。第 1 个用户取第 1 行,第 2 个取第 2 行,第 3 个取第 3 行。数据刚好用完。如果用户数多于 3,则取决于“再次循环/停止线程”设置。
当前线程
每个用户都拥有自己的独立指针。每个用户都会从第 1 行读到第 3 行,各自独立执行三次循环(或根据循环控制器控制)。适合每个用户都要遍历所有数据的场景。
当前线程组
同线程组内的用户共享,组外独立。如果所有用户都在同一个线程组,行为和“所有线程”相同;如果分为多个线程组,则不同组各自拥有一个指针。
5. 常见技巧
途径推荐:尽量使用相对途径,把 CSV 文件放在 .jmx 同目录下,然后文件名直接写 data.csv。
作用域:CSV 数据文件设置放在线程组下或其父级即可生效,一般建议放在线程组内第一个位置。
配合循环控制器:如果希望一个线程遍历所有数据行,可在其下添加“循环控制器”(次数=CSV行数),并设置“再次循环=False”“停止线程=False”,共享方式为“当前线程”。
调试方法:在采样器中添加“察看结果树”和“调试取样器”,可以直观看到 ${username} 等变量是不是被正确赋值。
数据含分隔符:如果字段内包含逗号,请用英文双引号将整个字段包裹起来,如 "New York, NY",10001,并在设置中开启“是不是允许带引号? = True”。
变量名留空的特殊情况:如果没填“变量名称”且 CSV 首行是标题,需要同时勾选“忽略首行 = False”(否则标题会当作变量名被读走),并保证后续引用时使用和标题一致的变量名(如标题为 user,pass,引用时用 ${user})。一般手动指定变量名更可控。
6. 其他读取 CSV 的方式
__CSVRead 函数:${__CSVRead(data.csv,0)} 可动态读取指定列,较灵活但不易维护。
__StringFromFile 函数:每次调用读取文件的一整行。