背景

在日常的功能测试或者性能测试的时候,需要把结果中指定的数据保存到指定的文件,进行使用。

示例围绕 Beanshell 来实现这个功能。

下面从两个方面来实现

保存接口返回指定的数据

从数据库用 SQL 语句取数据,保存结果到指定文件中

保存接口返回指定的数据

接口:登录

需求:提取 token 值

新建 HTTP 请求

请求返回的结果,这里直接用 JSON 显示:

新建 JSON 提取器

调试,看有没有获取到值

添加 debug sampler

运行,查看 debug sampler 响应数据里面 token 有没有取到值

添加 Beanshell 取样器

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 指定需要写入到 xxx 文件,若没有该文件会新建;若存在该文件,多次执行将以追加模式展示
File file = new File("D:/xxx.txt");
if (!file.exists()) {
// 创建失败会抛出异常 throw new IOException("Invalid file path");
file.createNewFile();
}

FileReader fileReader = new FileReader(file);
// FileWriter 默认是西文编码,如果是中文会乱码
BufferedReader bufferR = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
FileWriter fileWriter = new FileWriter(file, true);
BufferedWriter bufferW = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));
String line = null;
// 按行读
boolean containsTitleFlag = false;
while ((line = bufferR.readLine()) != null) {
// 判断是否已经包含了标题,有则跳过,没有则添加
if (line.contains("xxx") && line.contains("xxx")) {
// 读到了就 break
containsTitleFlag = true;
break;
}
}
if (!containsTitleFlag) {
// 写文件内容 ten_sys_flag,v_brand_category_id
bufferW.write("xxx" + "\t");
bufferW.write("xxx");
bufferW.write("\n");
}
bufferW.write(vars.get("xxx")+"\t");
bufferW.write(vars.get("xxx"));
bufferW.write("\n");
// 关闭数据流
bufferW.close();
bufferR.close();
// 关闭文件
fileReader.close();
fileWriter.close();

运行

从数据库用 SQL 语句取数据,保存结果到指定文件中

JDBC Request 参考 jmeter连接jdbc 章节

Beanshell 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 指定需要写入到 xxx 文件,若没有该文件会新建;若存在该文件,多次执行将以追加模式展示
File file = new File("D:/xxx.txt");
if (!file.exists()) {
// 创建失败会抛出异常 throw new IOException("Invalid file path");
file.createNewFile();
}

FileReader fileReader = new FileReader(file);
// FileWriter 默认是西文编码,如果是中文会乱码
BufferedReader bufferR = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
FileWriter fileWriter = new FileWriter(file, true);
BufferedWriter bufferW = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));
String line = null;
// 按行读
boolean containsTitleFlag = false;
while ((line = bufferR.readLine()) != null) {
// 判断是否已经包含了标题,有则跳过,没有则添加
if (line.contains("xxx") && line.contains("xxx")) {
// 读到了就 break
containsTitleFlag = true;
break;
}
}
if (!containsTitleFlag) {
bufferW.write("xxa" + "\t");
bufferW.write("xxb");
bufferW.write("\n");
}
// TODO: 这里和从接口中获取数据不同,SQL 获取到的值为列表,需要遍历取出,xxa 为其中一个字段,xxa_# 为获取到个数,xxa_{索引,从1开始} 为具体值
String num_str = vars.get("xxa_#");
Integer num = Integer.parseInt(num_str);
for (i = 1; i <= num; i++) {
String xxa = vars.get("xxa_" + i);
String xxb = vars.get("xxb_" + i);
// 写入
bufferW.write(xxa + "\t");
bufferW.write(xxb);
bufferW.write("\n");
}
// 关闭数据流
bufferW.close();
bufferR.close();
// 关闭文件
fileReader.close();
fileWriter.close();

运行