testNg之TestResultListener

来源:互联网 发布:淘宝模板免费的好吗 编辑:程序博客网 时间:2024/05/18 05:40
import io.appium.java_client.android.AndroidDriver;


import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;


import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.TestListenerAdapter;


/**
 * 
 */
public class TestResultListener extends TestListenerAdapter {


private static Logger logger = Logger.getLogger(TestResultListener.class.getName());
protected ITestContext testContext = null; // 这里也是新加的


@Override
public void onStart(ITestContext testContext) { // 这里也是新加的,用于对context进行统一
this.testContext = testContext;
super.onStart(testContext);
}


@Override
public void onTestFailure(ITestResult tr) {
super.onTestFailure(tr);
logger.warn(tr.getName() + " 测试用例执行失败!");
saveScreenShot(tr);
}


@Override
public void onTestSkipped(ITestResult tr) {
super.onTestSkipped(tr);
logger.warn(tr.getName() + " 测试用例由于某些原因被跳过!");
saveScreenShot(tr);


}


@Override
public void onTestSuccess(ITestResult tr) {
super.onTestSuccess(tr);
logger.info(tr.getName() + " 测试用例执行成功!");
}


@Override
public void onTestStart(ITestResult tr) {
super.onTestStart(tr);
logger.info(tr.getName() + " 测试用例开始执行!");
}


@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("执行成功的用例 = " + passedTest.getName());
passedTestIds.add(getId(passedTest));
}


// Eliminate the repeat methods
Set<Integer> skipTestIds = new HashSet<Integer>();
for (ITestResult skipTest : testContext.getSkippedTests().getAllResults()) {
logger.info("被跳过的用例 = " + skipTest.getName());
// id = class + method + dataprovider
int skipTestId = getId(skipTest);


if (skipTestIds.contains(skipTestId) || passedTestIds.contains(skipTestId)) {
testsToBeRemoved.add(skipTest);
} else {
skipTestIds.add(skipTestId);
}
}


// Eliminate the repeat failed methods
Set<Integer> failedTestIds = new HashSet<Integer>();
for (ITestResult failedTest : testContext.getFailedTests().getAllResults()) {
logger.info("执行失败的用例 = " + failedTest.getName());
// id = class + method + dataprovider
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) || skipTestIds.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("移除重复失败的用例 = " + 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;
}


private void saveScreenShot(ITestResult tr) {
// SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
// String mDateTime = formatter.format(new Date());
// String fileName = mDateTime + "_" + tr.getName();
// String filePath = "";
//
//// Object dirver = null;
//// try {
//// Field androidDriver = BaseParpare.class.getDeclaredField("appiumUtil");
//// androidDriver.setAccessible(true);
//// BaseParpare baseParpare = new BaseParpare();
//// dirver = androidDriver.get(baseParpare);
//// } catch (Exception e1) {
//// e1.printStackTrace();
//// }
// AndroidDriver driver = (AndroidDriver) testContext.getAttribute("APPIUMUTIL_DRIVER");
// logger.info("driver="+testContext);
// try {
// // 这里可以调用不同框架的截图功能
// File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
// filePath = "./result/screenshot/" + fileName + ".jpg";
// File destFile = new File(filePath);
// FileUtils.copyFile(screenshot, destFile);
// logger.info("[" + fileName + "] 截图成功,保存在:" + "[ " + filePath + " ]");
//
// } catch (Exception e) {
// filePath = "[" + fileName + "]" + " ,截图失败,原因:" + e.getMessage();
// logger.error(filePath);
// }
//
// if (!"".equals(filePath)) {
// Reporter.setCurrentTestResult(tr);
// Reporter.log(filePath);
// // 把截图写入到Html报告中方便查看
// Reporter.log("<img src=\"../../../../" + filePath + "\" width=\"300\"/>");
//
// }
}


}
0 0