1. 程式人生 > >TestNg失敗重試機制

TestNg失敗重試機制

reat return opera deb tom java ole 機制 ESS

TestNg提供了失敗重試接口IRetryAnalyzer,需要實現retry方法:

package com.shunhe.testngprac.retry;

import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;

/**
 * 設置testng用例失敗重試次數
 * Created by shunhe on 2019/2/13.
 */
public class MyRetryAnalyzer implements IRetryAnalyzer {

    private int retryCount = 0;
    private final int MAX_RETRY_COUNT = 3;

    @Override
    public boolean retry(ITestResult iTestResult) {
        if (retryCount < MAX_RETRY_COUNT) {
            retryCount++;
            return true;
        }
        return false;
    }
}

TestNG中的@Test註解包含參數retryAnalyzer,可以在註解中給定重試分析器,如下:

    @Test(retryAnalyzer = MyRetryAnalyzer.class)
    public void test01() {
        System.out.println("test01");
        Assert.assertTrue(false, "test failed");
    }

TestNg程序化調用情況

需要實現接口IAnnotationTransformer中的transform方法,對未設置retryanalyzer的@test方法添加響應的retryanalyzer:

package com.shunhe.testngprac.retry;

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

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

/**
 * 添加重試監聽器,如果測試方法中未添加重試分析器,則默認添加MyRetryAnalyzer作為重試分析器
 * Created by shunhe on 2019/2/13.
 */
public class MyRetryListener implements IAnnotationTransformer {
    @Override
    public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {
        IRetryAnalyzer retryAnalyzer = iTestAnnotation.getRetryAnalyzer();
        if (null == retryAnalyzer) {
            iTestAnnotation.setRetryAnalyzer(MyRetryAnalyzer.class);
        }
    }
}

在構造tesng執行對象時,添加響應的listener

package com.shunhe.testngprac.controller;

import java.util.ArrayList;
import java.util.List;
import org.testng.TestNG;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlSuite.ParallelMode;
import org.testng.xml.XmlTest;

/**
 * Created by shunhe on 2019/2/13.
 */
public class TestNgController {

    /**
     * TestNG測試程序化調用
     */
    public void executeTests() {
        //構建testng.xml內存對象
        try {
            List<XmlSuite> suites = new ArrayList<XmlSuite>();
            XmlSuite suite = new XmlSuite();
            suite.setName("TestNG Retry Test");
            //添加失敗重試
            List<String> suiteListeners = new ArrayList<String>();
            //添加重試監聽器
            suiteListeners.add("com.shunhe.testngprac.retry.MyRetryListener");
            suite.setListeners(suiteListeners);

            //類級別的並發
            suite.setParallel(ParallelMode.CLASSES);
            suites.add(suite);

            XmlTest test = new XmlTest(suite);
            test.setName("TestNG Retry Test");

            //添加將要執行的用例
            List<XmlClass> classes = new ArrayList<XmlClass>();

            XmlClass testClass = new XmlClass("com.shunhe.testngprac.tests.DemoTest01");

            classes.add(testClass);

            test.setXmlClasses(classes);

            //TestNG程序化調用
            TestNG testNG = new TestNG();
            testNG.setXmlSuites(suites);
            testNG.run();

        } catch (Exception e) {
            System.out.println("測試用例執行失敗: " + e.getMessage());
            e.printStackTrace();
        }

    }

    public static void main(String[] args){
        TestNgController testNgController = new TestNgController();
        testNgController.executeTests();
    }
}

TestNg失敗重試機制