run.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. /**
  2. * Created with JetBrains PhpStorm.
  3. * User: dongyancen
  4. * Date: 13-10-11
  5. * Time: 下午6:52
  6. * To change this template use File | Settings | File Templates.
  7. */
  8. /**
  9. * 为批量运行提供入口,参数携带batchrun=true
  10. */
  11. function run(kiss,runnext) {
  12. window.document.title = kiss;
  13. var wb = window.brtest = window.brtest || {};
  14. triggerEvent.call(wb);
  15. wb.timeout = wb.timeout || 60000;
  16. wb.breakOnError = /breakonerror=true/gi.test(location.search)
  17. || document.getElementById('id_control_breakonerror').checked;
  18. wb.runnext = /batchrun=true/gi.test(location.search) || runnext
  19. || document.getElementById('id_control_runnext').checked;
  20. wb.kiss = kiss;
  21. var cid = 'id_case_' + kiss.split('.').join('_');
  22. /* 只有参数有showsrconly的时候才显示div */
  23. if (/showsrconly=true/gi.test(location.search)) {
  24. var div = document.getElementById('id_showSrcOnly');
  25. div.style.display = 'block';
  26. }
  27. /* id中由于嵌入用例名称,可能存在导致通过id直接$无法正确获取元素的情况 */
  28. wb.kissnode = document.getElementById(cid);
  29. wb.kisses = wb.kisses || {};
  30. // 把没有用例的情况加入到报告中
  31. if (!wb.kisslost) {
  32. var as = document.getElementById('id_showSrcOnly').getElementsByTagName('a');
  33. for (var i = 0; i < as.length; i++) {
  34. wb.kisses[this.title] = '0;0;_;0;0';
  35. }
  36. wb.kisslost = true;
  37. }
  38. wb.kisscov = wb.kisscov || {};
  39. var wbkiss = wb.kisses[wb.kiss] = wb.kisses[wb.kiss] || '';
  40. /**
  41. * 超时处理
  42. */
  43. var toh = setTimeout(function () {
  44. if (!window.brtest.breakOnError)
  45. wb.customTrigger('done', [ new Date().getTime(), {
  46. failed: 1,
  47. passed: 1,
  48. detail: null,
  49. total: 0
  50. }, frames[0].$_jscoverage, 'timeout' ]);
  51. }, wb.timeout);
  52. /**
  53. * 为当前用例绑定一个一次性事件
  54. */
  55. wb.customOne('done', function (time, result, covinfo) {
  56. clearTimeout(toh);
  57. var wb = window.brtest, errornum = result.failed, allnum = result.total;
  58. wb.kissend = new Date().getTime();
  59. //todo jscoverage
  60. // if ( covinfo !== null )// 如果支持覆盖率
  61. // {
  62. // wb.kisscov[wb.kiss] = covinfo;
  63. // }
  64. removeClass(wb.kissnode, 'running_case');
  65. wb.kisses[wb.kiss] = errornum + ';' + allnum + ';_;' + wb.kissstart + ';' + wb.kissend;
  66. //todo log
  67. // var args = kiss + ': 失败/所有:' + errornum + '/' + allnum + ',耗时:' + (wb.kissend - wb.kissstart);
  68. // var html = upath + '../br/log.php?loginfo=' + args;
  69. // html += '&detail='+result.detail;
  70. // if ( errornum > 0 )
  71. // html += '&fail=true';
  72. if (errornum > 0) {
  73. addClass(wb.kissnode, 'fail_case');
  74. } else
  75. addClass(wb.kissnode, 'pass_case');
  76. if (wb.runnext && (!wb.breakOnError || parseInt(wb.kisses[wb.kiss].split(',')[0]) == 0)) {
  77. var nextA = wb.kissnode.nextSibling;
  78. if (nextA.tagName.toLowerCase() == 'a') {
  79. if (wb.kisses[nextA.title] === undefined) {
  80. run(nextA.title, wb.runnext);
  81. }
  82. // html += "&next=" + nextA.title;
  83. } else {
  84. //
  85. // /* ending 提交数据到后台 */
  86. // html += '&next=@_@end';
  87. wb.kisses['config'] = location.search.substring(1);
  88. var url = 'report.php';
  89. //todo jscoverage
  90. // covcalc();
  91. // /**
  92. // * 启动时间,结束时间,校验点失败数,校验点总数
  93. // */
  94. $.ajax({
  95. url: url,
  96. type: 'post',
  97. data: wb.kisses,
  98. success: function (msg) {
  99. /* 展示报告区 */
  100. // $('#id_reportarea').show().html(msg);
  101. },
  102. error: function (xhr, msg) {
  103. alert('fail' + msg);
  104. }
  105. });
  106. }
  107. }
  108. //todo log
  109. // te.log( html );
  110. });
  111. /**
  112. * 初始化执行区并通过嵌入iframe启动用例执行
  113. */
  114. var url = 'run.php?case=' + kiss + '&time=' + new Date().getTime() + "&"
  115. + location.search.substring(1);
  116. var fdiv = 'id_div_frame_' + kiss.split('.').join('_');
  117. var fid = 'id_frame_' + kiss.split('.').join('_');
  118. addClass(wb.kissnode, 'running_case');
  119. /* 隐藏报告区 */
  120. // $( 'div#id_reportarea' ).empty().hide();
  121. /* 展示执行区 */
  122. var runningarea = document.getElementById('id_runningarea');
  123. empty(runningarea).style.display = 'block';
  124. var iframe = document.createElement('iframe');
  125. iframe.id = fid;
  126. iframe.src = url;
  127. iframe.style.minHeight="1500px";
  128. addClass(iframe, "runningframe");
  129. runningarea.appendChild(iframe);
  130. wb.kissstart = new Date().getTime();
  131. };
  132. // 需要根据一次批量执行整合所有文件的覆盖率情况
  133. //function covcalc() {
  134. // function covmerge(cc, covinfo) {
  135. // for (var key in covinfo) {//key :每个文件
  136. // for (var idx in covinfo[key]) {
  137. // if (idx != 'source') {
  138. //
  139. // cc[key] = cc[key] || [];
  140. // cc[key][idx] = (cc[key][idx] || 0) + covinfo[key][idx];
  141. // }
  142. // }
  143. // }
  144. // return cc;
  145. // }
  146. //
  147. // var cc = {};
  148. // var brkisses = window.brtest.kisses;
  149. // for (var key in window.brtest.kisscov) {
  150. // covmerge(cc, window.brtest.kisscov[key]);//key:每个用例
  151. //// brkisses[kiss]= brkisses[kiss] + ',' + key;
  152. // }
  153. // var file;
  154. // var files = [];
  155. // var filter = '';
  156. // var ls = location.search.split('&');
  157. // for (var i = 0; i < ls.length; i++) {
  158. // if (ls[i].indexOf('filter') != -1) {
  159. // filter = ls[i].split('=')[1];
  160. // }
  161. //
  162. // }
  163. // for (file in cc) {
  164. // if (!cc.hasOwnProperty(file)) {
  165. // continue;
  166. // }
  167. // if (file.indexOf(filter) != -1)
  168. // files.push(file);
  169. // }
  170. // files.sort();
  171. // for (var f = 0; f < files.length; f++) {
  172. // file = files[f];
  173. // var lineNumber;
  174. // var num_statements = 0;
  175. // var num_executed = 0;
  176. // var missing = [];
  177. // var fileCC = cc[file];
  178. // var length = fileCC.length;
  179. // var currentConditionalEnd = 0;
  180. // var conditionals = null;
  181. //
  182. // if (fileCC.conditionals) {
  183. // conditionals = fileCC.conditionals;
  184. // }
  185. // var recordCovForBrowser = null;//
  186. // for (lineNumber = 0; lineNumber < length; lineNumber++) {
  187. // var n = fileCC[lineNumber];
  188. //
  189. // if (lineNumber === currentConditionalEnd) {
  190. // currentConditionalEnd = 0;
  191. // } else if (currentConditionalEnd === 0 && conditionals
  192. // && conditionals[lineNumber]) {
  193. // currentConditionalEnd = conditionals[lineNumber];
  194. // }
  195. //
  196. // if (currentConditionalEnd !== 0) {
  197. // (recordCovForBrowser == null) ? (recordCovForBrowser = '2') : (recordCovForBrowser += ',2');
  198. //
  199. // continue;
  200. // }
  201. //
  202. // if (n === undefined || n === null) {
  203. // (recordCovForBrowser == null) ? (recordCovForBrowser = '2') : (recordCovForBrowser += ',2');
  204. // continue;
  205. // }
  206. //
  207. // if (n === 0) {
  208. // (recordCovForBrowser == null) ? (recordCovForBrowser = '0') : (recordCovForBrowser += ',0');
  209. // missing.push(lineNumber);
  210. // } else {
  211. // (recordCovForBrowser == null) ? (recordCovForBrowser = '1') : (recordCovForBrowser += ',1');
  212. // num_executed++;
  213. // }
  214. // num_statements++;
  215. // }
  216. //
  217. // var percentage = (num_statements === 0 ? 0 : ( 100 * num_executed / num_statements ).toFixed(1));
  218. // var kiss = file.replace('.js', '');
  219. // // 统计所有用例的覆盖率信息和测试结果
  220. //
  221. // if (brkisses[kiss] == undefined)
  222. // brkisses[kiss] = '0;0;_;0;0';
  223. // var info = brkisses[kiss].split(';_;');// 覆盖率的处理在最后环节加入到用例的测试结果中
  224. // brkisses[kiss] = info[0] + ';' + percentage + ';' + info[1] + ';' + recordCovForBrowser;
  225. // }
  226. //}
  227. window.onload =
  228. function () {
  229. if (location.href.search("[?&,]batchrun=true") > 0
  230. || document.getElementById('id_control_runnext').checked) {
  231. run(document.getElementById('id_testlist').getElementsByTagName('a')[0].getAttribute('title'), true);
  232. }
  233. };