TestNG测试框架的使用-Case运行失败后重试

本文详细介绍了如何使用Log4j2进行日志配置,包括Maven依赖导入、log4j2.xml配置以及日志文件的滚动策略。同时,深入探讨了如何利用TestNG的监听器实现测试用例失败后的自动重试,并通过配置testng.xml文件整合所有设置。
摘要由CSDN通过智能技术生成

参考这一片博客:https://blog.csdn.net/hujyhfwfh2/article/details/84950119

我们今天在它的基础上进行改造

1:导入依赖

需要导入log4j2的Maven依赖

		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.11.1</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-api</artifactId>
			<version>2.11.1</version>
		</dependency>

2:创建log4j2的一些列操作

参考:https://blog.csdn.net/hujyhfwfh2/article/details/84961624

我们现在将日志记录在单独的文件夹下

  • log4j2.xml的配置
  • 注意:log4j2这个文件夹一定要build path到source目录下哦
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
	<!-- 日志输出的位置 -->
	<Properties>
		<!-- 保存在当前路径的logs文件夹下 -->
		<Property name="basePath">./logs</Property>
	</Properties>
	<!-- 日志输出的位置 -->
	<Appenders>
		<!-- filePattern表示滚动一天记录日志命名 -->
		<RollingFile name="file" fileName="${basePath}/test.log"
			filePattern="${basePath}/test-%d{yyyy-MM-dd}.log">
			<PatternLayout charset="UTF-8" pattern="%d{YYY-MM-dd-HH:mm:ss.SSS} %-5level %c{1} -%msg%n" />
			<Policies>
				<!-- interval="1"基于时间触发RollingFile 表示滚动一天记录日志 -->
				<TimeBasedTriggeringPolicy interval="1"
					modulate="true" />
				<SizeBasedTriggeringPolicy size="10 MB" />
			</Policies>
		</RollingFile>
		<!-- 日志在控制台输出用 Console -->
		<Console name="ConsoleOut">
			<!-- 日志显示的风格 -->
			<PatternLayout pattern="%d{YYY-MM-dd-HH:mm:ss。SSS} %-5level %c{1} -%msg%n" />
		</Console>
	</Appenders>
	<Loggers>
		<!-- 日志输出级别为info -->
		<Root level="info">
			<!-- 前面有定义RollingFile的名称为file -->
			<AppenderRef ref="file" />
		</Root>
	</Loggers>
</Configuration>

3:建立监听器

  • RetryListener 
package Listeners;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
import org.testng.Reporter;

/**
 * case运行失败后再次运行
 * */

public class RetryListener implements IRetryAnalyzer {
	
    private static Logger logger=LogManager.getLogger(RetryListener.class.getName());
    private int initReTryNum=1;
    private int maxReTryNum=3;
    
    @Override
    public boolean retry(ITestResult iTestResult) {
        if(initReTryNum<=maxReTryNum){
        	//组装error message
            String message="Method<"+iTestResult.getName()+">Running failed the "+initReTryNum+"th Retry";
            logger.error(message);
            Reporter.setCurrentTestResult(iTestResult);
            Reporter.log(message);
            initReTryNum++;
            return true;
        }
        
        return false;
    }
}
  • OverrideIAnnotationTransformer
  • 如果没有OverrideIAnnotationTransformer 程序会抱错 所以这个是必须要有的
  • TestNG.xml中也是把OverrideIAnnotationTransformer 配置到listeners中
package Listeners;

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

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

public class OverrideIAnnotationTransformer implements IAnnotationTransformer{

	@Override
	public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {
		
		IRetryAnalyzer iRetryAnalyzer= iTestAnnotation.getRetryAnalyzer();
        if(iRetryAnalyzer==null){
            iTestAnnotation.setRetryAnalyzer(RetryListener.class);
        }	
	}
}

4:配置testng.xml

需要将它配置到listeners下

<listener class-name="Listeners.OverrideIAnnotationTransformer"></listener>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
	<listeners>
		<listener class-name="Listeners.OverrideIAnnotationTransformer"></listener>
		<listener class-name="Listeners.ExtentTestNGIReporterListener"></listener>
	</listeners>
	<test name="Test1">
		<classes>
			<!-- Class需要拆开 不然没法写 methods-->
			<class name="TestCase.case1">
				<methods>
					<include name="testCase1"></include>
				</methods>
			</class>
		</classes>
	</test> <!-- Test -->
	<test name="Test2">
		<classes>
			<!-- Class需要拆开 不然没法写 methods-->
			<class name="TestCase.case1">
				<methods>
					<include name="testCase2"></include>
				</methods>
			</class>
		</classes>
	</test> <!-- Test -->
	<test name="Test3">
		<classes>
			<!-- Class需要拆开 不然没法写 methods-->
			<class name="TestCase.case1">
				<methods>
					<include name="testCase3"></include>
				</methods>
			</class>
		</classes>
	</test> <!-- Test -->
</suite> <!-- Suite -->

6:运行testng.xml后的结果

  • 控制台输出:我们看到testcase2有被多次执行

  • 日志输出

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值