jmeter之循环遍历器:多参数组合遍历
2023-12-18 14:33:36
测试场景
- 接口有多个参数,每个参数有多个可取值,测试的时候需要对不同参数的值之间的组合进行遍历,这里提供一种参数化的遍历思路。
测试示例接口
- 引入springboot项目,写一个简单的示例接口。调用后返回入参。
@RequestMapping("/test")
@RestController
public class PersonController {
@PostMapping("/add")
public Person save(@RequestBody Person person1){
System.out.println("姓名"+ person1.getName() + "\n" +"年龄" + person1.getAge() + "\n" +"工作" + person1.getJob());
return person1;
}
}
}
import lombok.Data;
@Data
public class Person {
public String name;
public int age;
public String job;
}
- 将程序启动起来,接口入参和出参相同,如下:
{
"name": "sicy",
"age":29,
"job":"test"
}
jmeter实现方案
组合情况
-
假设这三个字段分别可输入
| name | na1 | na2 | na3 | na4 |
| — | — | — | — | — |
| age | 1 | 2 | 3 | 4 |
| job | job1 | job2 | | | -
那么一共需要遍历442的这32中情况
脚本编写
- 考虑在beanshell取样器中使用三个数组,分别存放三个字段的值,使用循环遍历将值通过vars传递给线程组
- 线程里考虑使用三个循环遍历器,分别遍历这三个参数,考虑引入计数器作为下标取不同值
beanshell脚本如下:
//import java.util.Arrays;
//定义name,age和job数组
String[] name = new String []{"na1","na2","na3","na4"};
int[] age = new int []{1, 2, 3, 4};
String[] job = new String []{"job1","job2"};
//分别获取name,age和job的长度
int name_num = name.length;
int age_num = age.length;
int job_num = job.length;
//将name,age和job的长度设置变量传到线程组
vars.put("name_num",name_num.toString());
vars.put("age_num",age_num.toString());
vars.put("job_num",job_num.toString());
//将name,age和job每个值都设置为对应下标的变量:枚举赋值和循环赋值
int i = 0;
//循环方式将值传到线程组中
for(i = 0; i < name_num ; i++){
//定义带下标的变量名。这里必须是(i+1),因为数组下标从1开始,为了好辨认对应关系,这里+1保持一致
String si = "name_"+ (i+1).toString();
//打印变量名称
log.error(si);
//将name每个索引的值赋给线程组里面可用的name_对应下标的变量
vars.put(si, name[i]);
//打印对应下标变量值
log.error(vars.get(si));
}
//age循环赋值,产生age_下标的线程组内变量
int j = 0;
//循环方式将值传到线程组中
for(j = 0; j < age_num ; j++){
//定义带下标的变量名。这里必须是(j+1),因为数组下标从1开始,为了好辨认对应关系,这里+1保持一致
String si = "age_"+ (j+1).toString();
//打印变量名称
log.error(si);
vars.put(si, age[j].toString());
log.error(vars.get(si));
}
int k = 0;
//循环方式将值传到线程组中
for(k = 0; k < job_num ; k++){
//定义带下标的变量名。这里必须是(j+1),因为数组下标从1开始,为了好辨认对应关系,这里+1保持一致
String si = "job_"+ (k+1).toString();
//打印变量名称
log.error(si);
vars.put(si, job[k]);
log.error(vars.get(si));
}
枚举赋值
//vars.put("name_1",name[0]);
//vars.put("name_2",name[1]);
//vars.put("name_3",name[2]);
//vars.put("name_4",name[3]);
//vars.put("age_1",age[0]);
//vars.put("age_2",age[1]);
//vars.put("age_3",age[2]);
//vars.put("age_4",age[3]);
//vars.put("job_1",job[0]);
//vars.put("job_2",job[1]);
- 代码部分分析
//先定义三个数组,把值放进去,如name
String[] name = new String []{"na1","na2","na3","na4"};
//再分别获取这三个数组的长度,使用.length
//使用vars.put将长度传入线程组,作为计数器的max值
//然后通过循环的方式,创建多个线程组变量,每个变量通过下标标记值和数组元素之间的对应关系。
//用到的方法:
.length
vars.put()
log.error()
toString()
线程组如下:
- 引入beanshell取样器,将变量先创建并赋值好
- 使用三个循环遍历器,每个遍历器遍历对应的参数。循环次数等于数组的元素个数
- 每个遍历器中放置计数器,通过下标取每个变量的值
- 请求体的每个参数是变量名_计数器的形式
通过函数助手中的__V方法实现变量的嵌套引用
通过这种方法就可以实现多个参数之间的组合遍历了
- 另外通过用户自定义的变量,也可以达到产生不同下标变量的目的
文章来源:https://blog.csdn.net/sicychen/article/details/132757771
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!