有一个任务,需要频繁发送订单请求,并分析订单请求中有没有存在重复订单号,思路是用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请求,并把获取到的请求的订单信息保存到文件中的更多相关文章

  1. laravel基础课程---6、请求(如何获取当前 HTTP 请求的实例)

    laravel基础课程---6.请求(如何获取当前 HTTP 请求的实例) 一.总结 一句话总结: 依赖注入:通过依赖注入的方式来获取当前 HTTP 请求的实例:public function sto ...

  2. 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    既然已经可以通过 RTSP 获取h264 裸流了.那么通过 FFmpeg 将其保存到文件中怎么做呢? 一.首先RTSP获取 h264 裸流 我们上面两篇文章主要讲的是通过 rtsp://Your ip ...

  3. ecshop 获取某个商品的 所有订单信息 或者销量

    把一下代码放到 lib_main.php 1.统计某个下单商品的人数 function get_goods_ordernum($goods_id){ $sql = "select count ...

  4. 如何使用jMeter发送两个逻辑上相关的HTTP请求

    在前一篇文章使用jMeter构造大量并发的随机HTTP请求里我通过jMeter构造了大量的HTTP GET并发请求,对服务器产生了大量读操作. 现在我有另一个需求场景:假设我开发了一个创建Servic ...

  5. SpringMVC之请求参数的获取方式

    转载出处:https://www.toutiao.com/i6510822190219264516/ SpringMVC之请求参数的获取方式 常见的一个web服务,如何获取请求参数? 一般最常见的请求 ...

  6. python:爬虫获取淘宝/天猫的商品信息

    [需求]输入关键字,如书包,可以搜索出对应商品的信息,包括:商品标题.商品链接.价格范围:且最终的商品信息需要符合:包邮.价格差不会超过某数值 #coding=utf-8 ""&q ...

  7. Jmeter发送Json请求

    jmeter发送的post请求,可以是json请求,和普通的post请求稍微有点区别,那么怎么用jmeter发送json请求呢? 首先要找一个json请求的例子,这个例子是携程网搜索机票, 网址为:h ...

  8. jmeter 发送加密请求 beanshell断言 线程组间传递参数

    原文地址https://www.cnblogs.com/wnfindbug/p/5817038.html 最近在做http加密接口,请求头的uid参数及body的请求json参数都经过加密再发送请求, ...

  9. 通过jmeter发送webservice接口请求

    1.webservice接口地址:http://ip:port/...?wsdl 2.接口数据类型:<cuxGmiChukuRmaTrxV><salesrepId xmlns:xsi ...

随机推荐

  1. kafka基本原理概述——patition与replication分配

    kafka一直在大数据中承受着数据的压力也扮演着对数据维护转换的角色,下面重点介绍kafka大致组成及其partition副本的分配原则: 文章参考:http://www.linkedkeeper.c ...

  2. ZH奶酪:VirtualBox虚拟机与主机ping不通

    6.进入虚拟机的Ubuntu(以下简称VBUbuntu),在VBUbuntu中用ifconfig查看ip地址,在Windows7中用ipconfig查看ip地址. 在VBUbuntu中ping Win ...

  3. 使用Iperf工具测试android系统网络wifi的吞吐量wifithrougput

    http://blog.csdn.net/bingxuebage/article/details/7534655 服务端:./iperf3 -s &客户端:./iperf3 -c 10.15. ...

  4. LoadRunner录制:关联

    一般请求中看到 hash strings, random strings, session ID 这种,就需要动态去获取该内容,这样就需要用到关联. 回放时自动关联 1. 录制脚本并执行. 2. 打开 ...

  5. C++ vector类型要点总结

    概述 C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现. 容器向量也是一个类模板.vector是C++标准模 ...

  6. oracle 之flashback 深入研究。

    oracle 之flashback 深入研究. 今天是2013-08-24,开始进行oracle flashback 内部原理研究,记录一下笔记. SQL> startup ORACLE ins ...

  7. java 设计模式大全

    在线学习网址: http://www.runoob.com/design-pattern/

  8. H5实现的手机摇一摇

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  9. eclispe Missing artifact...

      eclispe Missing artifact... CreateTime--2018年4月24日18:47:21 Author:Marydon 1.情景再现 eclipse pom.xml报错 ...

  10. sybase数据库学习笔记(一)

    sybase的基本框架 sybase数据库由系统数据库.用户数据库.数据库设备和辅助文件组成. 1. 系统数据库 sybase数据库是多个数据库结构的数据库管理系统.分为系统数据库和用户数据库. 系统 ...