如何利用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;

}

}

}

可以看到,依然有很明显的问题,我们还需要做的事情是:失败的用例列表去重,以及在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.xml内或者pom.xml内可以生效了。

 三、后续的优化空间上周,我在工程里面加了日志模块,会记录skip的和返回时间超过1秒的用例,设想是运行一段时间后,对这部分用例进行统计,看是否接口本身存在优化空间,这部分工作后续也是计划优化为自动完成、自动出图表,要看时间是否充足了

上一篇:android获取外置SD卡路径


下一篇:java调用第三方接口(转载)