有一个任务,需要频繁发送订单请求,并分析订单请求中有没有存在重复订单号,思路是用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\\sameText.txt"", "333333333");*/ ???String allSendCode = ????a.read("E:\\jmeter\\sameText.txt");// ???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\\sameTextRepeat.txt", line); ???????????????????????????????????} ???????????????System.out.println(lineCount+":"+line); ???????????} ???????} catch (Exception e) { ???????????e.printStackTrace(); ???????} finally { ???????????if (br != null) { ???????????????try { ???????????????????br.close(); ???????????????} catch (IOException e) { ???????????????????br = null; ???????????????} ???????????} ???????} ???????return buf.toString(); ???}}
2)java项目里面添加java请求类WriteResult ,作用是从jmeter获取订单号和线程号,并使用订单号和线程号 写人文件,同时jmeter 性能测试的java请求也是这样来实现的,按照格式在runTest 中做各种请求。
package editFile;import org.apache.jmeter.config.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; ???????// 设置从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 = arg0.getParameter("senCode"); // 获取jmeter传入的参数值, ???????threadNumber = arg0.getParameter("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 = JMeterContextService.getNumberOfThreads();String sendCode = vars.get("sendcode"); //把获取的sendcode 变成bean shell变量值AppendFile.appendFile("E:\\jmeter\\result"+threadNumber+".txt", sendCode);System.out.println("finished");
但是 获取的线程号代码都是1,因此所有的订单号都保存在同一个文件中,不知道这样会不会都在写同一个文件导致文件不全,要测试下才知道
jmeter 发送http请求,并把获取到的请求的订单信息保存到文件中(转)
原文地址:https://www.cnblogs.com/a00ium/p/10360384.html