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 ...
随机推荐
- ListView GridViewColumn.CellTemplate
<ListView.View> <GridView> <GridViewColumn Header="Meaningful Use Objectives&quo ...
- sublime同步侧边栏与窗体的颜色
Ctrl+Shift+P -> install -> 搜索安装包 SyncedSidebarBg,自动同步侧边栏底色为编辑窗口底色. P.S. 有时改完后侧边栏颜色没变化,不知什么原因,打 ...
- perl install-module.pl DateTime 执行无效问题的解决
运行./checksetup.pl,总说DateTime模块需要安装,但是执行提示的perl install-module.pl DateTime 多次也还是说DateTime模块需要安装. 在神奇的 ...
- 空格在Html中的表示方法( 含义)
转自:http://www.cnblogs.com/hailexuexi/archive/2010/07/25/1784611.html 在web开发经常会遇到如: 这样的字符.它其实是Html将 ...
- DevExpress学习01——下载与安装
记得刚接触编程时,虽然实现了功能,但用户界面十分丑陋,老师叫我们美化一下界面,不要千篇一律,当时觉得能够写出来功能就洋洋得意了,不觉得界面丑陋.后来,在程序比赛中,我接触了一种第三方控件,它可以快速实 ...
- 使用Yii 1.1框架搭建第一个web应用程序
我已经安装好了WampServer,web项目根目录是 D:\wamp\www. 1.下载Yii 1.1的源码 yii-1.1.14.f0fee9.tar.gz: 2.解压源码包,放在web项目的根目 ...
- jdbc详解(一)
JDBC简介 l 数据库驱动 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC l JDBC 全称为: Java Data Base Connectivity ...
- client高性能组件化框架React简单介绍、特点、环境搭建及经常使用语法
[本文源址:http://blog.csdn.net/q1056843325/article/details/54729657 转载请加入该地址] 明天就是除夕了 预祝大家新春快乐 [ ]~( ̄▽ ̄) ...
- VIM经常使用操作
VIM使用 移动命令 按键 说明 h 左 l 右(小写L) j 下 k 上 w 移动到下一个单词 b 移动到上一个单词 进入插入模式 命令 说明 i 在当前光标处进行编辑 I 在行首插入 A 在行末插 ...
- js 深冻结 与 浅冻结 Object.freeze
1.深冻结 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ...