由于在对WEB系统进行自动化测试的过程中,经常会由于握手连接断开等原因导致HTTP请求发送失败,如果重新执行一次,会是成功的。在每天的自动化冒烟测试过程中,生成在测试报告存在误报,严重浪费了测试人员确认的时间,因此希望在HTTP请求失败的情况下,重新执行,设置一个重新执行的最大次数,如果尝试了多次都是失败的才认为是真的失败了。

一开始,我只是对单个HTTP request通过While Controller做了失败后重新执行这样的处理,但是要让一个thread group里面所有的HTTP request都这样处理该怎么办呢?由于对每个HTTP request都添加一段那样的代码不太现实,最后,我是这样处理的,将一个thread group里面所有的脚本都放在一个While Controller里面,如果有任意一个HTTP request失败了,就重复执行整个thread group,而且最后一次执行无论成功与否,其前面的几次执行都强行设置成是成功的,这样如果前N-1次执行失败了,第N次执行成功了,出来的测试报告不会有这个HTTP request失败的信息,测试人员就不需要花时间去重新确认了。

1  初始化变量

vars.putObject("INCREMENT", 0);
vars.putObject("ANYSAMPLEFAIL", false);
vars.putObject("ISCONTINUE", true);
vars.putObject("MAXLOOP", 3);

2  控制循环

${__BeanShell((Boolean)vars.getObject("ISCONTINUE"))}

3  对HTTP sample的结果sampleresult进行判断,如果有任何一个失败了,就将标志位ANYSAMPLEFAIL设置为true,以便据此判断整个thread group是否需要重新执行

备注:此BeanShell Assertion将作用于While Controller内每一个HTTP Sampler

import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.assertions.AssertionResult; SampleResult prev_result=ctx.getPreviousResult(); Integer increment = (Integer)vars.getObject("INCREMENT");
Integer maxloop = (Integer)vars.getObject("MAXLOOP"); if (prev_result != null && !prev_result.isSuccessful())
{
vars.putObject("ANYSAMPLEFAIL", true);
if (increment.intValue() < (maxloop.intValue() - 1))
{
prev_result.setSuccessful(true);
}
}

4  对循环次数进行计数,对是否继续重复执行进行判断,对是否存在任何一个samper失败的标志位ANYSAMPLEFAIL进行重置

备注:此BeanShell Samper只在每次的While Controller的最后执行一次

Integer increment = (Integer)vars.getObject("INCREMENT");
increment++;
Boolean requestResult = (Boolean)vars.getObject("ANYSAMPLEFAIL");
Integer maxloop = (Integer)vars.getObject("MAXLOOP");
boolean iscontinue = (increment < maxloop) && requestResult.booleanValue() ; vars.putObject("ISCONTINUE", iscontinue);
vars.putObject("ANYSAMPLEFAIL", false);
vars.putObject("INCREMENT", increment );

这样处理之后,如果最大循环三次,三次都失败了,前两次也不会被标记为失败的,请看结果树:

在上图中,前两次失败的HTTP request虽然其下的断言标记为失败的,但是HTTP request并没有标记为失败的。

如果希望前两次失败的HTTP request连其下的断言都标记为成功的,那么需要这样处理:

import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.assertions.AssertionResult; SampleResult prev_result=ctx.getPreviousResult();
if (prev_result != null && !prev_result.isSuccessful())
{
AssertionResult [] results=prev_result.getAssertionResults();
int size = results.length;
for (int i=0; i< size; i++)
{
AssertionResult result_item = results[i];
if (result_item != null)
{
result_item.setFailure(false);
}
}
}

Jmeter Thread Group中如果存在HTTP request执行失败,就对整个Thread Group重新执行,限定最大执行次数N次的更多相关文章

  1. 多线程(Thread类中的方法线程名称)

    1 package multithread; 2 3 /* 4 * 如何创建一个线程呢? 5 * 6 * 创建线程方式一:继承Thread类. 7 * 8 * 步骤: 9 * 1,定义一个类继承Thr ...

  2. Jmeter组件7. JDBC Connection Configuration & JDBC Request

    Jmeter同样可以测试数据库的性能,通过执行增删改查的语句,以下举的是oracle的例子 Step 1: 下载ojdbc14.jar包放到Jmeter lib包中,在test plan中配置,并且重 ...

  3. Jmeter读取文件中的值《一》

    此篇主要是对应上一章节的呼应,上一篇中讲到将返回值写入文件,这个值如果在下一个接口中用到, 那么我们需要去从文件中读取数据,这是我们该如何操作? 一.测试计划中添加CSV Data Set Confi ...

  4. Jmeter运行过程中如何让Fiddler同时可以抓获到服务器的应答报文

    在默认情况下,Jmeter运行过程中,Fiddler是抓不到对应的应答报文的. 但是,在某些时候,我们希望分析Jmeter执行失败的原因,想了解Jmeter获取到的应答报文是否有问题,就需要同服务器返 ...

  5. 如何使用JMeter从文件中提取数据

    在性能测试方面,重用响应数据至关重要.几乎(如果不是全部!)负载测试场景假设您: 从先前的响应中提取有趣的方面,并在下一个请求中重用它们(也称为相关) 确保实际响应符合预期(又称断言) 因此,如果您是 ...

  6. 【Java_多线程并发编程】基础篇—Thread类中start()和run()方法的区别

    1. start() 和 run()的区别说明 start()方法: 它会启动一个新线程,并将其添加到线程池中,待其获得CPU资源时会执行run()方法,start()不能被重复调用. run()方法 ...

  7. Jmeter从数据库中读取数据

    Jmeter从数据库中读取数据 1.测试计划中添加Mysql Jar包 2.添加线程组 3.添加 jdbc connection configuration 4.添加JDBC Request,从数据库 ...

  8. SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法

    最近angularjs post到后台 400一头雾水 没有任何错误. 最后发现好文,感谢作者 SpringMVC中出现" 400 Bad Request "错误(用@Respon ...

  9. Java线程状态及Thread类中的主要方法

    要想实现多线程,就必须在主线程中创建新的线程对象. 不论什么线程一般具有5种状态,即创建,就绪,执行,堵塞,终止. 创建状态: 在程序中用构造方法创建了一个线程对象后,新的线程对象便处于新建状态,此时 ...

随机推荐

  1. 图解HTTP(1)之WEB及网络基础

    HTTP协议访问Web 当你在浏览器地址栏中键入有效URL(统一资源定位符)相应的网页页面就会展示出来,那么它是如何展示出来的, 首先这存在两个概念 ------客户端.服务器端 客户端(client ...

  2. Go中局部全局变量的区分

    这是可能也许是容易混淆滴,先上1个例子: package main import "fmt" var nickname = "大虾" func main() { ...

  3. 51nod“省选”模测第二场 C 小朋友的笑话(线段树 set)

    题意 题目链接 Sol 直接拿set维护\(li\)连续段.因为set内的区间互不相交,而且每个线段会被至多加入删除一次,所以复杂度是对的. #include<bits/stdc++.h> ...

  4. 控制台程序读取Excel设置角色权限

    摘要: 本人微信公众号:微软动态CRM专家罗勇 ,回复283或者20181118可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me ...

  5. java 线程方法 ---- join()

    class MyThread2 implements Runnable{ @Override public void run() { for (int i = 0; i < 5; i++){ S ...

  6. 算法: 整数中1出现的次数(从1到n整数中1出现的次数)

    问题: 整数中1出现的次数(从1到n整数中1出现的次数) 问题:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有1.10.11 ...

  7. MongoDB副本集及C#程序的连接配置

    1.副本集 高可用是绝大多数数据库管理系统的核心目标之一.如果要想生产数据在发生故障后依然可用,就需要确保为生产数据库多部署一台服务器.MongoDB副本集提供了数据的保护.高可用和灾难恢复的机制. ...

  8. c/c++ 重载运算符 类型转换运算符

    重载运算符 类型转换运算符 问题:能不能把一个类型A的对象a,转换成另一个类型B的对象b呢?? 是可以的.这就必须要用类型A的类型转换运算符(conversion operator) 下面的opera ...

  9. Linux(Deepin 15.9) - MySQL5.7 安装

    Linux(Deepin 15.9) - MySQL5.7 安装 sudo apt install mysql-server/panda sudo apt install mysql-client/p ...

  10. zabbix监控Oracle

    可监控项 使用zabbix监控oracle数据库需要借助第三方的插件,目前使用较多的是orabbix.目前维护到了1.2.3版本.关于oracle自带的监控项目有以下几个: DB Version (i ...