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\"/>");
//
// }
}
}
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
- testNg之TestResultListener
- testng翻译之三--testng.xml
- testng翻译之四--Running TestNG
- 单元测试之TestNG
- testNg之ConfigReader
- testNg之PowerEmailableReporter
- testNg之RetryListener
- testNg之TestngRetry
- testNG之测试报告
- TestNG参数化之DataProvider
- TestNG参数化之Parameters
- testng翻译之二--注解
- Jtester之TestNG常用注解
- Jtester之TestNG:@Factory注解
- Jtester之TestNG:@Listener注解
- testng源码阅读之二
- testng源码阅读之三
- testng源码阅读之四
- C#之 装箱拆箱
- nil、Nil、NULL与NSNull的区别
- UVA 408-Uniform Generator
- NYOJ-水池数目 poj-Lake Counting
- 假设寄存器为8位,用补码形式存储机器数,包括一位符号位,那么十进制数-25在寄存器表示为:
- testNg之TestResultListener
- Spring学习-第2天
- Solver文件
- php正则与入门正则搭配
- EditText 在不同场景下调用软键盘的总结
- 多校2016&&HDU.5723 Abandoned country
- POJ 1611 The Suspects (并查集)
- C# 重启计算机的问题
- 使用Reveal调试UI