1.问题背景
在压测的过程中发现有将一组id作为参数的接口请求。这些id存储在数据库中,需要随机挑出几行值,用逗号拼接起来组成接口的一个参数。
例如数据库字段:
id |
---|
1 |
2 |
3 |
4 |
接口形式:
http://xxxx/getinfo?ids=1,2,4
2.解决方案
其实jmeter可以从数据库里取数据然后放到参数中,但这样做如果数据库服务器性能不佳,语句写的稍有问题种种可能反而会成为测试瓶颈,达不到想要的QPS。
于是就像把数据导出到csv里然后jmeter用一个变量将所有id全部缓存起来,再随机读取其中的几行拼接起来。
也就是在jmeter中放入一个全局变量,每次请求从变量里拿值
(目前仅在一个Thread Group下进行了测试)
主要就是写一个BeanShell PreProcessor 读取csv数据并设置成参数 供请求使用
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.io.FileUtils;
if(props.get("items") == null){
List items = FileUtils.readLines(new File("C:\\Users\\Administrator\\Documents\\work\\jmeter\\uids.csv"));
props.put("items", items);
}
List items = (List)props.get("items");
String uids = "";
for(int i = 0;i<=60;i++){
Random rnd = new Random();
int index = rnd.nextInt(items.size()-1)+1;
uids += items.get(index);
if(i < 60){
uids+=",";
}
}
vars.put("uids",uids);
其中唯一一个注意的点就是props这个变量是全局的,这里设置了全局变量items,所有的BeanShell都可以获取到它,应该不仅限于一个ThreadGroup,如果多人编写起名不要太随意,以免冲突。
最后再把BeanShell里设置的uids参数设置到请求中
设置参数