如何利用TestNG监听器优化测试报告?

Fleur ·
更新时间:2024-11-14
· 831 次阅读

  今年四月底我花了时间简单搭建了php接口测试工程,maven + testng + jenkins,从0开始到现在510个用例(持续增长中),逐渐开始提高了测试回归效率并发现一些线上问题,这期间遇到过不少问题,这次先分享下如何利用testng监听器优化测试报告。   一、给工程添加失败重试机制   接口用例量上来以后,我们遇到的第一个问题是http方式调用php接口会有部分接口偶尔不稳定或者超时的情况,但第二次运行又正常,每次接口失败都需要花费时间排查,但实际没有问题,为了排除不稳定带来的干扰,给大家节约排查维护时间,首先需要解决的是给工程添加失败自动重试机制。   目前我的做法是实现了testng自带的IRetryAnalyzer接口,定义了一个MAX _ RETRY_COUNT,即大重试次数,实现的retry方法非常简单,如下: public boolean retry(ITestResult result) { if (retryCount < MAX_RETRY_COUNT) { retryCount++; return true; } return false; }   如果团队有人想要使用失败重试的功能也很简单,只需要在Annotation里面加上retryAnalyzer属性即可,如下: @Test(retryAnalyzer = TestRetry.class) public void summaryTest(){ String url = urlList.get(0); JSONObject map = ResponseJsonBase.manageJson(url, ""); String total = map.getString("total"); assert "7.59".equals(total) : url; }   这种方式带来的好处是有比较大的自由度,可以自由选择某个用例是否需要失败重试的功能,因为部分接口重试第二次是不允许的,比如分销的关注接口(有频率限制等)。 但是仅仅到这里还是会有问题,首先会发现我们的接口测试报告有问题,其次会发现失败重试后通过的情况下,依然会有邮件提醒,我们还是需要花费很多时间看接口问题。在这里,我为了复现当时遇到的问题,随便造了一个有问题的接口测试报告:

  二、通过定义一个监听器优化测试报告   根据遇到的问题,首先我们需要优化一下测试报告,从而避免给大家带来太多干扰。 我的做法是定义了一个testng的监听器来处理失败重试的用例。具体实现是通过继承TestListenerAdapter类,覆盖onTestFailure、 onStart、 onFinish方法,贴一下主要的代码段: @Override public void onTestFailure(ITestResult tr) { if (tr.getMethod().getRetryAnalyzer() == null) { log(tr.getMethod() + "--Test method failed "); } if (tr.getMethod().getRetryAnalyzer() != null) { TestRetry testRetry = (TestRetry)       tr.getMethod().getRetryAnalyzer(); if (testRetry.getRetryCount() < testRetry.getMaxRetryCount()) { tr.setStatus(ITestResult.SKIP); Reporter.setCurrentTestResult(null); isRemoveSkipNeeded = true; skippedCases.addResult(tr, tr.getMethod()); } else { failedCases.addResult(tr, tr.getMethod()); isRetryNeeded = true; } } }   其实上面代码里面是统一对失败的用例做处理,每次失败都会去判断是否已经达到大失败次数,如果没有,会将该用例状态设置为skip,到这里为止,看我们的测试报告,大概长这样:

  可以看到,依然有很明显的问题,我们还需要做的事情是:失败的用例列表去重,以及在Skipped的testcase里面剔除真正Failed的Test Case。 其实测试报告的主要数据获取是下面几个:   getFailedConfigurations()   getSkippedConfigurations()   getFailedTests()   getSkippedTests()   做对应优化很简单了,贴下我这边failed Cases去重的代码段,可以举一反三写其他几个: private void removeFailedTestsInTestNG(ITestContext test) { IResultMap returnValue = test.getFailedTests(); for (ITestResult resultToCheck : failedCases.getAllResults()) { int c = 0; for (ITestResult result : returnValue.getAllResults()) { if (result.getMethod().equals(resultToCheck.getMethod())) { c++; if (c > 1) { returnValue.removeResult(result.getMethod()); test.getFailedConfigurations().removeResult( result.getMethod()); } } } } }   然后是在每个testSuit运行结束的时候,统一处理: @Override public void onFinish(final ITestContext testContext) { if(isRetryNeeded){ removeIncorrectlySkippedTests(testContext,failedCases); removeFailedTestsInTestNG(testContext); } else{ if(isRemoveSkipNeeded) removeSkippedTestsInTestNG(testContext); else{ skippedCases= testContext.getSkippedTests(); failedCases= testContext.getFailedTests(); } } }



testng 测试报告 优化 测试

需要 登录 后方可回复, 如果你还没有账号请 注册新账号