TestNG测试用例重跑详解及实践优化 (2)

alwaysRun=false,或者保持缺省值(false),依赖于其他测试用例或测试用例组的测试结果,在运行时TestNG获取所依赖的测试用例的运行结果,检查依赖的测试用例是否全部执行成功,如果不全部成功,则把该测试用例结果设置为Skipped。

2.1 场景分析:场景一

被依赖的测试用例失败后进行了重跑,并重跑成功。(注:在RetryImpl类中,已设置最大重跑次数max_count = 3

public static int number =0; @Test public void test01(){ number++; System.out.println(String.valueOf(number)); Assert.assertEquals(number,2); System.out.println("test01"); } @Test(dependsOnMethods = "test01") // alwaysRun = false by default public void test02(){ System.out.println("test02 is running only if test01 is passed."); } 1、TestNG测试报告

TestNG测试用例重跑详解及实践优化

2、问题 测试用例 运行次数 运行情况 测试报告
Test01   2   第一次:skipped ; 第二次:passed   在Skipped 和Passed的统计数量中,test01被分别记录一次  
Test02   0   Skipped   记录一次Skipped  

测试报告:test01运行结果全部被记录,而用例重跑,只希望记录最后的结果。

运行情况:测试用例test02依赖于测试用例test01运行结果,在test01重跑成功后,测试用例test02没有执行,不符合需求预期。

2.2 场景分析:场景二

被依赖的测试用例失败后进行了重跑,并且重跑没有成功。(注:在RetryImpl类中,已设置最大重跑次数max_count = 3)

public static int number =0; @Test public void test01(){ number++; System.out.println(String.valueOf(number)); Assert.assertEquals(number,10); System.out.println("test01"); } @Test(dependsOnMethods = "test01") // alwaysRun = false by default public void test02(){ System.out.println("test02 is running only if test01 is passed."); } 1、TestNG测试报告

TestNG测试用例重跑详解及实践优化

2、问题 测试用例 运行次数 运行结果 测试报告
Test01   3   第一次:skipped;第二次:skipped;第三次:failed   在Skipped统计数量中,test01被被记录两次在failed统计中,test01被记录一次  
Test02   0   Skipped   记录一次Skipped  

运行情况:测试用例test02依赖于测试用例test01运行结果,在test01重跑失败后,测试用例test02没有执行,这种情况符合需求预期。

测试报告:同场景一,test01重跑失败,运行结果全部被记录,而用例重跑,只希望记录最后的结果。

第三部分 优化解决方案

以下方案解决重跑测试用例成功后后继测试用例无法继续运行的问题,并对测试报告进行优化

3.1 TestListenerAdapter方法重写

根据上面分析的TestNG逻辑,在对依赖测试用例的结果进行检查时,如果忽略重跑的中间结果只检查最后一次的运行结果,可以达到需求的目的。对于测试报告,同样的处理方式,忽略所有中间的测试用例运行结果,只记录最后结果。
测试用例的中间运行结果为Skipped,下面的代码通过重写TestListenerAdapter的onTestSuccess()和onTestFailure()方法,对测试用例的中间结果skipped进行了删除。代码如下:

public class ResultListener extends TestListenerAdapter { @Override public void onTestFailure(ITestResult tr) { if(tr.getMethod().getCurrentInvocationCount()==1) { super.onTestFailure(tr); return; } processSkipResult(tr); super.onTestFailure(tr); } @Override public void onTestSuccess(ITestResult tr) { if(tr.getMethod().getCurrentInvocationCount()==1) { super.onTestSuccess(tr); return; } processSkipResult(tr); super.onTestSuccess(tr); } // Remove all the dup Skipped results public void processSkipResult(ITestResult tr) { ITestContext iTestContext = tr.getTestContext(); Iterator<ITestResult> processResults = iTestContext.getSkippedTests().getAllResults().iterator(); while (processResults.hasNext()) { ITestResult skippedTest = (ITestResult) processResults.next(); if (skippedTest.getMethod().getMethodName().equalsIgnoreCase(tr.getMethod().getMethodName()) ) { processResults.remove(); } } } } 3.2 配置结果处理Listener类

在配置文件进行全局设置或者在测试类中标记。

方法一:在TestNG的配置XML中进行以下配置

<listeners> <listener class-name="PackageName.ResultListener"></listener> </listeners>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjwdy.html