由于在对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. 实时显示数据 SignalR 及时消息提醒( 立即向其推送内容)

    实时显示数据  SignalR 及时消息提醒( 立即向其推送内容) http://www.cnblogs.com/Leo_wl/p/5634910.html  <!--Reference the ...

  2. Request.Params

    在开发中有时会用到Request.Params["id"]来获取参数,那么到底是从什么地方接收参数呢? 一般情况下,有三种方式进行参数传递1.GET 方式,通过url传递,如?id ...

  3. 2016年Scrum状态调查报告

    背景 Scrum是一种迭代式增量软件开发过程,通常用于敏捷软件开发,包括一系列实践和预定义角色的过程骨架.Scrum由Jeff Sutherland和Ken Schwaber在一次IBM项目合作中研究 ...

  4. WordPress在Centos下Apache设置伪静态方法

    1.设置httpd.conf文件 1.1 添加或取消注释这段代码 LoadModule rewrite_module modules/mod_rewrite.so 1.2 运行httpd -M查看这个 ...

  5. MongoDB初了解——用户权限

    本文所述MongoDB版本为4.0.5,笔者对MongoDB刚接触,对各个版本的MongoDB不甚了解,本文不对该版本的MongoDB做特性介绍,所涉及命令也许对其余版本不适用. 因为目前有一个试验性 ...

  6. 2019前端面试题汇总(主要为Vue)

    摘要: 经典面试题. 原文:2019前端面试题汇总(主要为Vue) 作者:前端小酱 Fundebug经授权转载,版权归原作者所有. 毕业之后就在一直合肥小公司工作,没有老司机.没有技术氛围,在技术的道 ...

  7. set用法小结

    set本质上是一棵红黑树,用法也就那么几个,插入删除lowerbound,再就是迭代器之类的 基本用法 begin()--返回指向第一个元素的迭代器 #include<cstdio> #i ...

  8. 总结:当静态路由和BGP同时存在时路由优选BGP的两种方法

    结论: 方法一.配置BGP协议的外部优先级比静态路由的优先级高,优选BGP. 优点:配置简单. 缺点:全局生效,如果用户有针对某个静态路由想提高优先级,不受动态路由影响,则针对每个静态路由都需要人为提 ...

  9. MongoDB在Linux下常用优化设置

    MongoDB在Linux下常用优化设置 以下是一些MongoDB推荐的常用优化设置.在生产环境下选取合适的参数值,例如预读值和默认文件描述符数目等,会对系统性能有很大的影响. 1.关闭数据库文件的 ...

  10. 亿级流量场景下,大型缓存架构设计实现【1】---redis篇

    *****************开篇介绍**************** -------------------------------------------------------------- ...