1
0

geneHTML.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. /**
  3. * 使用注意事项:一般情况下不会所产生的测试结果表格内容不会有问题,
  4. * 问题的引入是没有对每次添加的数据做浏览器判断,在正常情况下浏览器的顺序恒定不变的
  5. * 当不同浏览器运行的测试内容不同的情况下,如ie8下采用filter=baidu.fx,
  6. * 而chrome下采用filter=baidu.fx.collaplse
  7. * 在添加浏览器的时候按照顺序会先添加chrome,再添加ie8
  8. * 那么当chrome下用例只有baidu.fx.collapse的时候,
  9. * 由于他会默认先找到的浏览器为chrome,那么与它相邻的ie8的baidu.fx.current的内容会左移到chrome下。
  10. * 这个跟存储数据的格式有关系:caseList
  11. * / \
  12. * baidu.fx.collapse baidu.fx.current
  13. * / \ / \
  14. * chrome ie8 null ie8
  15. * / | \ / | \ (supposed / | \
  16. * fail total hostInfo to be chrome) fail total hostInfo
  17. *
  18. *
  19. *
  20. * 不直接使用<style type ="text/css">来设置css是因为有的邮件客户端会过滤这样的信息
  21. *
  22. * ***/
  23. function geneHTML($caseList, $name=''){
  24. date_default_timezone_set('PRC');
  25. // $url = (isset ($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '') . $_SERVER['PHP_SELF'];
  26. $url ="";
  27. $html = "<!DOCTYPE><html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
  28. <style>td, th {border: 1px solid black;}</style></head><body><div>
  29. <h2 align='center'>自动化用例测试结果".date('Y-m-d H:i:s')."</h2>
  30. <a href='http://$url/../../../../report/base/$name' style='font:normal bolder 12pt Arial' title='效果应该比邮件好'>网页版</a>
  31. <table align='center' cellspacing='0' style='font:normal bolder 12pt Arial;border: 1px solid black; color: #000000; background-color: #F0FFFF; text-align: center;'>
  32. <tr><th colspan='16'>fail的用例统计</th></tr><tr><th rowspan='2'>用例名称</th>".getTrCase($caseList,true,1)."</table><p><br/></p>
  33. <table align='center' cellspacing='0' style='font:normal bolder 12pt Arial;border: 1px solid black; color: #000000; background-color: #F0FFFF; text-align: center;'>
  34. <tr><th colspan='17'>全部用例统计</th></tr><tr><th rowspan='2'>用例名称</th>".getTrCase($caseList,false,1)."<tr><th colspan='17'>未覆盖到的用例</th></tr>".getTrCase($caseList,false,0)."</table></div></body></html>";
  35. // ."</table></div>"._srcOnlyList()."</body></html>"
  36. return $html;
  37. }
  38. /**
  39. * 创建遗漏用例列表
  40. * FIXME: 需要过滤package类型,考虑使用js名称同名目录存在进行过滤或者白名单
  41. */
  42. function _srcOnlyList(){
  43. require 'case.class.php';
  44. $list = Kiss::listSrcOnly(false);
  45. $len = sizeof($list);
  46. $flag="<table cellspacing='0' style='border: 1px solid black; "
  47. ."color: #fff; background-color: #0d3349; "
  48. ."text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; "
  49. ."text-align: center;'><thead><tr><th>遗漏列表:总计$len,未过滤无需用例的package类型</th></tr><tr><td>";
  50. $flag.=implode("</td></tr><tr><td>", $list);
  51. $flag.="</tr></table>";
  52. return $flag;
  53. }
  54. /**
  55. *
  56. * 根据实际浏览器书目确认生成表头
  57. * @param unknown_type $caseList
  58. */
  59. function getThBrowser($caseList){
  60. //创建浏览器相关单元格
  61. $thBrowser = '';
  62. $count = 0;
  63. foreach ($caseList as $casename => $casedetail) {
  64. //每一个用例
  65. foreach ($casedetail as $b => $info) {
  66. $thBrowser .= "<th colspan='3'>$b</th>";
  67. $count++;
  68. }
  69. $thBrowser .="</tr><tr>";
  70. break;//遍历一次就知道所有浏览器的信息
  71. }
  72. for($index = 0; $index < $count; $index++) {
  73. $thBrowser .= "<td>cov</td><td>fail</td><td>total</td>";
  74. }
  75. return $thBrowser."</tr>";
  76. }
  77. /**
  78. *
  79. * 根据执行结果生成单元格信息
  80. * @param unknown_type $caseList
  81. */
  82. function getTrCase($caseList,$onlyFail,$onlyCoverd){
  83. //$onlyFail 为真时,只显示 fail 的用例
  84. //$onlyCoverd 为0时,只显示全浏览器覆盖率为0的用例;为1时,只显示全浏览器覆盖率不为0的用例;为其他时,显示所有的用例
  85. //创建case名对应的单元格
  86. $totalTrCase = '';
  87. require_once 'config.php';
  88. $rowColor = '#B0E0E6';//标记行的颜色,单双数行显示的背景颜色不同
  89. $numBro = count(Config::getBrowserSet($configBrowserSet));
  90. $averageCov = 0;//所有用例的全浏览器覆盖率的平均值(全浏览器覆盖率为0的不计)
  91. $numCov = 0;//全浏览器覆盖率不为0的用例数量
  92. foreach ($caseList as $casename => $caseDetail) {
  93. //每一个用例
  94. $ifFail = false;
  95. $cnurl = implode('.', explode('_', $casename));
  96. $trCase = '';
  97. $totalCov = calTotalCov($caseDetail,$numBro);
  98. $averageCov +=$totalCov;
  99. $numCov = $totalCov==0?$numCov:$numCov+1;
  100. if(($onlyCoverd==0&&$totalCov!=0)||($onlyCoverd==1&&$totalCov==0))//$onlyCoverd 为0时,只显示全浏览器覆盖率为0的用例;为1时,只显示全浏览器覆盖率不为0的用例;
  101. continue;
  102. if(!$onlyFail){//对于展示 fail 的用例的列表,不显示全浏览器覆盖率
  103. $trCase .= "<td title='全浏览器覆盖率'>".$totalCov.($totalCov=="_"?"":"%")."</td>";
  104. }
  105. foreach ($caseDetail as $br => $infos) {
  106. //$b为browser名字,$info为详细信息
  107. $fail = $infos['fail'];
  108. $ifFail = $fail==0?$ifFail:true;
  109. $total = $infos['total'];
  110. $cov = $infos['cov'];
  111. $color = $fail == 0 ? $rowColor : '#CD5C5C';
  112. $PercentSign = $cov=='_'?'':'%';
  113. $trCase .= "<td style='background-color:".$color."'>".$cov.$PercentSign."</td><td style='background-color:".$color."'>".$fail."</td><td style='background-color:".$color."'>".$total."</td>";
  114. }
  115. $trCase ="<tr style='background-color:$rowColor'><td><a href='http://../run.php?case=$cnurl'>运行</a>$casename</td>".$trCase."</tr>";
  116. if(!$onlyFail||$ifFail){
  117. $totalTrCase =$totalTrCase.$trCase;
  118. $rowColor = $rowColor=='#F0FFFF'?'#B0E0E6':'#F0FFFF';
  119. }
  120. else;
  121. }
  122. $averageCov = number_format($averageCov/$numCov,1);
  123. if($onlyCoverd==0)
  124. $tableContent = $totalTrCase;
  125. elseif(!$onlyFail)
  126. $tableContent = "<th rowspan='2'>总覆盖率<br>(平均值:".$averageCov."%)</th>".getThBrowser($caseList).$totalTrCase;
  127. else
  128. $tableContent = getThBrowser($caseList).$totalTrCase;
  129. return $tableContent;
  130. }
  131. /**
  132. *
  133. * 计算总覆盖率信息
  134. * @param unknown_type $caseDetail
  135. * @param unknown_type $brcount
  136. */
  137. function calTotalCov($caseDetail,$brcount){
  138. $length = -1;
  139. $num_statements = 0;
  140. $num_executed = 0;
  141. $totalInfo = null;//数组,记录全浏览器的覆盖情况,对文件中的每一行:覆盖为1,没覆盖为0,不计数为2
  142. $flag = 1;//$flag==-1时,各个浏览器覆盖率记录的文件信息有冲突,不能计算出全浏览器覆盖率(统计的文件长度不同/标记为2的不计入统计的行信息不同)
  143. foreach ($caseDetail as $caseInfo){
  144. //如果recordCovForBrowser为空,跳过这个$caseInfo
  145. if($caseInfo['recordCovForBrowser']==''){
  146. continue;
  147. }
  148. $infos = explode(',',$caseInfo['recordCovForBrowser']);
  149. $length = ($length==-1||$length==count($infos))?count($infos):-1;
  150. if($length==-1||$length!=count($infos))
  151. break;//统计的文件长度不同
  152. else
  153. ;
  154. if($totalInfo==null){
  155. // if(count($infos)==1){
  156. // $flag = 0;//没有覆盖率信息
  157. // break;
  158. // }
  159. for($i=0;$i<count($infos);$i++){
  160. $totalInfo[$i] = $infos[$i];
  161. }
  162. }
  163. else{
  164. for($i=0;$i<count($infos);$i++){
  165. if($totalInfo[$i]==2){
  166. continue;
  167. }
  168. elseif($infos[$i]==2){
  169. $flag = -1;//标记为2的不计入统计的行信息不同
  170. break;
  171. }
  172. elseif($totalInfo[$i]==0&&$infos[$i]==1){
  173. $totalInfo[$i] = 1;
  174. }
  175. else;
  176. }
  177. if($flag==-1){
  178. break;
  179. }
  180. }
  181. }
  182. if($flag==-1)//各个浏览器的统计信息有矛盾
  183. $totalCov = "fail";
  184. elseif($length==-1||$totalInfo==null)//没有覆盖率信息
  185. $totalCov = "_";
  186. else{
  187. for($i=0;$i<count($totalInfo);$i++){
  188. if($totalInfo[$i]==0)
  189. $num_statements++;
  190. elseif($totalInfo[$i]==1){
  191. $num_statements++;
  192. $num_executed++;
  193. }
  194. else;
  195. }
  196. $totalCov = number_format(100*($num_executed/$num_statements),1);
  197. }
  198. return $totalCov;
  199. }
  200. ?>