package cn.baiweigang.qtaf.dispatch.run;
import java.util.ArrayList;
import java.util.List;
import org.testng.ITestContext;
import org.testng.TestListenerAdapter;
import org.testng.TestNG;
import cn.baiweigang.qtaf.dispatch.DispatchConf;
import cn.baiweigang.qtaf.dispatch.report.ExportReportHtml;
import cn.baiweigang.qtaf.dispatch.report.TestReport;
import cn.baiweigang.qtaf.dispatch.report.TngCount;
import cn.baiweigang.qtaf.dispatch.testcase.ICase;
import cn.baiweigang.qtaf.toolkit.util.CommUtils;
import cn.baiweigang.qtaf.toolkit.util.FileUtil;
import cn.baiweigang.qtaf.toolkit.util.LogUtil;
/**
* 执行testng,
* @author @<a href='http://weibo.com/bwgang'>bwgang</a>(bwgang@163.com)<br/> 2012-10-29
*
*/
public class TestngRun {
private LogUtil log=LogUtil.getLogger(TestngRun.class);//日志记录
private TestNG tng;//运行TestNG
private TestListenerAdapter listener;//运行的监听器
private TestRunInfo runInfo;
private List<String> xmlFileList;
private TestReport testReport;
/*
* 构造函数 初始化
*/
public TestngRun() {
tng=new TestNG();
listener=new TestListenerAdapter();//定义监听器类型
tng.addListener(listener);
xmlFileList=new ArrayList<>();//记录测试使用的xml文件路径列表
testReport=new TestReport();//记录测试报告测试报告信息
runInfo=new TestRunInfo();
}
/**
* 设置运行配置信息
* @param runInfo
*/
public void setRunInfo(TestRunInfo runInfo) {
this.runInfo=runInfo;
log.info(this.runInfo.getTaskName()+"配置任务信息成功");
for (ICase icase : this.runInfo.getCaseList()) {
addXmlFileList(icase.getCaseList());
}
}
/**
* 执行用例
* @return boolean 执行成功返回true
*/
public boolean run() {
if (getXmlFileList().size()<1) {
this.testReport.setResNo(-6000);
this.testReport.setResMsg("Xml文件列表为空");
log.error(getTaskName()+" :Xml文件列表为空");
return false;
}
//运行相关参数配置
//检查xlst文件,不存在则创建
DispatchConf.writeConf();
tng.setOutputDirectory(getTestNgOut());
try {
tng.setTestSuites(getXmlFileList());
tng.run();
} catch (Exception e) {
// e.printStackTrace();
this.testReport.setResNo(-7000);
this.testReport.setResMsg("执行用例异常: "+e.getMessage());
log.error(getTaskName()+" :执行用例异常--"+e.getMessage());
return false;
}
//记录测试报告摘要
createTestReport();
//输出html测试报告
if (!createHtmlReport()) {
this.testReport.setResNo(1);
this.testReport.setResMsg("任务执行成功,转换Html格式报告出错");
log.info(getTaskName()+" :任务执行成功,转换Html格式报告出错");
}else{
this.testReport.setResNo(0);
this.testReport.setResMsg("任务执行成功");
log.info(getTaskName()+" :任务执行成功");
}
return true;
}
/**
* 获取测试报告
* @return TestReport
*/
public TestReport getTestReport() {
return this.testReport;
}
//私有方法
private String getTestNgOut(){
String out= this.runInfo.getTestng_OutPut();
if (out == null || out.length()<1) {
log.info("设置TestNG输出目录失败:"+this.runInfo.getTestng_OutPut());
log.info("使用默认路径:"+DispatchConf.TestNgOutPath);
return DispatchConf.TestNgOutPath;//默认的TestNG输出目录
}
if (!out.endsWith("/")) {
out=out+"/";
}
return out;
}
private String getTaskName() {
if (this.runInfo.getTaskName() == null || this.runInfo.getTaskName().length()<1) {
String taskName = "未命名测试任务"+CommUtils.getRandomStr(5);
log.info("设置任务名失败:"+this.runInfo.getTaskName());
log.info("使用默认任务名:"+taskName);
return taskName;//默认的TestNG输出目录
}
return this.runInfo.getTaskName();
}
private String getHtmlReportOut(){
if (this.runInfo.getHtmlReportOutPath() == null || this.runInfo.getHtmlReportOutPath().length()<1) {
log.info("设置Html输出目录失败:"+this.runInfo.getHtmlReportOutPath());
log.info("使用默认Html输出目录:"+DispatchConf.HtmlReportOutPath);
return DispatchConf.HtmlReportOutPath;//默认的html报告输出目录
}
return this.runInfo.getHtmlReportOutPath();
}
private String getHtmlReportTitle(){
if (null == this.runInfo.getHtmlReportTitle() || this.runInfo.getHtmlReportTitle().length()<1) {
log.info("设置Html报告标题失败:"+this.runInfo.getHtmlReportTitle());
log.info("使用默认Html报告标题:"+DispatchConf.HtmlReportTitle);
return DispatchConf.HtmlReportTitle;
}
return this.runInfo.getHtmlReportTitle();
}
private List<String> getXmlFileList() {
return xmlFileList;
}
private void addXmlFileList(List<String> xmlFileList) {
if (null==xmlFileList) {
log.error("添加的Xml文件列表为null,添加失败");
return;
}
for (String xmlFile : xmlFileList) {
addXmlFile(xmlFile);
}
}
private boolean addXmlFile(String xmlPathName){
if (null==xmlPathName){
log.error("添加的xml文件为null,添加失败");
return false;
}
if (!FileUtil.getExtensionName(xmlPathName).equals("xml")) xmlPathName=xmlPathName+".xml";
if (FileUtil.isExist(xmlPathName)) {
log.info("执行队列添加xml文件成功:"+xmlPathName);
this.xmlFileList.add(xmlPathName);
return true;
}else{
log.error("添加的xml文件不存在:"+xmlPathName);
return false;
}
}
private boolean createHtmlReport() {
if (ExportReportHtml.createHtmlReport(getTestNgOut()+"testng-results.xml",
getHtmlReportOut(),getHtmlReportTitle())) {
this.testReport .setHtmlReport(getHtmlReportOut());
return true;
}
return false;
}
/**
* 从监听器中获取需要的报告信息
* @param listener
*/
private void createTestReport() {
log.info("从TestNG监听器中获取任务执行的用例信息");
ArrayList<TngCount> testCountList=new ArrayList<TngCount>();;
TngCount tngCount=new TngCount();
tngCount.setName(getTaskName());
tngCount.setFailed(this.listener.getFailedTests().size());
tngCount.setPassed(this.listener.getPassedTests().size());
tngCount.setSkipped(this.listener.getSkippedTests().size());
this.testReport.setTngSuiteCount(tngCount);
List<ITestContext> testContextList=this.listener.getTestContexts();
for (int i = 0; i < testContextList.size(); i++) {
tngCount=new TngCount();
tngCount.setName(testContextList.get(i).getName());
tngCount.setSuiteName(testContextList.get(i).getSuite().getName());
tngCount.setFailed(testContextList.get(i).getFailedTests().size());
tngCount.setPassed(testContextList.get(i).getPassedTests().size());
tngCount.setSkipped(testContextList.get(i).getSkippedTests().size());
testCountList.add(tngCount);
}
this.testReport .setTaskName(getTaskName());
this.testReport .setTngTestCountList(testCountList);
}
}