失败重跑的第二种方法

  1. 接口IRetryAnallyzer
    该接口的作用是提供去实现能够让用例运行失败重跑的设置。实现该接口必须要实现retry(ITestResult result)这个方法。返回值类型是布尔型,如果返回是True,那么就执行失败重跑,返回是false,就不重跑。参数result是当前运行的测试用例的结果状态。
  2. 接口IAnnotationTransformer
    该接口的作用是在TestNG执行过程中动态改变测试类中Annotation的参数,当前这个接口主要是针对@Test注释。IAnnotationTransformer监听器接口只有一个方法:transform(ITestAnnotation annotation, Class testClass,
    Constructor testConstructor, Method testMethod).下面我们写的几个类方法都是来源网上资料,都实现了上面提到的两个接口。

第一个Java文件,MyRetry.java实现了IRetryAnalyzer接口,代码如下

package com.course.testng;

import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;

public class MyRetry implements IRetryAnalyzer{
	//设置当前失败执行次数
	private int retryCount = 1;
	//设置最大失败执行测试
	private static int maxRetryCount = 3;
	
	@Override
	public boolean retry(ITestResult iTestResult) {
		if(retryCount < maxRetryCount) {
			retryCount++;
			return true;
		}
		return false;
	}
}

第二个Java文件,MyRetryListener.java实现了IAnnotationTransformer接口,代码如下

package com.course.testng;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

import org.testng.IRetryAnalyzer;
import org.testng.annotations.ITestAnnotation;
import org.testng.IAnnotationTransformer;

public class MyRetryListener implements IAnnotationTransformer{
	
	@Override
	public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {
		
		IRetryAnalyzer myRetry = iTestAnnotation.getRetryAnalyzer();
		if (myRetry == null) {
			iTestAnnotation.setRetryAnalyzer(MyRetry.class);
		}
	}
}

最后一段代码的意思就是对当前运行的用例先通过getRetryAnalyzer()获取重跑的次数的属性,如果属性为空,那么就设置我们自己设置的重跑次数(本文第一个类名称.class)

第三个java文件,写一个测试用例。

package com.course.testng;

import org.testng.Assert;
import org.testng.annotations.Test;

public class ReRunFailedTestCase {
	
	public class reRunFailedTestCase{
		
		@Test
		public void test01() {
			System.out.println("test01");
		}
		
		@Test
		public void test02() {
			Assert.assertTrue(10==11);
			System.out.println("test02");
		}
		
		@Test
		public void test03() {
			System.out.println("test03");
		}
	}
}

下面配置testng.xml,添加上监听。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Default Suite">
	<listeners>
		<listener class-name= "com.course.testng.MyRetryListener"/>
	</listeners>
	
	<test name="Test_learn">
	
		<classes>
			<class name="com.course.testng.ReRunFailedTestCase"/>
		</classes>
	</test>
</suite>

运行这个testng.xml文件,会发现执行顺序是这样的,执行test01一次,test02三次,test03一次。注意这里,执行了三次失败的用例,实际上算重跑了两次。
在这里插入图片描述

运行这个testng.xml文件,会发现执行顺序是这样的,执行test01一次,test02三次,test03一次。注意这里,执行了三次失败的用例,实际上算重跑了两次。
以下还有一种场景,例如我们经常跑测试用例,会发现某一些模块的用例是有出现失败的可能性情况比较多。例如我想监听登录的用例,然后让登录用例执行多次。这里我们把本篇文章的第二个类改下,第一个类抛弃,其他的都不变。第二个类改变如下。
在这里插入图片描述
InvocationCount的作用就是设置一个方法调用的总次数。上面我把test03比作是登录的用例,我根据平时的经验判断,这个登录可能会出现问题,这里我设置调用次数为3次,也就是总共跑这个用例参数,运行下testNG.xml,会看到test03方法里的打印语句执行了三次
失败重跑的总结:
通过对比这篇的实现方法和前面一篇我介绍的执行testng-failed.xml的方法,我还是比较喜欢第一种方法。由于我们经常对自己项目的用例执行一次大概需要多长时间,所以我们完全可以采用第一种方法。这样的好处就是,我不用写监听,每次只管跑用例,设置一个足够让用例完成的时间,然后再把执行testng-failed.xml文件,这样就默认把全部失败的用例给再次执行了一遍。至于设置执行次数的问题,个人觉得失败一次和失败两次没有太大区别,跑第五次失败的可能性还是很大,再说设置一个for循环执行三遍testng-failed.xml也可以达到这个目的。


猜你喜欢

转载自blog.csdn.net/weixin_42884654/article/details/82970506