参考这一片博客: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有被多次执行
- 日志输出