众所周知,MeterSphere 接口自动化中,用户可以添加 CSV 文件可以做数据驱动测试,不熟悉的小伙伴点这里 接口自动化做数据驱动(ddt)测试。除了 CSV 文件以外,日常测试过程中,还有 JSON、XML、或者增量与测试相关的文件需要进行读取和写入的操作。用脚本读取/写入文件,需要十行左右,
这次介绍的依然使用JMeter 函数来实现读取/写入文件。大家可以结合自身系统业务,适配测试方案,提升测试效率!
下面是本文要介绍到的函数,对函数使用不熟悉的朋友点这里 MeterSphere 中常用 JMeter 函数使用详细
函数名称 | 函数作用 |
---|---|
StringFromFile | 同时读取多个文件 |
FileToString | 读取整个文件内容 |
CSVRead | 从文件读取指定列的值 |
XPath | 使用 XPath 语法匹配 XML文件 |
StringToFile | 将字符串写入文件 |
1 StringFromFile:同时读取多个文件
1.1 业务背景
在一些大数据平台测试过程中,有些测试数据来源是爬虫增量获取到的,每天获取到的数据存为一个文本文件,现有接口需要读取批量文件进行测试,此时我们需要将多个文件中每一行值加载为接口请求参数。这时需要用到StringFromFile 函数,使用场景变量添加csv,也能达到相同的目的,而且方法更简单,但是它目前不支持多个输入文件。
1.2 函数说明
该函数用于从文本文件中读取字符串,每次读取一行,支持读取多个文件。
每次调用函数,都会从文件中读取下一行。当到达文件末尾时,函数又会从文件开始处重新读取,直到最大循环次数。
如果在一个测试脚本中对该函数有多次引用,那么每一次引用都会独立打开文件,即使文件名是相同的(如果函数读取的值,在脚本其他地方也有使用,那么就需要为每一次函数调用指定不同的变量名)。
如果在打开或者读取文件时发生错误,那么函数就会返回字符串"ERR"。
1.3 参数说明
参数 | 描述 | 是否必填 |
---|---|---|
文件名 | 文件名的路径 (路径可以相对于 JMeter 启动目录) | yes |
变量名 | 用于后续调用该函数的变量名称 | no |
启动序号 | 初始序列号(如果省略,则将结束序列号视为循环计数) | no |
末端序号 | 最终序列号(如果省略,序列号可以无限制地增加) | no |
启动序号:初始的序列号,如果省略,那么结束序列号就代表文件的循环读取次数。
末端序号:结束序列号,如果省略,那么序列号会无限增长。
1.4 使用示例
读取单个文件:
${_StringFromFile(demo.txt,,,)} 读取demo.txt
读取多个文件,需要在文件名中使用序列号:
${_StringFromFile(PIN.DAT,,,2)} 读取 PIN.DAT 两次
${_StringFromFile(PIN#'.'DAT,,1,3)} 读取 PIN1.DAT PIN2.DAT PIN3.DAT
${_StringFromFile(pin000'.'dat,,6,8)} 读取 pin006.dat pin007.dat pin008.dat
MS 所在服务器 data 目录下有 aa.txt 文件
StringFromFile函数读取单个文件:
aa.txt文件内容为测试账户名:gl1,gl2,gl3
使用 ${__StringFromFile(/opt/metersphere/data/json/aa.txt,)} 引用
因为每次执行读取一行,所以搭配循环控制器使用,如下图,设置循环次数7,文件有3行,第七次循环取的是文件第一行gl1
${__StringFromFile(/opt/metersphere/data/json/aa.txt,2)} 引用,因设置了末端序号为2,只读取文件两次,循环次数为7,此时第七次循环因请求体取值有问题报错
StringFromFile 函数读取多个文件:
aa1.txt 中有测试数据 admin1 admin2 admin3 aa2.txt中有测试数据 ycr1 ycr2 ycr3
使用 ${__StringFromFile(/opt/metersphere/data/json/aa#.txt,1,2)} 引用
前六次循环 name 依次取值为 admin1 admin2 admin3 ycr1 ycr2 ycr3
此时第七次循环因请求体取值有问题报错
使用序列号时,路径名被用作 java.text.DecimalFormat 的格式字符串。当前序列号作为唯一参数传入。如果未指定开始序列号,则按原样使用路径名称。
1.5 格式化系列使用示例
常用的两个格式化序列:
- #:插入数字,没有前导零或空格。
- 000:插入数字,数字不足三位时,将插入前导零补足三位;数字超过三位时,则插入数字实际位数。
用法说明:
在不带前导零的情况下插入数字:
pin#'.'dat:可以匹配 pin1.dat, ... pin9.dat, pin10.dat, ... pin9999.dat
带前导零的情况下插入数字:
pin000'.'dat:可以匹配 pin001.dat ... pin099.dat ... pin999.dat ... pin9999.dat
在不带前导零的情况下追加数字:
pin'.'dat#:可以匹配 pin.dat1, ... pin.dat9 ... pin.dat999
注意:上面的 . 是格式化字符,必须用单引号括起来。
2 FileToString :读取整个文件内容
2.1 业务背景
在 ToB 系统的业务场景中,经常有厂家需要将原始 JSON 文件数据,用于请求体传参,或者响应体对比等业务场景
2.2 函数说明
把文件读取成一个字符串,每次调用都是读取整个文件。读取文件保存至变量中。
如果出现打开或读取文件的错误,则函数将返回字符串 ERR。
2.3 参数说明
参数 | 描述 | 是否必填 |
---|---|---|
文件名 | 需要读取的文件名 | yes |
文件编码 | 读取文件的字符集 不传则用系统默认字符集 | no |
变量名 | 用于后续调用该函数的变量名称 | no |
2.4 使用案例
${__FileToString(/opt/metersphere/data/json/15.json,)}
${__FileToString(/opt/metersphere/data/json/test.csv,utf-8,)}
3 CSVRead :从文件读取指定列的值
3.1 业务背景
使用场景变量添加CSV,可以实现读取CSV内容,而且方法更简单,但是它必须搭配循环控制器才能读取到内容,有些测试业务场景也不需要获取到全部内容,只需要获取到指定列的值。可以用 CSVRead 函数读取,是否需要结合循环控制器,适配业务即可。
3.2 函数说明
- 从一个 CSV 文件中返回一个字符串。
- 当第一次调用该函数时,文件将被打开并读取到一个内部数组中。如果检测到空行,这将被视为文件的末尾。
- 所有对同一文件名的后续引用都使用相同的内部数组,文件名区分大小写。
- 每个线程都有自己的指向文件数组中当前行的内部指针。当线程首先引用文件时,它将在数组中分配下一个空闲行,因此每个线程将访问与所有其他线程不同的行(除非数组中的线程多于行)。
3.3 参数说明
参数 | 描述 | 是否必填 |
---|---|---|
文件名 | 需要读取的文件名 | yes |
列号 | 文件中的列号。0–第一列,1–第二列,next–文件的下一行 | yes |
3.4 使用示例
读取文件中的第1行第1列: ${__CSVRead(random.txt,0)}
读取文件中的第1行第2列,并进入文件下一行:${__CSVRead(random.txt,1)}${__CSVRead(random.txt,next)}
读取文件第2行第1列: ${__CSVRead(random.txt,0)}
读取文件中的第2行第2列,并进入文件下一行: ${__CSVRead(random.txt,1)}${__CSVRead(random.txt,next)}
示例描述:接口的请求参数值为 CSV中的第二列。
测试分析:每次获取当前行的第二列,并跳转到下一行,这里的示例搭配循环控制器使用,csv一共4行,第五次循环的时候,获取到的下一行数据的第二列为文件的第一行了
4 XPath:使用 XPath 语法匹配 XML文件
4.1 参数说明
字段 | 描述 | 是否必传 |
---|---|---|
XML file to get values from | 待解析的xml文件 ,绝对路径 | yes |
XPath expression to match against | xpath表达式匹配xml节点 | yes |
4.2 使用案例
${__XPath(/opt/metersphere/data/json/test.xml,//name)}
示例xpath表达式://target[2]/@name
5 StringToFile:将字符串写入文件
5.1 函数说明
- 在脚本中用 FileOutputStream 也可实现将字符串追加/覆盖到文件中,用函数更简便写。
- StringToFile函数每次调用它时,它都会将一个字符串附加或覆盖到文件中。
- 函数的默认返回值是空字符串。
5.2 参数说明
字段 | 描述 | 是否必传 |
---|---|---|
Path to file (absolute) | 文件名的路径。(路径是绝对的) | yes |
String to write | 要写入的内容。如果需要在内容中插入换行符,请在字符串中使用\n | yes |
Append to file (true appends, false overwrites, default true) | 字符串的写入方式,true表示追加,false表示覆盖。如果未指定,则默认的append为true | no |
File encoding if not UTF-8 | 用于写入文件的编码。如果未指定,默认编码为UTF-8 | no |
5.3 使用案例
String kong = “{__StringToFile(/opt/metersphere/data/json/aa.txt,{name},false,)}”;
如下图在脚本中将变量值覆盖到文件中
此时文件被覆盖为新值