jmeter中使用Beanshell处理多个枚举类型参数

本文介绍了在JMeter中如何使用Beanshell脚本来处理多个枚举类型的参数,以满足测试用例中参数值随机组合的需求。在面对不同数量的枚举值时,CSV文件和用户定义变量等方法无法胜任,而通过Beanshell结合Java代码,可以创建数组,随机抽取值,并将其写入全局变量,从而实现组合。这种方式在接口测试和性能测试中非常实用,体现了JMeter的灵活性。

使用Jmeter执行web系统的测试,在向服务器发送请求时,附在请求上面的参数类型有很多种。比如说数值型(包括整数、小数)、字串类型等等。如果说系统没有规定参数值的取值范围,那么作为测试人员,我们一般都会在考虑实际业务场景的情况下可以利用jmeter的函数助手予以解决。比如用户在前端页面操作一个发表帖子的场景,其中帖子标题、帖子内容这些都可以通过函数助手使用随机字串来完成,测试人员只需要考虑参数值长度就可以了。特殊的情况是,一些参数值同样是数值型或者字串,但是系统已经明确指定了只能从某几个值之中选择(前端表现为下拉列表形式),并且,一个请求需要附加多个这样类型的参数,从测试用例设计的角度考虑,此时需要对这样的参数值随机组合,对于这种需求,jemeter中能满足要求的只有Beanshell。
如下,是本人这次使用jmeter时,通过Beanshell处理多个枚举参数的例子:

图中总共有7个下拉列表,在点击保存的时候会将选择的值附在请求上发送到服务器。

一开始并没有考虑Beanshell,因为之前对Beanshell不熟悉。首先是尝试了CVS文件的方式,但是实际使用时才发现,由于各个枚举值数量时不一样的,在测试计划执行的时候,数量少的枚举值超出范围后取的就是空值了,明显不能达到各个参数值随机组合的要求。
接下来又尝试了用户定义变量、函数助手都无法满足要求。最后就考虑到了Beanshell,对于Beanshell基本上是一点都不了解,幸运的是,从网上搜索的信息来看Beanshell中可以使用java代码,还好,java还没忘干净。

接下来就是如何在Beanshell中实现多个参数值随机组合了。主要的过程分以下几步:

1:将每个下拉列表当做一个数组来处理,比如:

String[] aaa = {"ad","de","wd"};
int[] bbb = {240,360,480,720,1080,2160};
int[] ccc = {12,15,25,30,60};
int[] ddd = {4,5,7};
int[] eee = {86,125,150,175,200,250,300,350,400,500,600,700,800,1000,1200,1500,2000,3000,4000,10000,12000,14000,16000};
int[] fff = {4,5};
int[] ggg = {1,2,3,4,5,6,7,8,9,10};

2:使用java代码编写方法,随机提取数组中的值并返回,如下:

可以不用写在Beanshell里面,而是保存成“.java”文件,然后再Beanshell中引用,如:
//引入java文件
//source(“E:\xxxx\GetTransParam.java”);

import java.util.Random;

Random random = new Random();
//输入的是int类型的数组,返回的是int数据
public int transParam(int len,int[] params) {
    int index = random.nextInt(len);
    return params[index];
}

//输入的是String类型的数组,返回的是string数据
public String transParam(int len, String[] params){
    int index = random.nextInt(len);
    return params[index];
}

3:针对每个下拉列表定义一个参数,用以接收从步骤2返回的值,如下:

String a = transParam(aaa.length,aaa);
int b = transParam(bbb.length,bbb);
int c = transParam(ccc.length,ccc);
int d = transParam(ddd.length,ddd);
int e = transParam(eee.length,eee);
int f = transParam(fff.length,fff);
int g = transParam(ggg.length,ggg);

4:利用Beanshell自身的vars.put()方法将步骤3的值写入到全局变量中,如下:
(vars.put(),两个参数都是字符串,第一个参数表示变量名,第二个参数表示对应的值)

vars.put("va",a);
vars.put("vb",b.toString());
vars.put("vc",v.toString());
vars.put("vd",d.toString());
vars.put("ve",e.toString());
vars.put("vf",f.toString());
vars.put("vg",g.toString());

接下来,我们只需要在测试步骤中通过${va}的方式对参数进行引用就可以了。

以上4个步骤,就可以达到将多个下拉列表的值随机组合的目标了。

Jmeter作为一个开源工具,对于web测试,不管是接口测试还是性能压力测试都有很大的作用,对于测试计划中各个步骤的创建都需要细心、耐心。而对于一些特殊过程的处理则还需要更加灵活的方式了。

继续努力,学无止境。

### 如何在 JMeter 中通过 BeanShell 获取时间戳并将结果保存 #### 使用 BeanShell 获取当前时间戳并保存到变量 可以通过 `System.currentTimeMillis()` 方法来获取当前时间的时间戳(毫秒级),然后将其除以 1000 转换为秒级时间戳。以下是具体的实现方法: ```java // 获取当前时间的时间戳(单位:秒) long currentTimeStamp = System.currentTimeMillis() / 1000; // 将时间戳存储到 JMeter 变量中 vars.put("currentTimestamp", String.valueOf(currentTimeStamp)); log.info("当前时间戳已保存至变量 currentTimestamp: " + currentTimeStamp); ``` 此脚本会将当前时间的时间戳存入名为 `currentTimestamp` 的 JMeter 变量中[^1]。 --- #### 动态计算特定时间点的时间戳 如果需要动态计算某个未来或过去时间点的时间戳,可以使用 Java 提供的 `Calendar` 类来进行操作。以下是一个示例,用于计算明天上午 11:59:59 的时间戳: ```java import java.util.Calendar; // 创建日历实例 Calendar cal = Calendar.getInstance(); cal.setTime(new java.util.Date()); // 设置时间为明天上午 11:59:59 cal.add(Calendar.DAY_OF_YEAR, 1); // 加一天 cal.set(Calendar.HOUR_OF_DAY, 11); // 设置小时 cal.set(Calendar.MINUTE, 59); // 设置分钟 cal.set(Calendar.SECOND, 59); // 设置秒数 // 计算时间戳 long tomorrowTime = cal.getTimeInMillis() / 1000; vars.put("tomorrowTimestamp", String.valueOf(tomorrowTime)); log.info("明天上午 11:59:59 的时间戳已保存至变量 tomorrowTimestamp: " + tomorrowTime); ``` 该脚本能够生成指定时间点的时间戳,并将其存储到名为 `tomorrowTimestamp` 的变量中[^5]。 --- #### 将时间戳写入文件 如果希望将时间戳记录到外部文件中,可以借助 `BufferedWriter` 或其他 I/O 流类完成这一功能。下面是一段简单的代码示例: ```java import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; // 定义目标文件路径 String filePath = "/path/to/your/timestamp.log"; // 当前时间戳 long timestamp = System.currentTimeMillis() / 1000; try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) { writer.write("Current Timestamp: " + timestamp + "\n"); } catch (IOException e) { log.error("无法写入时间戳到文件: " + filePath, e); } log.info("时间戳已成功写入文件: " + filePath); ``` 这段代码会在每次运行时追加一条新的时间戳记录到指定的日志文件中[^3]。 --- #### 注意事项 - 如果需要跨线程共享变量,则应使用全局属性而非局部变量。例如,可以用 `props.put("key", value)` 替代 `vars.put("key", value)` 来设置全局可用的属性[^2]。 - 在实际项目中建议尽量减少对 BeanShell 的依赖,因为其性能较低且已被官方标记为废弃状态。推荐改用 JSR223 组件配合 Groovy 编程语言作为替代方案。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值