参考了:
http://www.seleniumeasy.com/testng-tutorials/execute-only-failed-test-cases-using-iretryanalyzer
http://blog.youkuaiyun.com/sunnyyou2011/article/details/45894089
大致分四步走: 一、先建个Java类实现IRetryAnalyzer接口。二、建个java类实现IAnnotationTransformer接口。三、把RetryListener监听器添加到testng.xml文件上。四、重新跑一遍后,会导致case运行数目增加,需实现ITestListener接口,更新onFinish方法
一、新建java类实现IRetryAnalyzer接口。
package com.pack.test;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
public class Retry implements IRetryAnalyzer {
private int retryCount = 0;
private int maxRetryCount = 1;
// Below method returns 'true' if the test method has to be retried else 'false'
//and it takes the 'Result' as parameter of the test method that just ran
public boolean retry(ITestResult result) {
if (retryCount < maxRetryCount) {
System.out.println("Retrying test " + result.getName() + " with status "
+ getResultStatusName(result.getStatus()) + " for the " + (retryCount+1) + " time(s).");
retryCount++;
return true;
}
return false;
}
public String getResultStatusName(int status) {
String resultName = null;
if(status==1)
resultName = "SUCCESS";
if(status==2)
resultName = "FAILURE";
if(status==3)
resultName = "SKIP";
return resultName;
}
}
二、建个java类实现IAnnotationTransformer接口。
package com.pack.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.testng.IAnnotationTransformer;
import org.testng.IRetryAnalyzer;
import org.testng.annotations.ITestAnnotation;
public class RetryListener implements IAnnotationTransformer {
@Override
public void transform(ITestAnnotation testannotation, Class testClass,
Constructor testConstructor, Method testMethod) {
IRetryAnalyzer retry = testannotation.getRetryAnalyzer();
if (retry == null) {
testannotation.setRetryAnalyzer(Retry.class);
}
}
}
三、把RetryListener监听器添加到testng.xml文件上。
<listeners>
<listener class-name="com.pack.test.RetryListener"/>
</listeners>
接下来,就写个程序来测试一下。当没有用testng跑的时候,2个cases, 每个跑一次,1pass,1fail。当用testng来跑,在testng上加了listener,就会自动把失败的而用例再跑一次(我们定义了失败再跑一次,可以定义失败再跑2次等),总共显示跑了3个case。那么问题就来了,我们真正要显示的是跑了2个case,而不是3个case。
package com.pack.test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class TestNGExampleTests {
WebDriver driver;
String baseURL = "https://www.linkedin.com/";
@BeforeClass
public void setup() {
driver = new FirefoxDriver();
driver.manage().window().maximize();
}
@Test(priority=1)
public void verifyLoginPageText() {
driver.navigate().to(baseURL);
System.out.println("Verify login page test started");
WebElement element = driver.findElement(By.cssSelector(".header>h2"));
String headerText = element.getText();
Assert.assertEquals(headerText, "Get started – it’s free.");
}
@Test(priority=2)
public void verifyForgotPasswordPage() {
driver.navigate().to(baseURL);
System.out.println("Verify Forgot password page test started");
WebElement element = driver.findElement(By.linkText("Forgot your password?"));
element.click();
WebElement pageTextElement = driver.findElement(By.cssSelector(".flow-login-content>fieldset>h1"));
String pageText = pageTextElement.getText();
Assert.assertEquals(pageText, "Wrong text");
//Assert.assertEquals(pageText, "Change your password");
}
}
显示错误的case数目,如下图:
四、重新跑一遍后,会导致case运行数目增加,需实现ITestListener接口,更新onFinish方法
package com.pack.test;
import java.util.Set;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
public class TestListener implements ITestListener {
@Override
public void onFinish(ITestContext context) {
// TODO Auto-generated method stub
Set<ITestResult> failedTests = context.getFailedTests().getAllResults();
for(ITestResult temp : failedTests){
ITestNGMethod method = temp.getMethod();
if(context.getFailedTests().getResults(method).size() > 1){
failedTests.remove(temp);
}else{
if(context.getPassedTests().getResults(method).size() > 0){
failedTests.remove(temp);
}
}
}
}
@Override
public void onStart(ITestContext arg0) {
// TODO Auto-generated method stub
}
@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) {
// TODO Auto-generated method stub
}
@Override
public void onTestFailure(ITestResult arg0) {
// TODO Auto-generated method stub
}
@Override
public void onTestSkipped(ITestResult arg0) {
// TODO Auto-generated method stub
}
@Override
public void onTestStart(ITestResult arg0) {
// TODO Auto-generated method stu
}
@Override
public void onTestSuccess(ITestRes````
lt arg0) {
// TODO Auto-generated method stub
}
}
然后再把这个listener加到testng.xml文件里。
<listeners>
<listener class-name="com.pack.test.TestListener"/>
</listeners>
再运行,显示正常