package org.webdriver.patatiumwebui.utils; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.webdriver.patatiumwebui.config.Config; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.testng.IReporter; import org.testng.IResultMap; import org.testng.ISuite; import org.testng.ISuiteResult; import org.testng.ITestContext; import org.testng.ITestResult; import org.testng.TestNG; import org.testng.xml.XmlSuite; /** * 报表生成器 * @author Administrator * */ public class TestReport implements IReporter{ @Override public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) { List<ITestResult> list = new ArrayList<ITestResult>(); for (ISuite suite : suites) { Map<String, ISuiteResult> suiteResults = suite.getResults(); for (ISuiteResult suiteResult : suiteResults.values()) { ITestContext testContext = suiteResult.getTestContext(); IResultMap passedTests = testContext.getPassedTests(); IResultMap failedTests = testContext.getFailedTests(); IResultMap skippedTests = testContext.getSkippedTests(); IResultMap failedConfig = testContext.getFailedConfigurations(); list.addAll(this.listTestResult(passedTests)); list.addAll(this.listTestResult(failedTests)); list.addAll(this.listTestResult(skippedTests)); //list.addAll(this.listTestResult(failedConfig)); } } CopyReportResources reportReource=new CopyReportResources(); try { reportReource.copyResources(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } this.sort(list); this.outputResult(list, outputDirectory+"/report.html"); } private ArrayList<ITestResult> listTestResult(IResultMap resultMap){ Set<ITestResult> results = resultMap.getAllResults(); return new ArrayList<ITestResult>(results); } private void sort(List<ITestResult> list){ Collections.sort(list, new Comparator<ITestResult>() { @Override public int compare(ITestResult r1, ITestResult r2) { if(r1.getStartMillis()>r2.getStartMillis()){ return 1; }else{ return -1; } } }); } private void outputResult(List<ITestResult> fullResults, String path){ ArrayList<ITestResult> passArrayList=new ArrayList<ITestResult>(); ArrayList<ITestResult> failedArrayList=new ArrayList<ITestResult>(); ArrayList<ITestResult> skipArrayList=new ArrayList<ITestResult>(); try { //BufferedWriter output = new BufferedWriter(new FileWriter(new File(path))); StringBuffer sb = new StringBuffer(); for (ITestResult result : fullResults) { if(result.getStatus()==1) { passArrayList.add(result); } if(result.getStatus()==2) { failedArrayList.add(result); } if(result.getStatus()==3) { skipArrayList.add(result); } } String reportTitle=""; try { reportTitle=getTestngParametersValue(Config.path,"reportTitle"); } catch (DocumentException e) { e.printStackTrace(); } sb.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"); sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n"); sb.append("<meta http-equiv=\"Content-Type\"content=\"text/html; charset=utf-8\" />\n"); sb.append("<title>" + reportTitle + "</title>\n"); sb.append("<link href=\"report.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"); sb.append("<link href=\"imageshow.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"); sb.append("<script type=\"text/javascript\" src=\"jquery-1.7.1.min.js\"></script>\n "); sb.append("<script type=\"text/javascript\" src=\"loadxmldoc.js\"></script>\n"); sb.append("<script type=\"text/javascript\" src=\"report.js\"></script>\n"); sb.append("<script type=\"text/javascript\" src=\"Chart.js\"></script>\n"); sb.append("<script type=\"text/javascript\">\n") .append("function bigimg(i)\n" + "{\nvar zoom = parseInt(i.style.zoom,10)||100;\n" + "zoom += event.wheelDelta / 12;\n" + "if(zoom > 0 )\n" + "i.style.zoom=zoom+'%';\n" + "return false;\n}") .append(" $.ajaxSetup ({ cache: false\n //关闭AJAX相应的缓存\n });\n") .append(" $(document).ready(function(){" + "$(\".passed_button\").click(function(){\n" + "if($(this).parent().parent().find(\"span\").css(\"display\")==\"none\")\n" + "{\n" +"$(this).parent().parent().find(\"div\").load(\"passed.xml\",function(response,status){\n" +" if (status==\"success\")\n" +"{" +"var pass_assert_info_attr=$(this).parent().parent().attr(\"id\");\n" +"var str=\"pass_assert_info[method=\'\";\n" + "var str2=\"\']\";\n" + "var str3=str.concat(pass_assert_info_attr).concat(str2);\n" + " var item=$(response).find(str3).text();\n" + "var div=$(this).parent().parent().find(\"div\");\n" + "div.html(\"<ol></ol>\");\n" + "$(response).find(str3).each(function(){\n" + "var item_text=$(this).text();\n" +"if(item_text.indexOf(\"pass\")>0)\n" + "{\n" + "$('<li class=\"passed_info_li\" ></li>').html(item_text).appendTo('ol');\n" + "}\n" + "else\n" + "{$('<li class=\"failed_info_li\"></li>').html(item_text).appendTo('ol');\n" + "}\n" + " });" + " }\n });\n" + "$(this).parent().parent().find(\"span\").show();\n" + "$(this).parent().parent().find(\"div\").show();\n" + " $(this).parent().parent().prevAll().find(\"span\").hide();\n" + " $(this).parent().parent().prevAll().find(\"div\").hide();\n" + "$(this).parent().parent().nextAll().find(\"span\").hide();\n" + "$(this).parent().parent().nextAll().find(\"div\").hide();\n" + "}\n" + "else\n" + "{\n" + "$(this).parent().parent().find(\"span\").hide();\n" + "$(this).parent().parent().find(\"div\").hide();\n" + "}\n" + "}\n" + ");\n" + "$(\".failed_button\").click(function(){\n" + "if($(this).parent().parent().find(\"span\").css(\"display\")==\"none\")" + "{\n" + " $(this).parent().parent().find(\"div\").load(\"failed.xml\",function(response,status){\n" + "if (status==\"success\")\n" + "{var pass_assert_info_attr=$(this).parent().parent().attr(\"id\");\n" + "var str4=\"err_assert_info[method='\";\n" + "var str5=\"']\";\n" + "var str6=str4.concat(pass_assert_info_attr).concat(str5);\n" + "var item=$(response).find(str6).text();\n" + "var div=$(this).parent().parent().find(\"div\");\n" + "div.html(\"<ol></ol>\");\n" + "$(response).find(str6).each(function(){\n" + "var item_text=$(this).text();\n" +"if(item_text.indexOf(\"pass\")>0)\n" + "{\n" + "$('<li class=\"passed_info_li\" ></li>').html(item_text).appendTo('ol');\n" + "}\n" + "else\n" + "{$('<li class=\"failed_info_li\"></li>').html(item_text).appendTo('ol');\n" + "}\n" + " }); }\n" + " });\n" + "$(this).parent().parent().find(\"span\").show();\n" + "$(this).parent().parent().find(\"div\").show();\n" + "$(this).parent().parent().prevAll().find(\"span\").hide();\n" + "$(this).parent().parent().prevAll().find(\"div\").hide();\n" + "$(this).parent().parent().nextAll().find(\"span\").hide();\n" + "$(this).parent().parent().nextAll().find(\"div\").hide();\n" + "}\n" + "else\n" + "{\n" + "$(this).parent().parent().find(\"span\").hide();\n" + "$(this).parent().parent().find(\"div\").hide();\n" + "}\n" + "}\n" + ");\n" + "})\n" + "</script>"); sb.append("</head>\n"); sb.append("<body>\n"); sb.append("<div id=\"content\">\n"); sb.append("<div id=\"report_title\">\n"); sb.append("<div id=\"logo\"><img src=\"logo1.png\"></img></div>\n"); sb.append("<div style=\"clear:both\"><div id=\"time\">\n"); sb.append("<div style=\"pading-top:20px\">开始时间:" + this.formatDate(fullResults.get(0).getStartMillis()) + "</div>\n"); sb.append("<div>结束时间:" + this.formatDate(fullResults.get(fullResults.size()-1).getEndMillis()) + " </div>\n"); sb.append("<div>用    时:" +formateTime(fullResults.get(fullResults.size()-1).getEndMillis()-fullResults.get(0).getStartMillis()) + "</div>\n"); sb.append("</div>\n"); sb.append("</div>\n"); sb.append("</div>"); sb.append("<div id=\"header_right\" >\n"); sb.append("<div id=\"title\">\n"); sb.append("<div>" + reportTitle + "</div>\n"); sb.append("</div>\n"); sb.append("<div id=\"canvas_div\"><canvas id=\"canvas\" height=\"90\" width=\"90\"></canvas>\n</div>" + "</div>\n"); sb.append("<div id=\"report_total\">\n"); sb.append("<table width=\"100%\">\n"); sb.append("<tr>\n" + "<td width=\"84\"><div align=\"center\">用例总数</div></td>\n"); sb.append("<td width=\"152\" align=\"center\"><div align=\"center\">通过数(pass)</div></td>\n"); sb.append("<td width=\"125\" align=\"center\"><div align=\"center\">失败数(failed)</div></td>\n"); sb.append("<td width=\"96\" align=\"center\"><div align=\"center\">跳过数(skip)</div></td>\n"); sb.append("<td width=\"91\" align=\"center\"><div align=\"center\">通过率</div></td>\n</tr>\n"); sb.append(" <tr>\n<td><div align=\"center\">"); sb.append("<button id=\"total_num\">"); sb.append(passArrayList.size()+failedArrayList.size()+skipArrayList.size()); sb.append("</button>"); sb.append("</div></td>\n<td><div align=\"center\">"); sb.append("<button id=\"passed_num\"" + "value=\"" + passArrayList.size() + "\">"); sb.append(passArrayList.size()); sb.append("</button>"); sb.append("</div></td>\n <td><div align=\"center\">"); sb.append("<button id=\"failed_num\"" + "value=\"" + failedArrayList.size() + "\">"); sb.append(failedArrayList.size()); sb.append("</button>"); sb.append("</div></td>\n<td><div align=\"center\">"); sb.append("<button id=\"skiped_num\"" + "value=\"" +skipArrayList.size() + "\">"); sb.append(skipArrayList.size()); sb.append("</button>"); sb.append("</div></td>\n<td><div align=\"center\">"); DecimalFormat dfDecimalFormat=new DecimalFormat("######0.00"); float total=passArrayList.size()+failedArrayList.size()+skipArrayList.size(); float s=passArrayList.size()/total; sb.append(dfDecimalFormat.format(s*100)); sb.append("%"); sb.append("</div></td>\n</tr>\n</table>\n"); sb.append("<script type=\"text/javascript\">\n" + "var x= $('#failed_num').attr('value');\n" + "var y=$(\"#passed_num\").attr(\'value\');\n" + "var z=$(\"#skiped_num\").attr(\'value\');\n" + "var passed_num=Number(y);\n" + "var failed_num=Number(x);\n" + "var skiped_num=Number(z);\n" + "var pieData = [\n" + "{value: passed_num,\n" + "color:\"green\"},\n" + "{value : failed_num,\n" + "color : \"red\"}\n,{\n" + "value : skiped_num,\n" + "color : \"yellow\"}\n" + "];\nvar myPie = new Chart(document.getElementById(\"canvas\").getContext(\"2d\")).Pie(pieData);\n" + "</script>\n"); //--所有测试结果展示--start sb.append("<table id=\"total\">\n"); sb.append("<tr>\n<td colspan=7 align=\"left\" style=\"color:green;font-size:14px;font-weight:bold\">所有测试用例</td>\n</tr>\n"); sb.append("<tr>\n<td width=\"2%\" class=\"SEQ\">序号</td>\n"); sb.append("<td width=\"5%\" class=\"case_funtcion_td\">功能模块</td>\n"); sb.append("<td width=\"20%\" class=\"case_name_td\">用例名称</td>\n"); sb.append("<td width=\"43%\" colspan=2 align=\"left\">测试结果</td>\n"); sb.append("<td width=\"20%\" class=\"case_result_beizhu_td\">备注</td>\n"); sb.append("<td width=\"10%\" class=\"case_time\">耗时</td>\n"); sb.append("</tr>\n"); //for (ITestResult fullITestResult : fullResults) for (int i = 0; i < fullResults.size(); i++) { if(sb.length()!=0){ sb.append("\r\n"); } float t=fullResults.get(i).getEndMillis()-fullResults.get(i).getStartMillis(); String testMethodFullName=fullResults.get(i).getTestClass().getName()+"."+fullResults.get(i).getMethod().getMethodName(); if (!fullResults.get(i).getMethod().getDescription().isEmpty()) { if (fullResults.get(i).getParameters().length>0) { sb.append("<tr id=\""+testMethodFullName+"."+fullResults.get(i).getEndMillis()+"\">\n"); sb.append("<td class=\"SEQ\">"+(i+1)+"</td>"); Object[] parameters=fullResults.get(i).getParameters(); if (parameters[0].toString().contains("院")||parameters[0].toString().contains("所")||parameters[0].toString().contains("医") ||parameters[0].toString().contains("病")||parameters[0].toString().contains("治")) { sb.append("<td class=\"case_funtcion_td\">"+fullResults.get(i).getTestContext().getName()+"</td>\n"); sb.append("<td class=\"case_name_td\">"+fullResults.get(i).getMethod().getDescription()+":"+parameters[0].toString()+"</td>\n"); } else { sb.append("<td class=\"case_funtcion_td\">"+fullResults.get(i).getTestContext().getName()+"</td>\n"); sb.append("<td class=\"case_name_td\">"+fullResults.get(i).getMethod().getDescription()+"</td>\n"); } } else { TestNG testNG=new TestNG(); testNG.getDefaultTestName(); sb.append("<tr id=\""+testMethodFullName+"\">\n"); sb.append("<td class=\"SEQ\">"+(i+1)+"</td>"); sb.append("<td class=\"case_funtcion_td\">"+fullResults.get(i).getTestContext().getName()+"</td>\n"); sb.append("<td class=\"case_name_td\">"+fullResults.get(i).getMethod().getDescription()+"</td>\n"); } sb.append(" ") .append("<td class=\"case_result_td\">"); if(this.getStatus(fullResults.get(i).getStatus()).equals("p")) { sb.append("<button class=\"passed_button\" id=\"fullresult_"+fullResults.get(i).getMethod().getMethodName()+"\">"+this.getStatus(fullResults.get(i).getStatus())+"</button><br />"+"\n"); } else if(this.getStatus(fullResults.get(i).getStatus()).equals("f")) { sb.append("<button class=\"failed_button\" id=\"fullresult_"+fullResults.get(i).getMethod().getMethodName()+"\">"+this.getStatus(fullResults.get(i).getStatus())+"</button><br />"+"\n"); } sb.append("</td>\n") .append("<td class=\"case_result_info_td\">"); sb.append("<span class=\"full_info\" id=\"fullresult_"+fullResults.get(i).getMethod().getMethodName()+"_info\" style=\"display:none\" "+">"); /*.append("用例基本信息:<br />\n"); .append("method:"+testMethodFullName+"<br />\n") .append("start_time:"+this.formatDate(fullResults.get(i).getStartMillis())+"<br />\n") .append("time:"+Float.toString(t)+"毫秒"+"<br />\n");*/ sb.append("检查点:<br />\n"); sb.append("</span><div class=\"full_info_div\"></div></td>\n"); if (fullResults.get(i).getParameters().length>0) { sb.append("<td class=\"case_result_beizhu_td\">"+"输入数据:"+fullResults.get(i).getParameters()[0]+"</td>\n"); } else { sb.append("<td class=\"case_result_beizhu_td\">"+"输入数据:无"+"</td>\n"); } sb.append("<td class=\"case_time_td\">"+formateTime((long) t)+"</td>\n"); //点击结果标志按钮,弹出失败信息 sb.append("<td colspan=\"3\" style=\"display:none\">"+""+"</td>\n") .append("</tr>\n"); } } if(sb.length()!=0){ sb.append("\r\n"); } sb.append("</table>\n"); //--详细测试结果--end //--跳过结果展示--start sb.append("<table id=\"skiped\">\n<tr>\n"); sb.append("<tr>\n<td colspan=7 align=\"left\" style=\"color:green;font-size:14px;font-weight:bold\">跳过测试用例</td>\n</tr>\n"); sb.append("<td width=\"2%\" class=\"SEQ\">序号</td>\n"); sb.append("<td width=\"5%\" class=\"case_funtcion_td\">功能模块</td>\n"); sb.append("<td width=\"20%\" class=\"case_name_td\">用例名称</td>\n"); sb.append("<td width=\"43%\" colspan=2 align=\"left\">测试结果</td>\n"); sb.append("<td width=\"20%\" class=\"case_result_beizhu_td\">备注</td>\n"); sb.append("<td width=\"10%\" class=\"case_time\">耗时</td>\n"); sb.append("<tr>\n"); //for (ITestResult skipresult : skipArrayList) for (int j = 0; j < skipArrayList.size(); j++) { if(sb.length()!=0){ sb.append("\r\n"); } float t=skipArrayList.get(j).getEndMillis()-skipArrayList.get(j).getStartMillis(); String testMethodFullName=skipArrayList.get(j).getTestClass().getName()+"."+skipArrayList.get(j).getMethod().getMethodName(); if (!skipArrayList.get(j).getMethod().getDescription().isEmpty()) { if (skipArrayList.get(j).getParameters().length>0) { sb.append("<tr id=\""+testMethodFullName+"."+skipArrayList.get(j).getEndMillis()+"\">\n"); sb.append("<td class=\"SEQ\">"+(j+1)+"</td>"); Object[] parameters=skipArrayList.get(j).getParameters(); if (parameters[0].toString().contains("院")||parameters[0].toString().contains("所")||parameters[0].toString().contains("医") ||parameters[0].toString().contains("病")||parameters[0].toString().contains("治")) { sb.append("<td class=\"case_funtcion_td\">"+skipArrayList.get(j).getTestContext().getName()+"</td>\n"); sb.append("<td class=\"case_name_td\">"+skipArrayList.get(j).getMethod().getDescription()+":"+parameters[0].toString()+"</td>\n"); } else { sb.append("<td class=\"case_funtcion_td\">"+skipArrayList.get(j).getTestContext().getName()+"</td>\n"); sb.append("<td class=\"case_name_td\">"+skipArrayList.get(j).getMethod().getDescription()+"</td>\n"); } } else { sb.append("<tr id=\""+testMethodFullName+"\">\n"); sb.append("<td class=\"SEQ\">"+(j+1)+"</td>"); sb.append("<td class=\"case_funtcion_td\">"+skipArrayList.get(j).getTestContext().getName()+"</td>\n"); sb.append("<td class=\"case_name_td\">"+skipArrayList.get(j).getMethod().getDescription()+"</td>\n"); } sb.append(" ") .append("<td class=\"case_result_info_td\">"+this.getStatus(skipArrayList.get(j).getStatus())+"</td>\n"); if (skipArrayList.get(j).getParameters().length>0) { sb.append("<td class=\"case_result_beizhu_td\">"+"输入数据:"+skipArrayList.get(j).getParameters()[0]+"</td>\n"); } else { sb.append("<td class=\"case_result_beizhu_td\">"+"输入数据:无"+"</td>\n"); } sb.append("<td class=\"case_time_td\">"+formateTime((long) t)+"</td>\n") //点击跳过按钮,弹出失败信息 .append("<td colspan=\"3\" style=\"display:none\">"+""+"</td>\n") .append("</tr>\n"); } } if(sb.length()!=0){ sb.append("\r\n"); } sb.append("</table>\n"); //--跳过结果--end //成功结果展示--start sb.append("<table id=\"passed\">\n"); sb.append("<tr>\n<td colspan=7 align=\"left\" style=\"color:green;font-size:14px;font-weight:bold\">成功测试用例</td>\n</tr>\n"); sb.append("<tr>\n<td width=\"2%\" class=\"SEQ\">序号</td>\n"); sb.append("<td width=\"5%\" class=\"case_funtcion_td\">功能模块</td>\n"); sb.append("<td width=\"20%\" class=\"case_name_td\">用例名称</td>\n"); sb.append("<td width=\"43%\" colspan=2 align=\"left\">测试结果</td>\n"); sb.append("<td width=\"20%\" class=\"case_result_beizhu_td\">备注</td>\n"); sb.append("<td width=\"10%\" class=\"case_time\">耗时</td>\n"); sb.append("<tr>\n"); //for (ITestResult passresult : passArrayList) for (int i = 0; i < passArrayList.size(); i++) { if(sb.length()!=0){ sb.append("\r\n"); } float t=passArrayList.get(i).getEndMillis()-passArrayList.get(i).getStartMillis(); String testMethodFullName=passArrayList.get(i).getTestClass().getName()+"."+passArrayList.get(i).getMethod().getMethodName(); if (!passArrayList.get(i).getMethod().getDescription().isEmpty()) { if (passArrayList.get(i).getParameters().length>0) { sb.append("<tr id=\""+testMethodFullName+"."+passArrayList.get(i).getEndMillis()+"\">\n"); sb.append("<td class=\"SEQ\">"+(i+1)+"</td>"); Object[] parameters=passArrayList.get(i).getParameters(); if (parameters[0].toString().contains("院")||parameters[0].toString().contains("所")||parameters[0].toString().contains("医") ||parameters[0].toString().contains("病")||parameters[0].toString().contains("治")) { sb.append("<td class=\"case_funtcion_td\">"+passArrayList.get(i).getTestContext().getName()+"</td>\n"); sb.append("<td class=\"case_name_td\">"+passArrayList.get(i).getMethod().getDescription()+":"+parameters[0].toString()+"</td>\n"); } else { sb.append("<td class=\"case_funtcion_td\">"+passArrayList.get(i).getTestContext().getName()+"</td>\n"); sb.append("<td class=\"case_name_td\">"+passArrayList.get(i).getMethod().getDescription()+"</td>\n"); } } else { sb.append("<tr id=\""+testMethodFullName+"\">\n"); sb.append("<td class=\"SEQ\">"+(i+1)+"</td>"); sb.append("<td class=\"case_funtcion_td\">"+passArrayList.get(i).getTestContext().getName()+"</td>\n"); sb.append("<td class=\"case_name_td\">"+passArrayList.get(i).getMethod().getDescription()+"</td>\n"); } sb.append(" ") .append("<td class=\"case_result_td\"><button class=\"passed_button\" id=\"passedresult_"+passArrayList.get(i).getMethod().getMethodName()+"\">"+this.getStatus(passArrayList.get(i).getStatus())+"</button><br /></td>"+"\n") .append("<td class=\"case_result_info_td\">") .append("<span class=\"passed_info\" id=\"passedresult_"+passArrayList.get(i).getMethod().getMethodName()+"_info\" style=\"display:none\" "+">") /*.append("method:"+testMethodFullName+"<br />\n") .append("start_time:"+this.formatDate(passArrayList.get(i).getStartMillis())+"<br />\n") .append("time:"+Float.toString(t)+"毫秒"+"<br />\n")*/ .append("检查点:<br />\n") .append("</span>\n<div class=\"passed_info_div\"></div></td>\n"); if (passArrayList.get(i).getParameters().length>0) { sb.append("<td class=\"case_result_beizhu_td\">"+"输入数据:"+passArrayList.get(i).getParameters()[0]+"</td>\n"); } else { sb.append("<td class=\"case_result_beizhu_td\">"+"输入数据:无"+"</td>\n"); } sb.append("<td class=\"case_time_td\">"+formateTime((long) t)+"</td>\n"); //点击成功按钮,弹出成功信息 sb.append("<td colspan=\"3\" style=\"display:none\">"+""+"</td>\n"); sb.append("</tr>\n"); } } if(sb.length()!=0){ sb.append("\r\n"); } sb.append("</table>\n"); //成功结果展示--end //失败结果展示--start sb.append("<table id=\"failed\">\n"); sb.append("<tr>\n<td colspan=7 align=\"left\" style=\"color:red;font-size:14px;font-weight:bold\">失败测试用例</td>\n</tr>\n"); sb.append("<tr>"); sb.append("<td width=\"2%\" class=\"SEQ\">序号</td>\n"); sb.append("<td width=\"5%\" class=\"case_funtcion_td\">功能模块</td>\n"); sb.append("<td width=\"20%\" class=\"case_name_td\">用例名称</td>\n"); sb.append("<td width=\"43%\" colspan=2 align=\"left\">测试结果</td>\n"); sb.append("<td width=\"20%\" class=\"case_result_beizhu_td\">备注</td>\n"); sb.append("<td width=\"10%\" class=\"case_time\">耗时</td>\n"); sb.append("</tr>\n"); for (int j = 0; j < failedArrayList.size(); j++) { if(sb.length()!=0){ sb.append("\r\n"); } float t=failedArrayList.get(j).getEndMillis()-failedArrayList.get(j).getStartMillis(); String testMethodFullName=failedArrayList.get(j).getTestClass().getName()+"."+failedArrayList.get(j).getMethod().getMethodName(); if (!failedArrayList.get(j).getMethod().getDescription().isEmpty()) { if (failedArrayList.get(j).getParameters().length>0) { sb.append("<tr id=\""+testMethodFullName+"."+failedArrayList.get(j).getEndMillis()+"\">\n"); sb.append("<td class=\"SEQ\">"+(j+1)+"</td>"); Object[] parameters=failedArrayList.get(j).getParameters(); if (parameters[0].toString().contains("院")||parameters[0].toString().contains("所")||parameters[0].toString().contains("医") ||parameters[0].toString().contains("病")||parameters[0].toString().contains("治")) { sb.append("<td class=\"case_funtcion_td\">"+failedArrayList.get(j).getTestContext().getName()+"</td>\n"); sb.append("<td class=\"case_name_td\">"+failedArrayList.get(j).getMethod().getDescription()+":"+parameters[0].toString()+"</td>\n"); } else { sb.append("<td class=\"case_funtcion_td\">"+failedArrayList.get(j).getTestContext().getName()+"</td>\n"); sb.append("<td class=\"case_name_td\">"+failedArrayList.get(j).getMethod().getDescription()+"</td>\n"); } } else { sb.append("<tr id=\""+testMethodFullName+"\">\n"); sb.append("<td class=\"SEQ\">"+(j+1)+"</td>"); sb.append("<td class=\"case_funtcion_td\">"+failedArrayList.get(j).getTestContext().getName()+"</td>\n"); sb.append("<td class=\"case_name_td\">"+failedArrayList.get(j).getMethod().getDescription()+"</td>\n"); } sb.append(" ") .append("<td class=\"case_result_td\" ><button class=\"failed_button\" id=\"failedresult_"+failedArrayList.get(j).getMethod().getMethodName()+"\">"+this.getStatus(failedArrayList.get(j).getStatus())+"</button><br /></td>"+"\n") .append("<td class=\"case_result_info_td\">") .append("<span class=\"failed_info\" id=\"failedresult_"+failedArrayList.get(j).getMethod().getMethodName()+"_info\" style=\"display:none\" "+">") /*.append("method:"+testMethodFullName+"<br />\n") .append("start_time:"+this.formatDate(failedArrayList.get(j).getStartMillis())+"<br />\n") .append("time:"+Float.toString(t)+"毫秒"+"<br />\n")*/ .append("检查点:<br />\n") .append("</span><div class=\"failed_info_div\"></div></td>\n"); if (failedArrayList.get(j).getParameters().length>0) { sb.append("<td class=\"case_result_beizhu_td\">"+"输入数据:"+failedArrayList.get(j).getParameters()[0]+"</td>\n"); } else { sb.append("<td class=\"case_result_beizhu_td\">"+"输入数据:无"+"</td>\n"); } sb.append("<td class=\"case_time_td\">"+formateTime((long) t)+"</td>\n"); //点击失败按钮,弹出失败信息 sb.append("<td colspan=\"3\" style=\"display:none\">") .append("</td>\n") .append("</tr>\n"); } } //失败结果展示--end sb.append("</table>\n</div>\n"); sb.append("</div>\n" +"<span style=\"font-size:14px;margin-top:5px\" >温馨提示:点击按钮展开详情</span>" + "<div id=\"footer\" >技术支持:Copyright © 2014 Webdriver中文社区.Inc</div>"); sb.append("</body>\n</html>\n"); /*output.write(sb.toString()); output.flush(); output.close();*/ FileManger fileManger=new FileManger(); fileManger.writeWithEncode(path,"utf-8",true,sb.toString()); /** * 发送html邮件 */ String reportUrl=null;//完整报表URL String logUrl=null;//日志url String Recipients=null; //邮件收件人地址 try { reportUrl=getTestngParametersValue(Config.path, "reportUrl"); logUrl=getTestngParametersValue(Config.path, "logUrl"); Recipients=getTestngParametersValue(Config.path, "recipients"); } catch (DocumentException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } System.out.println("报表URL"+reportUrl); System.out.println("日志URL"+logUrl); System.out.println("收件人地址"+Recipients); StringBuffer sb2=new StringBuffer(); sb2.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"); sb2.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n"); sb2.append("<meta http-equiv=\"Content-Type\"content=\"text/html; charset=gbk\" />\n"); sb2.append("<title>" + reportTitle + "</title>\n"); sb2.append("</head>\n"); sb2.append("<body>\n"); sb2.append("<div id=\"content\">\n"); sb2.append("<div id=\"report_title\">\n"); sb2.append("<div id=\"logo\"><img src=\"http://218.17.157.250:8848/logo1.png\"></img></div>\n"); sb2.append("<div style=\"clear:both\"><div id=\"time\">\n"); sb2.append("<div style=\"pading-top:20px\">开始时间:" + this.formatDate(fullResults.get(0).getStartMillis()) + "</div>\n"); sb2.append("<div>结束时间:" + this.formatDate(fullResults.get(fullResults.size()-1).getEndMillis()) + " </div>\n"); sb2.append("<div>用    时:" +formateTime(fullResults.get(fullResults.size()-1).getEndMillis()-fullResults.get(0).getStartMillis()) + "</div>\n"); sb2.append("</div>\n"); sb2.append("</div>\n"); sb2.append("</div>"); sb2.append("<div id=\"header_right\" >\n"); sb2.append("<div id=\"title\">\n"); sb2.append("<div style=\"text-align:center\">" + reportTitle + "</div>\n"); sb2.append("</div>\n"); sb2.append("</div>\n"); sb2.append("<div id=\"report_total\">\n"); sb2.append("<div>(<span style=\"color:green\">绿色字体pass用例</span><span style=\"color:red\">红色字体failed用例</span><span style=\"color:gray\">灰色字体skip用例</span>)<span style=\" margin-left:20px\"><a href=\" " +reportUrl + "\">点击查看完整报表</a></span><span style=\"margin-left:14px\"><a href=\"" +logUrl + "\"></a></span></div>\n"); sb2.append("<table width=\"100%\" style=\"width:100%;text-align:left;border-collapse:collapse;border-spacing:0;font-size:12px;\" >\n"); sb2.append("<tr>\n" + "<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" width=\"18%\"><div align=\"center\">用例总数</div></td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" width=\"22%\" align=\"center\"><div align=\"center\">通过数(pass)</div></td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" width=\"21%\" align=\"center\"><div align=\"center\">失败数(failed)</div></td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" width=\"21%\" align=\"center\"><div align=\"center\">跳过数(skip)</div></td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" width=\"18%\" align=\"center\"><div align=\"center\">通过率</div></td>\n</tr>\n"); sb2.append(" <tr >\n<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" ><div align=\"center\">"); sb2.append("<label style=\"color:blue\" id=\"total_num\">"); sb2.append(passArrayList.size()+failedArrayList.size()+skipArrayList.size()); sb2.append("</label>"); sb2.append("</div></td>\n<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\"><div align=\"center\">"); sb2.append("<label style=\"color:green\" id=\"passed_num\"" + "value=\"" + passArrayList.size() + "\">"); sb2.append(passArrayList.size()); sb2.append("</label>"); sb2.append("</div></td>\n <td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\"><div align=\"center\">"); sb2.append("<label style=\"color:red\" id=\"failed_num\"" + "value=\"" + failedArrayList.size() + "\">"); sb2.append(failedArrayList.size()); sb2.append("</label>"); sb2.append("</div></td>\n<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\"><div align=\"center\">"); sb2.append("<label style=\"color:gray\" id=\"skiped_num\"" + "value=\"" +skipArrayList.size() + "\">"); sb2.append(skipArrayList.size()); sb2.append("</label>"); sb2.append("</div></td>\n<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\"><div align=\"center\">"); DecimalFormat dfDecimalFormat1=new DecimalFormat("######0.00"); float total1=passArrayList.size()+failedArrayList.size()+skipArrayList.size(); float s1=passArrayList.size()/total1; sb2.append(dfDecimalFormat1.format(s1*100)); sb2.append("%"); sb2.append("</div></td>\n</tr>\n</table>\n"); //报表标题 /** * 报表标题 */ sb2.append("<table style=\"width:100%;text-align:left;border-collapse:collapse;border-spacing:0;font-size:10px;\">\n"); sb2.append("<tr>\n<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" width=\"2%\" class=\"SEQ\">序号</td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" width=\"17%\" class=\"case_funtcion_td\">功能模块</td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" width=\"22%\" class=\"case_name_td\">用例名称</td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" width=\"3%\" align=\"left\">测试结果</td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" width=\"28%\" class=\"case_result_beizhu_td\">备注</td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" width=\"28%\" class=\"case_time\">耗时</td>\n"); sb2.append("</tr>\n"); /** * 失败测试用例展示 */ for (int j = 0; j < failedArrayList.size(); j++) { if(sb.length()!=0){ sb2.append("\r\n"); } float t=failedArrayList.get(j).getEndMillis()-failedArrayList.get(j).getStartMillis(); String testMethodFullName=failedArrayList.get(j).getTestClass().getName()+"."+failedArrayList.get(j).getMethod().getMethodName(); if (!failedArrayList.get(j).getMethod().getDescription().isEmpty()) { if (failedArrayList.get(j).getParameters().length>0) { sb2.append("<tr style=\"color:red\" id=\""+testMethodFullName+"."+failedArrayList.get(j).getEndMillis()+"\">\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"SEQ\">"+(j+1)+"</td>"); Object[] parameters=failedArrayList.get(j).getParameters(); if (parameters[0].toString().contains("院")||parameters[0].toString().contains("所")||parameters[0].toString().contains("医") ||parameters[0].toString().contains("病")||parameters[0].toString().contains("治")) { sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_funtcion_td\">"+failedArrayList.get(j).getTestContext().getName()+"</td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_name_td\">"+failedArrayList.get(j).getMethod().getDescription()+":"+parameters[0].toString()+"</td>\n"); } else { sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_funtcion_td\">"+failedArrayList.get(j).getTestContext().getName()+"</td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_name_td\">"+failedArrayList.get(j).getMethod().getDescription()+"</td>\n"); } } else { sb2.append("<tr style=\"color:red\" id=\""+testMethodFullName+"\">\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"SEQ\">"+(j+1)+"</td>"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_funtcion_td\">"+failedArrayList.get(j).getTestContext().getName()+"</td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_name_td\">"+failedArrayList.get(j).getMethod().getDescription()+"</td>\n"); } sb2.append(" ") .append("<td class=\"case_result_td\" ><label class=\"failed_label\" id=\"failedresult_"+failedArrayList.get(j).getMethod().getMethodName()+"\">"+this.getStatus(failedArrayList.get(j).getStatus())+"</label><br /></td>"+"\n"); if (failedArrayList.get(j).getParameters().length>0) { sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_result_beizhu_td\">"+"输入数据:"+failedArrayList.get(j).getParameters()[0]+"</td>\n"); } else { sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_result_beizhu_td\">"+"输入数据:无"+"</td>\n"); } sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_time_td\">"+formateTime((long) t)+"</td>\n"); //点击失败按钮,弹出失败信息 sb2.append("<td colspan=\"3\" style=\"display:none\">") .append("</td>\n") .append("</tr>\n"); } } //失败结果展示--end //成功结果展示--start /** * 成功结果展示 */ for (int i =0; i <passArrayList.size(); i++) { if(sb.length()!=0){ sb2.append("\r\n"); } float t=passArrayList.get(i).getEndMillis()-passArrayList.get(i).getStartMillis(); String testMethodFullName=passArrayList.get(i).getTestClass().getName()+"."+passArrayList.get(i).getMethod().getMethodName(); if (!passArrayList.get(i).getMethod().getDescription().isEmpty()) { if (passArrayList.get(i).getParameters().length>0) { sb2.append("<tr style=\"color:green\" id=\""+testMethodFullName+"."+passArrayList.get(i).getEndMillis()+"\">\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"SEQ\">"+(i+failedArrayList.size()+1)+"</td>"); Object[] parameters=passArrayList.get(i).getParameters(); if (parameters[0].toString().contains("院")||parameters[0].toString().contains("所")||parameters[0].toString().contains("医") ||parameters[0].toString().contains("病")||parameters[0].toString().contains("治")) { sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_funtcion_td\">"+passArrayList.get(i).getTestContext().getName()+"</td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_name_td\">"+passArrayList.get(i).getMethod().getDescription()+":"+parameters[0].toString()+"</td>\n"); } else { sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_funtcion_td\">"+passArrayList.get(i).getTestContext().getName()+"</td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_name_td\">"+passArrayList.get(i).getMethod().getDescription()+"</td>\n"); } } else { sb2.append("<tr style=\"color:green\" id=\""+testMethodFullName+"\">\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"SEQ\">"+(i+failedArrayList.size()+1)+"</td>"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_funtcion_td\">"+passArrayList.get(i).getTestContext().getName()+"</td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_name_td\">"+passArrayList.get(i).getMethod().getDescription()+"</td>\n"); } sb2.append(" ") .append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_result_td\"><label class=\"passed_label\" id=\"passedresult_"+passArrayList.get(i).getMethod().getMethodName()+"\">"+this.getStatus(passArrayList.get(i).getStatus())+"</label><br /></td>"+"\n"); if (passArrayList.get(i).getParameters().length>0) { sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_result_beizhu_td\">"+"输入数据:"+passArrayList.get(i).getParameters()[0]+"</td>\n"); } else { sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_result_beizhu_td\">"+"输入数据:无"+"</td>\n"); } sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_time_td\">"+formateTime((long) t)+"</td>\n"); sb2.append("</tr>\n"); } } if(sb.length()!=0){ sb2.append("\r\n"); } /* sb2.append("</table>\n");*/ //成功结果展示--end //--跳过结果展示--start /** * 跳过结果展示 */ for (int j = 0; j < skipArrayList.size(); j++) { if(sb.length()!=0){ sb2.append("\r\n"); } float t=skipArrayList.get(j).getEndMillis()-skipArrayList.get(j).getStartMillis(); String testMethodFullName=skipArrayList.get(j).getTestClass().getName()+"."+skipArrayList.get(j).getMethod().getMethodName(); if (!skipArrayList.get(j).getMethod().getDescription().isEmpty()) { if (skipArrayList.get(j).getParameters().length>0) { sb2.append("<tr style=\"color:gray\" id=\""+testMethodFullName+"."+skipArrayList.get(j).getEndMillis()+"\">\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"SEQ\">"+(j+failedArrayList.size()+passArrayList.size()+1)+"</td>"); Object[] parameters=skipArrayList.get(j).getParameters(); if (parameters[0].toString().contains("院")||parameters[0].toString().contains("所")||parameters[0].toString().contains("医") ||parameters[0].toString().contains("病")||parameters[0].toString().contains("治")) { sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_funtcion_td\">"+skipArrayList.get(j).getTestContext().getName()+"</td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_name_td\">"+skipArrayList.get(j).getMethod().getDescription()+":"+parameters[0].toString()+"</td>\n"); } else { sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_funtcion_td\">"+skipArrayList.get(j).getTestContext().getName()+"</td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_name_td\">"+skipArrayList.get(j).getMethod().getDescription()+"</td>\n"); } } else { sb2.append("<tr style=\"color:gray\" id=\""+testMethodFullName+"\">\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"SEQ\">"+(j+fullResults.size()+passArrayList.size()+1)+"</td>"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_funtcion_td\">"+skipArrayList.get(j).getTestContext().getName()+"</td>\n"); sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_name_td\">"+skipArrayList.get(j).getMethod().getDescription()+"</td>\n"); } sb2.append(" "); if (skipArrayList.get(j).getParameters().length>0) { sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_result_beizhu_td\">"+"输入数据:"+skipArrayList.get(j).getParameters()[0]+"</td>\n"); } else { sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_result_beizhu_td\">"+"输入数据:无"+"</td>\n"); } sb2.append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" class=\"case_time_td\">"+formateTime((long) t)+"</td>\n") .append("<td style=\"border:1.5px;border-color:gray; word-break:break-all;border-style: solid;height:20px;\" colspan=\"3\" style=\"display:none\">"+""+"</td>\n") .append("</tr>\n"); } } if(sb.length()!=0){ sb2.append("\r\n"); } sb2.append("</table>\n"); //--跳过结果--end sb2.append("</table>\n</div>\n"); sb2.append("</div>\n" + "<div id=\"footer\" style=\"font-size:14px\" >技术支持:Copyright © 2014 Webdriver中文社区.Inc</div>"); sb2.append("</body>\n</html>\n"); System.out.println("收件人地址:"+Recipients); SendMail sendMail=new SendMail(); String smtpUserName=""; String smtpPassWord=""; String smtpHost=""; String smtpPort=""; String mailTitle=""; try { smtpUserName=getTestngParametersValue(Config.path,"smtpUserName"); smtpPassWord=getTestngParametersValue(Config.path,"smtpPassWord"); smtpHost=getTestngParametersValue(Config.path,"smtpHost"); smtpHost=getTestngParametersValue(Config.path,"smtpHost"); mailTitle=getTestngParametersValue(Config.path,"mailTitle"); } catch (DocumentException e) { e.printStackTrace(); } sendMail.sendmessage(smtpUserName,smtpPassWord, smtpHost, smtpPort, smtpUserName,Recipients,mailTitle, sb2.toString()); //--发送html报表邮件--结束 } catch (IOException e) { e.printStackTrace(); } } private String getStatus(int status){ String statusString = null; switch (status) { case 1: statusString = "p"; break; case 2: statusString = "f"; break; case 3: statusString = "s"; break; default: break; } return statusString; } private String formatDate(long date){ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return formatter.format(date); } public static String formatDate(Date date) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HHmmssSSS"); return formatter.format(date).toString(); } public static String formateTime(long ms) { Integer ss = 1000; Integer mi = ss * 60; Integer hh = mi * 60; Integer dd = hh * 24; Long day = ms / dd; Long hour = (ms - day * dd) / hh; Long minute = (ms - day * dd - hour * hh) / mi; Long second = (ms - day * dd - hour * hh - minute * mi) / ss; Long milliSecond = ms - day * dd - hour * hh - minute * mi - second * ss; StringBuffer sb = new StringBuffer(); if(day > 0) { sb.append(day+"天"); } if(hour > 0) { sb.append(hour+"小时"); } if(minute > 0) { sb.append(minute+"分"); } if(second > 0) { sb.append(second+"秒"); } if(milliSecond > 0) { sb.append(milliSecond+"毫秒"); } return sb.toString(); } private String getTestngParametersValue(String path,String ParametersName) throws DocumentException, IOException { File file = new File(path); if (!file.exists()) { throw new IOException("Can't find " + path); } String value=null; SAXReader reader = new SAXReader(); Document document = reader.read(file); Element root = document.getRootElement(); for (Iterator<?> i = root.elementIterator(); i.hasNext();) { Element page = (Element) i.next(); if(page.attributeCount()>0) { if (page.attribute(0).getValue().equalsIgnoreCase(ParametersName)) { value=page.attribute(1).getValue(); //System.out.println(page.attribute(1).getValue()); } continue; } //continue; } return value; } }