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\\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请求,并把获取到的请求的订单信息保存到文件中的更多相关文章
- laravel基础课程---6、请求(如何获取当前 HTTP 请求的实例)
laravel基础课程---6.请求(如何获取当前 HTTP 请求的实例) 一.总结 一句话总结: 依赖注入:通过依赖注入的方式来获取当前 HTTP 请求的实例:public function sto ...
- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中
既然已经可以通过 RTSP 获取h264 裸流了.那么通过 FFmpeg 将其保存到文件中怎么做呢? 一.首先RTSP获取 h264 裸流 我们上面两篇文章主要讲的是通过 rtsp://Your ip ...
- ecshop 获取某个商品的 所有订单信息 或者销量
把一下代码放到 lib_main.php 1.统计某个下单商品的人数 function get_goods_ordernum($goods_id){ $sql = "select count ...
- 如何使用jMeter发送两个逻辑上相关的HTTP请求
在前一篇文章使用jMeter构造大量并发的随机HTTP请求里我通过jMeter构造了大量的HTTP GET并发请求,对服务器产生了大量读操作. 现在我有另一个需求场景:假设我开发了一个创建Servic ...
- SpringMVC之请求参数的获取方式
转载出处:https://www.toutiao.com/i6510822190219264516/ SpringMVC之请求参数的获取方式 常见的一个web服务,如何获取请求参数? 一般最常见的请求 ...
- python:爬虫获取淘宝/天猫的商品信息
[需求]输入关键字,如书包,可以搜索出对应商品的信息,包括:商品标题.商品链接.价格范围:且最终的商品信息需要符合:包邮.价格差不会超过某数值 #coding=utf-8 ""&q ...
- Jmeter发送Json请求
jmeter发送的post请求,可以是json请求,和普通的post请求稍微有点区别,那么怎么用jmeter发送json请求呢? 首先要找一个json请求的例子,这个例子是携程网搜索机票, 网址为:h ...
- jmeter 发送加密请求 beanshell断言 线程组间传递参数
原文地址https://www.cnblogs.com/wnfindbug/p/5817038.html 最近在做http加密接口,请求头的uid参数及body的请求json参数都经过加密再发送请求, ...
- 通过jmeter发送webservice接口请求
1.webservice接口地址:http://ip:port/...?wsdl 2.接口数据类型:<cuxGmiChukuRmaTrxV><salesrepId xmlns:xsi ...
随机推荐
- angular6 NgModule中定义模块module
用这个@NgModule()这个decorator ,放在一个class的上面,这个class一个一个module了 @NgModule() 里面的参数是一个对象,用来配置的,声明这个module里面 ...
- 我对REST的理解
1:rest的由来 REST即表述性状态传递(英文:Representational State Transfer,简称REST) 通俗点说:资源在网络中以某种表现形式进行状态转移. 源于REST之父 ...
- 【C/C++】:用C实现输出日期的阴历日子
前言 输出阴历一直是个老大难的问题.由于阴历日子没有规律.所以这里须要做的就是通过打表的算法做到输出阴历日子,可是非常多人都不太了解原理,我这里就给大家送上了一个福利.把自己做好的基于打表的阴历的日子 ...
- [Angular] Use ngx-build-plus to compile Angular Elements
We can treat Angular Element as each standlone lib and compile each Angular element spreatly. Tool w ...
- Android 四大组件之 Activity(二)
1.综述 Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满 ...
- Subversion快速入门教程
如何快速建立Subversion服务器,并且在项目中使用起来,这是大家最关心的问题,与CVS相比,Subversion有更多的选择,也更加的容易,几个命令就可以建立一套服务器环境,可以使用起来,这里配 ...
- Java从零开始学四十一(反射简述二)
一.实例化Class类对象 实例化Class类对象的方法有三种: 第一种:通过forName()方法 第二种:类.class 第三种:对象.getClass() 二.Class类的常用方法 No. 方 ...
- IDC 知识库
http://www.51idc.com/help/supportHelp.html Host key verification failed解决IIS错误信息--另一个程序正在使用此文件,进程无法访 ...
- 30、Java中Set集合之HashSet、TreeSet和EnumSet
Set集合是Collection的子集,Set集合与Collection基本相同,没有提供任何额外的方法,只是Set不允许包含重复的元素. Set集合3个实现类:HashSet.TreeSet.Enu ...
- QQ概念版(WPF制作)
984 QQ概念版 编辑 QQ 概念版是腾讯首款NUI(自然用户交互)产品,全面实现了多点触摸操作.是腾讯利用微软最新一代的客户端展现层技术--WPF,打造的IM产品. 中文名 QQ 概念版 游戏 ...