TestNg提供了失败重试接口IRetryAnalyzer,需要实现retry方法:

package com.shunhe.testngprac.retry;

import org.testng.IRetryAnalyzer;
import org.testng.ITestResult; /**
* 设置testng用例失败重试次数
* Created by shunhe on 2019/2/13.
*/
public class MyRetryAnalyzer implements IRetryAnalyzer { private int retryCount = 0;
private final int MAX_RETRY_COUNT = 3; @Override
public boolean retry(ITestResult iTestResult) {
if (retryCount < MAX_RETRY_COUNT) {
retryCount++;
return true;
}
return false;
}
}

TestNG中的@Test注解包含参数retryAnalyzer,可以在注解中给定重试分析器,如下:

    @Test(retryAnalyzer = MyRetryAnalyzer.class)
public void test01() {
System.out.println("test01");
Assert.assertTrue(false, "test failed");
}

TestNg程序化调用情况

需要实现接口IAnnotationTransformer中的transform方法,对未设置retryanalyzer的@test方法添加响应的retryanalyzer:

package com.shunhe.testngprac.retry;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method; import org.testng.IAnnotationTransformer;
import org.testng.IRetryAnalyzer;
import org.testng.annotations.ITestAnnotation; /**
* 添加重试监听器,如果测试方法中未添加重试分析器,则默认添加MyRetryAnalyzer作为重试分析器
* Created by shunhe on 2019/2/13.
*/
public class MyRetryListener implements IAnnotationTransformer {
@Override
public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {
IRetryAnalyzer retryAnalyzer = iTestAnnotation.getRetryAnalyzer();
if (null == retryAnalyzer) {
iTestAnnotation.setRetryAnalyzer(MyRetryAnalyzer.class);
}
}
}

在构造tesng执行对象时,添加响应的listener

package com.shunhe.testngprac.controller;

import java.util.ArrayList;
import java.util.List;
import org.testng.TestNG;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlSuite.ParallelMode;
import org.testng.xml.XmlTest; /**
* Created by shunhe on 2019/2/13.
*/
public class TestNgController { /**
* TestNG测试程序化调用
*/
public void executeTests() {
//构建testng.xml内存对象
try {
List<XmlSuite> suites = new ArrayList<XmlSuite>();
XmlSuite suite = new XmlSuite();
suite.setName("TestNG Retry Test");
//添加失败重试
List<String> suiteListeners = new ArrayList<String>();
//添加重试监听器
suiteListeners.add("com.shunhe.testngprac.retry.MyRetryListener");
suite.setListeners(suiteListeners); //类级别的并发
suite.setParallel(ParallelMode.CLASSES);
suites.add(suite); XmlTest test = new XmlTest(suite);
test.setName("TestNG Retry Test"); //添加将要执行的用例
List<XmlClass> classes = new ArrayList<XmlClass>(); XmlClass testClass = new XmlClass("com.shunhe.testngprac.tests.DemoTest01"); classes.add(testClass); test.setXmlClasses(classes); //TestNG程序化调用
TestNG testNG = new TestNG();
testNG.setXmlSuites(suites);
testNG.run(); } catch (Exception e) {
System.out.println("测试用例执行失败: " + e.getMessage());
e.printStackTrace();
} } public static void main(String[] args){
TestNgController testNgController = new TestNgController();
testNgController.executeTests();
}
}

TestNg失败重试机制的更多相关文章

  1. 配置 Spring Batch 批处理失败重试机制

    1. 引言 默认情况下,Spring批处理作业在执行过程中出现任何错误都会失败.然而有些时候,为了提高应用程序的弹性,我们就需要处理这类间歇性的故障. 在这篇短文中,我们就来一起探讨 如何在Sprin ...

  2. python unittest case运行失败重试

    因为使用unittest进行管理case的运行.有时case因为偶然因素,会随机的失败.通过重试机制能够补充保持case的稳定性.查阅资料后发现,python的unittest自身无失败重试机制,可以 ...

  3. testng testcase失败重试

    简单介绍 需求场景:测试移动端应用,常会因为点击失效.网络延迟大等原因导致测试脚本失败.这时,需要自动重新运行失败的脚本,直到脚本成功通过或者到达限定重试次数. 解决方案:实现testng的IRetr ...

  4. 精讲RestTemplate第8篇-请求失败自动重试机制

    本文是精讲RestTemplate第8篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层H ...

  5. 精讲响应式WebClient第6篇-请求失败自动重试机制,强烈建议你看一看

    本文是精讲响应式WebClient第6篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...

  6. TestNg失败重跑—解决使用 dataProvider 参数化用例次数冲突问题

    问题背景 在使用 testng 执行 UI 自动化用例时,由于 UI自动化的不稳定性,我们在测试的时候,往往会加上失败重跑机制.在不使用 @DataProvider 提供用例参数化时,是不会有什么问题 ...

  7. testng 失败自动截图

    testng执行case failed ,testng Listener会捕获执行失败,如果要实现失败自动截图,需要重写Listener的onTestFailure方法 那么首先新建一个Listene ...

  8. ENode 1.0 - 消息的重试机制的设计思路

    项目开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架中消息队列的设计思路,本文介绍一下enode框架中关系消息的重试机制的设计思路 ...

  9. 【Dubbo 源码解析】07_Dubbo 重试机制

    Dubbo 重试机制 通过前面 Dubbo 服务发现&引用 的分析,我们知道,Dubbo 的重试机制是通过 com.alibaba.dubbo.rpc.cluster.support.Fail ...

随机推荐

  1. 设计模式之工厂模式(c++)

    问题描述 在面向对象系统设计中经常可以遇到以下的两类问题:1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口.这样我们可以通过声明 ...

  2. linux 下端口close_wait 过多问题

    情景描述:系统产生大量“Too many open files” 原因分析:在服务器与客户端通信过程中,因服务器发生了socket未关导致的closed_wait发生,致使监听port打开的句柄数到了 ...

  3. gitbook 简单使用

    gitbook 简单使用 之前由于公司培训过使用 gitbook,当时也没有进行安装使用.当时就感觉就是 markdown 语法,加上我本来就是使用 markdown 进行写博客之类.再加上这个东西本 ...

  4. html 佈局

    html常見佈局方式有以下幾種: 1.使用div的html 利用div可以為html實現多列佈局. 2.使用html5的網站佈局, 利用html新增的header.footer.nav.section ...

  5. BZOJ3862Little Devil I——树链剖分+线段树

    题目大意: 给一棵树,每条边可能是黑色或白色(起始都是白色),有三种操作: 1.将u到v路径上所有边颜色翻转(黑->白,白->黑) 2.将只有一个点在u到v路径上的边颜色翻转 3.查询u到 ...

  6. P2157 [SDOI2009]学校食堂

    题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...

  7. itexpdf同一个段落不同文字,如何设置不同的格式

    Java使用itexpdf生成PDF,正常情况下,新建一个段落Paragraph,然后可以给段落添加一个格式BaseFont Paragraph paragraphBlue = new Paragra ...

  8. 沉迷Link-Cut tree无法自拔之:[BZOJ2049]洞穴勘探(蒟蒻的LCT板子)

    来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 最近学了一波 \(LCT\) , 于是怒刷 \(LCT\) 合集...... $ $ 学的时候借鉴了 Clove ...

  9. luogu2024 食物链 (并查集)

    把一个点拆成三个,分别对应它的同类.它的猎物和它的天敌,这样的话(以下的相等都是并查集意义上的): 如果令a,b同类,那么a的猎物不能是b的同类,a的天敌不能是b的同类 如果令a吃b,那么a的同类不能 ...

  10. ThinkPHP5 隐藏index.php问题

    隐藏index.php 可以去掉URL地址里面的入口文件index.php,但是需要额外配置WEB服务器的重写规则. 以Apache为例,需要在入口文件的同级添加.htaccess文件(官方默认自带了 ...