【框架】Testng用例失败自动重跑(五)

时间:2023-03-09 19:24:22
【框架】Testng用例失败自动重跑(五)

arrow是testng的一个扩展插件,参考arrow的源代码

1.新建一个工程,结果如图:

【框架】Testng用例失败自动重跑(五)

2.RetryListener.java的代码

package com.netease.qa.testng;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.testng.IAnnotationTransformer;
import org.testng.IRetryAnalyzer;
import org.testng.annotations.ITestAnnotation; /**
* RetryListener for each test method.
*/
public class RetryListener implements IAnnotationTransformer {
@Override
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
System.out.println("transform");
IRetryAnalyzer retry = annotation.getRetryAnalyzer();
if (retry == null) {
annotation.setRetryAnalyzer(TestngRetry.class);
}
}
}

3.TestngRetry.java的代码

package com.netease.qa.testng;

import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
import org.testng.Reporter; import com.netease.qa.testng.utils.ConfigReader; /**
* TestNG retry Analyzer.*
*/
public class TestngRetry implements IRetryAnalyzer {
private int retryCount = 1;
private static int maxRetryCount; static {
ConfigReader config = ConfigReader.getInstance();
maxRetryCount = config.getRetryCount();
} @Override
public boolean retry(ITestResult result) {
System.out.println("retry");
if (retryCount <= maxRetryCount) {
Reporter.setCurrentTestResult(result);
retryCount++;
return true;
}
return false;
} public static int getMaxRetryCount() {
return maxRetryCount;
} public int getRetryCount() {
return retryCount;
} }

4.ConfigReader.java的代码

package com.netease.qa.testng.utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties; /**
* Read config.properties file. Get the retrycount,default is 0 if not defined
*/
public class ConfigReader {
private static ConfigReader cr;
private int retryCount = 0;
private String sourceCodeDir = "src";
private String sourceCodeEncoding = "UTF-8"; private static final String RETRYCOUNT = "retrycount";
private static final String SOURCEDIR = "sourcecodedir";
private static final String SOURCEENCODING = "sourcecodeencoding";
private static final String CONFIGFILE = "config.properties"; private ConfigReader() {
readConfig(CONFIGFILE);
} public static ConfigReader getInstance() {
if (cr == null) {
cr = new ConfigReader();
}
return cr;
} private void readConfig(String fileName) {
Properties properties = getConfig(fileName);
if (properties != null) {
String sRetryCount = null; Enumeration<?> en = properties.propertyNames();
while (en.hasMoreElements()) {
String key = (String) en.nextElement();
if (key.toLowerCase().equals(RETRYCOUNT)) {
sRetryCount = properties.getProperty(key);
}
if (key.toLowerCase().equals(SOURCEDIR)) {
sourceCodeDir = properties.getProperty(key);
}
if (key.toLowerCase().equals(SOURCEENCODING)) {
sourceCodeEncoding = properties.getProperty(key);
}
}
if (sRetryCount != null) {
sRetryCount = sRetryCount.trim();
try {
retryCount = Integer.parseInt(sRetryCount);
} catch (final NumberFormatException e) {
throw new NumberFormatException(
"Parse " + RETRYCOUNT + " [" + sRetryCount + "] from String to Int Exception");
}
}
}
} public int getRetryCount() {
return retryCount;
} public String getSourceCodeDir() {
return this.sourceCodeDir;
} public String getSrouceCodeEncoding() {
return this.sourceCodeEncoding;
} /**
*
* @param propertyFileName
*
* @return
*/
private Properties getConfig(String propertyFileName) {
Properties properties = new Properties();
try {
properties.load(new FileInputStream(propertyFileName));
} catch (FileNotFoundException e) {
properties = null;
} catch (IOException e) {
properties = null;
}
return properties;
}
}

5.BaiduTest.java的代码

package com.retry;

import org.testng.annotations.Test;
import static org.testng.Assert.*; public class BaiduTest {
@Test
public void testFalse() {
assertTrue(false);
}
}

6.config.properties

#0 means not retry
retrycount=2

7.testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="suite_login">
<listeners>
<listener class-name="com.netease.qa.testng.RetryListener" />
</listeners>
<test name="LoginTest">
<classes>
<class name="com.retry.BaiduTest" />
</classes>
</test>
</suite>

设置的每次验证都失败,所以会总共运行3次,前两次为skip,后一次为true,运行结果如下

【框架】Testng用例失败自动重跑(五)

当引入dataProvider后,从第二组数据开始,运行结果与预期的不符,这个还不知道是什么原因,希望有知道的可以一起分享。