testng执行用例失败,再次执行
2017-08-31 13:58
232 查看
我们通过重写testng的retry方法和transform方法来实现用例失败重跑的功能。
首先添加两个文件
TestngRetry.java
RetryListener.java
添加以上两个文件之后,有两种方法可以使用我们的listener进行监听:
在Test标签中添加retryAnalyzer属性
在testng.xml文件中配置listener
做完上面的工作,我们就可以实现失败重跑的功能了。但是,每次用例重跑之后,每次失败的结果也记录在运行结果中了,测试结果中运行的用例数增加了,不利于我们查看测试结果。因此,我们还需要把重复的用例去掉。
这个我们通过重写TestListenerAdapter中的onFinish方法实现:
TestngListener.java
把listener添加到testng.xml中,当前testng.xml为:
OK,结束。
首先添加两个文件
TestngRetry.java
public class TestngRetry implements IRetryAnalyzer { private static Logger logger = Logger.getLogger(TestngRetry.class); private static int maxRetryCount = 3; private int retryCount = 1; @Override public boolean retry(ITestResult result) { if (retryCount <= maxRetryCount) { String message = "Running retry for '" + result.getName() + "' on class " + this.getClass().getName() + " Retrying " + retryCount + " times"; logger.info(message); Reporter.setCurrentTestResult(result); Reporter.log("RunCount=" + (retryCount + 1)); retryCount++; return true; } return false; } }
RetryListener.java
public class RetryListener implements IAnnotationTransformer { @Override public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { IRetryAnalyzer retry = annotation.getRetryAnalyzer(); if (retry == null) { annotation.setRetryAnalyzer(TestngRetry.class); } } }
添加以上两个文件之后,有两种方法可以使用我们的listener进行监听:
在Test标签中添加retryAnalyzer属性
@Test(retryAnalyzer = com.xxx.retry.RetryListener.class)
在testng.xml文件中配置listener
<test name="test1"> <listeners> <listener class-name="com.xxx.retry.RetryListener" /> <classes> <class name="com.xxx.test.NewTest" /> </classes> </test>
做完上面的工作,我们就可以实现失败重跑的功能了。但是,每次用例重跑之后,每次失败的结果也记录在运行结果中了,测试结果中运行的用例数增加了,不利于我们查看测试结果。因此,我们还需要把重复的用例去掉。
这个我们通过重写TestListenerAdapter中的onFinish方法实现:
TestngListener.java
public class TestngListener extends TestListenerAdapter { private static Logger logger = Logger.getLogger(TestngListener.class); @Override public void onFinish(ITestContext testContext) { super.onFinish(testContext); // List of test results which we will delete later ArrayList<ITestResult> testsToBeRemoved = new ArrayList<ITestResult>(); // collect all id's from passed test Set<Integer> passedTestIds = new HashSet<Integer>(); for (ITestResult passedTest : testContext.getPassedTests() .getAllResults()) { logger.info("PassedTests = " + passedTest.getName()); passedTestIds.add(getId(passedTest)); } Set<Integer> failedTestIds = new HashSet<Integer>(); for (ITestResult failedTest : testContext.getFailedTests() .getAllResults()) { logger.info("failedTest = " + failedTest.getName()); int failedTestId = getId(failedTest); // if we saw this test as a failed test before we mark as to be // deleted // or delete this failed test if there is at least one passed // version if (failedTestIds.contains(failedTestId) || passedTestIds.contains(failedTestId)) { testsToBeRemoved.add(failedTest); } else { failedTestIds.add(failedTestId); } } // finally delete all tests that are marked for (Iterator<ITestResult> iterator = testContext.getFailedTests() .getAllResults().iterator(); iterator.hasNext();) { ITestResult testResult = iterator.next(); if (testsToBeRemoved.contains(testResult)) { logger.info("Remove repeat Fail Test: " + testResult.getName()); iterator.remove(); } } } private int getId(ITestResult result) { int id = result.getTestClass().getName().hashCode(); id = id + result.getMethod().getMethodName().hashCode(); id = id + (result.getParameters() != null ? Arrays.hashCode(result .getParameters()) : 0); return id; } }
把listener添加到testng.xml中,当前testng.xml为:
<test name="test1"> <listeners> <listener class-name="com.xxx.retry.RetryListener" /> <listener class-name="com.xxx.retry.TestngListener" /> </listeners> <classes> <class name="com.xxx.test.NewTest" /> </classes> </test>
OK,结束。
相关文章推荐
- testng对执行失败的用例,再次执行
- 跳过一些坑,一张图弄明白TestNG多用例执行添加监听失败截图
- ride工具执行用例失败后,再次执行用例后不出现log日志
- 如何解决testng执行用例失败自动重跑问题
- 修改testNG源码,实现失败用例自动再执行
- robot framwork 失败用例继续执行
- Web UI自动化测试框架搭建之六:扩展testNG支持自动执行失败的脚本
- selenium的TestNG框架注解,测试集合,用例分组,依赖测试,特定顺序执行,跳过某个case执行,自定义日志,断言_06
- Testng实现用例失败自动截图
- 解决RobotFramework用例执行失败自动重跑问题
- JAVA结合testng断言verify(断言失败不中断继续执行)
- testng运行失败,继续执行
- Ant学习-002-ant 执行 TestNG 测试用例时 [testng] java.lang.NoClassDefFoundError: com/beust/jcommander/ParameterException 解决方案
- JAVA结合testng断言verify(断言失败不中断继续执行)
- JAVA结合testng断言verify(断言失败不中断继续执行)
- testng跑失败用例重试
- appium android——利用testng和maven并行执行用例
- 故障案例--DDL中断后,再次执行失败
- 如何解决testng执行用例报错自动截图问题
- Appium Android ——利用 TestNG 并行执行用例