背景:

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

示例围绕 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();

运行