jmeter发送http请求,并把获取到的请求的订单信息保存到⽂件
有⼀个任务,需要频繁发送订单请求,并分析订单请求中有没有存在重复订单号,思路是⽤jmeter 发送http请求,使⽤正则表达式获取到订单号,并把订单号和线程号作为参数提供给java请求,在java请求中把订单号写到包括有线程号的命名⽂件中。完成出来的样⼦是这样的
步骤如下:
1、Jmeter 发送http请求
  1) 右键点击线程组> 添加 > 配置元件 > HTTP信息头管理器,新建HTTP信息头管理器
2) 右键点击线程组> 添加 > Sampler > HTTP请求,新建HTTP请求
2,在下单过后返回部分信息如下:"msg":"下单成功","result":"1","sendCode":"96828628","weektm":"星期⼆,12:00"
右键点击线程组> 添加 > 后置处理器 > 正则表达式提取器,新建正则表达式提取器,获取sendCode 后⾯的值96828628  正则表达式填写:"sendCode":"(\d{8}),这样订单号就保存在变量sendCode中
3、到此,订单号sendCode已经获取到,需要把这个订单号保存到⽂件中,可以采⽤“保存响应到⽂件”  把响应保存到以线程命名的⽂件中,但是不好的是⼀个⽂件只能保存⼀个结果,不能往结果中追加结果,对于后期汇总不⽅便
这⾥使⽤了java请求来处理,按线程⽂件名命名,把同⼀个线程所有的响应结果保存到同⼀个⽂件中,n个线程就保存n个⽂件,这样就使⽤了java请求,java请求需要做的有
  1)新建⼀个java项⽬,在java项⽬⾥⾯新建⼀个java类AppendFile  功能是往⽂件中追加内容,另外⼀个⽅法是重复内容,如果内容有重复,就保存到另外⼀个⽂件中
package editFile;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.HashSet;
import java.util.Set;
public class AppendFile {
public static void main(String[] args) {
AppendFile a = new AppendFile();
/*        a.appendFile("E:\\dd.txt", "222222222222222");
a.appendFile(""E:\\jmeter\\"", "333333333");*/
String allSendCode =    a.read("E:\\jmeter\\");
//    System.out.println(allSendCode);
}
public void appendFile(String fileName, String content) {
try {
/
/ 打开⼀个随机访问⽂件流,按读写⽅式
RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
// ⽂件长度,字节数
long fileLength = randomFile.length();
// 将写⽂件指针移到⽂件尾。
randomFile.seek(fileLength);
randomFile.writeBytes(content + "\r\n");
randomFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 读取⽂件,并判断⽂件中是否有重复内容,如果有重复内容,把重复内容保存到另外⼀个⽂件
* @param filePath
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public String read(String filePath) {
BufferedReader br = null;
String line = null;
StringBuffer buf = new StringBuffer();
Set set = new HashSet();
try {
br = new BufferedReader(new FileReader(filePath));
int lineCount = 0;
while ((line = br.readLine()) != null) {
buf.append(line + "\r\n");
lineCount = lineCount + 1;
if(!set.add(line)){
AppendFile a = new AppendFile();
a.appendFile("E:\\jmeter\\", line);
}
System.out.println(lineCount+":"+line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
br = null;
}
}
}
String();
}
}
  2)java项⽬⾥⾯添加java请求类WriteResult ,作⽤是从jmeter获取订单号和线程号,并使⽤订单号和线程号写⼈⽂件,同时jmeter 性能测试的java请求也是这样来实现的,按照格式在runTest 中做各种请求。
package editFile;
import org.fig.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class WriteResult implements JavaSamplerClient {
private SampleResult results;
private String senCode;
private String threadNumber;时间正则表达式java
// 设置从jmeter传⼊参数
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("senCode", "0");// 设置senCode参数
params.addArgument("threadNumber", "0");// 设置threadNumber
return params;
}
// 初始化⽅法,性能测试时只执⾏⼀次
public void setupTest(JavaSamplerContext arg0) {
}
// 重复执⾏测试的地⽅
public SampleResult runTest(JavaSamplerContext arg0) {
senCode = Parameter("senCode"); // 获取jmeter传⼊的参数值,
threadNumber = Parameter("threadNumber"); // 获取jmeter传⼊的参数值,
results = new SampleResult();
results.sampleStart();// jmeter 开始统计响应时间标记
AppendFile.appendFile("E:\\jmeter\\"+threadNumber+".txt", senCode);
if(senCode.length() ==8){
results.setSuccessful(true);
results.setResponseData("threadNumber:"+threadNumber+"|senCode:"+senCode, null);
}else{
results.setSuccessful(false);
results.setResponseData("threadNumber:"+threadNumber+"|没有获取到验证码    ", null);
}
results.sampleEnd();// jmeter 结束统计响应时间标记
return results;
}
// 结束⽅法,实际运⾏时每个线程仅执⾏⼀次,在测试⽅法运⾏结束后执⾏
public void teardownTest(JavaSamplerContext arg0) {
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
把java项⽬⽂件导出jar包,放在jmeter 的lib/ext ⽂件夹中
打开jmeter添加⼀个jmeter 的java请求,右键点击线程组> 添加 > Sampler > java请求,选中测试类,会⾃动显⽰2个参数 sendCode 和threadNumber(这2个参数是在java请求类的的⽅法中设置:public Arguments getDefaultParameters()
sendCode  = ${sendcode}
threadNumber = ${__threadNum}
使⽤3个线程执⾏多次,结果如下:
另外使⽤bean shell  也能保存⽂件,右键点击线程组> 添加 > 后置处理器 > BeanShell PostProcessor 新建beanshell,需要在bean shell中写代码
import editFile.*;
import org.apache.jmeter.threads.JMeterContextService;
int  threadNumber = NumberOfThreads();
String sendCode = ("sendcode"); //把获取的sendcode 变成bean shell变量值
AppendFile.appendFile("E:\\jmeter\\result"+threadNumber+".txt", sendCode);
System.out.println("finished");
但是获取的线程号代码都是1,因此所有的订单号都保存在同⼀个⽂件中,不知道这样会不会都在写同⼀个⽂件导致⽂件不全,要测试下才知道

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。