【最佳实践】MeterSphere 接口测试深度数据驱动使用来喽


Administrator
飞致云 发布于 2023-01-12 / 936 阅读 / 0 评论 /

众所周知,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 文件
aa

StringFromFile函数读取单个文件:

aa.txt文件内容为测试账户名:gl1,gl2,gl3

使用 ${__StringFromFile(/opt/metersphere/data/json/aa.txt,)} 引用

因为每次执行读取一行,所以搭配循环控制器使用,如下图,设置循环次数7,文件有3行,第七次循环取的是文件第一行gl1
读取1

${__StringFromFile(/opt/metersphere/data/json/aa.txt,2)} 引用,因设置了末端序号为2,只读取文件两次,循环次数为7,此时第七次循环因请求体取值有问题报错
读取2

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,)}
整个文件1

${__FileToString(/opt/metersphere/data/json/test.csv,utf-8,)}
整个文件2

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行,第五次循环的时候,获取到的下一行数据的第二列为文件的第一行了
csv读取

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)}
xpath1

1-1673508968719

示例xpath表达式://target[2]/@name
2-1673509009445

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,)}”;

如下图在脚本中将变量值覆盖到文件中
写入1

此时文件被覆盖为新值
3-1673509319050



是否对你有帮助?