TestNg实现失败自动重跑功能

参考了:
http://www.seleniumeasy.com/testng-tutorials/execute-only-failed-test-cases-using-iretryanalyzer
http://blog.csdn.net/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>

再运行,显示正常

这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值