123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- function run( kiss, runnext ) {
- window.document.title = kiss;
- var wb = window.brtest = window.brtest || {};
- wb.timeout = wb.timeout || 100000;
- wb.breakOnError = /breakonerror=true/gi.test( location.search )
- || $( 'input#id_control_breakonerror' ).attr( 'checked' );
- wb.runnext = /batchrun=true/gi.test( location.search ) || runnext
- || $( 'input#id_control_runnext' ).attr( 'checked' );
- wb.kiss = kiss;
- var cid = 'id_case_' + kiss.split( '.' ).join( '_' );
- /* 只有参数有showsrconly的时候才显示div */
- if ( /showsrconly=true/gi.test( location.search ) ) {
- var div = document.getElementById( 'id_showSrcOnly' );
- div.style.display = 'block';
- }
- /* id中由于嵌入用例名称,可能存在导致通过id直接$无法正确获取元素的情况 */
- wb.kissnode = $( document.getElementById( cid ) );
- wb.kisses = wb.kisses || {};
- // 把没有用例的情况加入到报告中
- if ( !wb.kisslost ) {
- $( 'div#id_showSrcOnly a' ).each( function () {
- wb.kisses[this.title] = '0;0;_;0;0';
- } );
- wb.kisslost = true;
- }
- wb.kisscov = wb.kisscov || {};
- var wbkiss = wb.kisses[wb.kiss] = wb.kisses[wb.kiss] || '';
- /**
- * 超时处理
- */
- var toh = setTimeout( function () {
- if ( !window.brtest.breakOnError )
- $( wb ).trigger( 'done', [ new Date().getTime(), {
- failed:1,
- passed:1
- }, frames[0].$_jscoverage, 'timeout' ] );
- }, wb.timeout );
- /**
- * 为当前用例绑定一个一次性事件
- */
- $( wb ).one( 'done', function ( event, time, result, covinfo ) {
- clearTimeout( toh );
- var wb = window.brtest, errornum = result.failed, allnum = result.failed + result.passed;
- wb.kissend = new Date().getTime();
- if ( covinfo !== null )// 如果支持覆盖率
- {
- wb.kisscov[wb.kiss] = covinfo;
- }
- wb.kissnode.removeClass( 'running_case' );
- /*
- * ext_qunit.js的_d方法会触发done事件
- * top.$(wbkiss).trigger('done', [ new Date().getTime(), args ]); new Date().getTime()指向a参数,args指向b参数
- */
- wb.kisses[wb.kiss] = errornum + ';' + allnum + ';_;' + wb.kissstart + ';' + wb.kissend;
- // var html = '<strong><span style="color: red">'+kiss + '</span></strong>:失败/所有:<strong><span style="color: red">'+errornum + '</span></strong>/' + allnum + ',开始:' + wb.kissstart + ',结束:' + wb.kissend +'耗时:'+(wb.kissend-wb.kissstart) +'\n';
- var args = kiss + ': 失败/所有:' + errornum + '/' + allnum + ',耗时:' + (wb.kissend - wb.kissstart);
- var html = upath + '../br/log.php?loginfo=' + args;
- html += '&detail='+result.detail;
- if ( errornum > 0 )
- html += '&fail=true';
- if ( errornum > 0 ) {
- wb.kissnode.addClass( 'fail_case' );
- // wb.kisses[kiss + '_error'] =
- // window.frames[0].innerHTML;
- } else
- wb.kissnode.addClass( 'pass_case' );
- if ( wb.runnext && (!wb.breakOnError || parseInt( wb.kisses[wb.kiss].split( ',' )[0] ) == 0) ) {
- var nextA = wb.kissnode.next()[0];
- if ( nextA.tagName == 'A' ) {
- if ( wb.kisses[nextA.title] === undefined ) {
- run( nextA.title, wb.runnext );
- }
- html += "&next=" + nextA.title;
- } else {
- /* 隐藏执行区 */
- // $('div#id_runningarea').toggle();
- /* ending 提交数据到后台 */
- html += '&next=@_@end';
- wb.kisses['config'] = location.search.substring( 1 );
- // var url = /mail=true/.test( location.search ) ? 'record.php' : 'report.php';
- var url = 'report.php';
- covcalc();
- /**
- * 启动时间,结束时间,校验点失败数,校验点总数
- */
- $.ajax( {
- url:url,
- type:'post',
- data:wb.kisses,
- success:function ( msg ) {
- // $('#id_testlist').hide();
- /* 展示报告区 */
- $( '#id_reportarea' ).show().html( msg );
- },
- error:function ( xhr, msg ) {
- alert( 'fail' + msg );
- }
- } );
- }
- }
- te.log( html );
- } );
- /**
- * 初始化执行区并通过嵌入iframe启动用例执行
- */
- var url = 'run.php?case=' + kiss + '&time=' + new Date().getTime() + "&"
- + location.search.substring( 1 );
- // + (location.search.length > 0 ? '&' + location.search.substring(1)
- // : '');
- var fdiv = 'id_div_frame_' + kiss.split( '.' ).join( '_' );
- var fid = 'id_frame_' + kiss.split( '.' ).join( '_' );
- wb.kissnode.addClass( 'running_case' );
- if ( $( 'input#id_control_hidelist' ).attr( 'checked' ) )
- $( 'div#id_testlist' ).css( 'display', 'none' );
- /* 隐藏报告区 */
- $( 'div#id_reportarea' ).empty().hide();
- /* 展示执行区 */
- // if(ua.browser.ie){//释放iframe里面占用的内存
- // if($( 'div#id_runningarea' )[0].getElementsByTagName('iframe').length){
- // var iframe_old = $( 'div#id_runningarea' )[0].getElementsByTagName('iframe')[0];
- // iframe_old.src = "javascript:false";
- // iframe_old.contentWindow.document.write('');
- // iframe_old.contentWindow.close();
- // CollectGarbage();
- // iframe_old.parentNode.removeChild(iframe_old);
- // }
- //
- // }
- var iframe =document.createElement('iframe');
- iframe.src= url;
- iframe.id= fid;
- iframe.className= "runningframe";
- $( 'div#id_runningarea' ).empty().css( 'display', 'block' ).append( iframe);
- wb.kissstart = new Date().getTime();
- };
- function match(fileName, matcher )
- {
- if ( matcher == '*' )
- return true;
- var len = matcher.length;
- /**
- * 处理多选分支,有一个成功则成功,filter后面参数使用|切割
- * @var unknown_type
- */
- var ms = matcher.split( ',');
- if ( ms.length > 1 ) {
- //这里把或的逻辑改成与
- for ( var matcher1 in ms ) {
- if ( !match(fileName, ms[matcher1] ) )
- return false;
- }
- return true;
- }
- /**
- * 处理反向选择分支
- */
- if ( matcher.substr( 0 , 1 ) == '!' ) {
- var m = matcher.substr( 1 );
- if ( fileName.substr( 0 , m.length ) == m )
- return false;
- return true;
- }
- if ( len > fileName.length ) {
- return false;
- }
- return fileName.substr( 0 , len ) == matcher;
- }
- // 需要根据一次批量执行整合所有文件的覆盖率情况
- function covcalc() {
- function covmerge( cc, covinfo ) {
- for ( var key in covinfo ) {//key :每个文件
- for ( var idx in covinfo[key] ) {
- if ( idx != 'source' ) {
- cc[key] = cc[key] || [];
- cc[key][idx] = (cc[key][idx] || 0) + covinfo[key][idx];
- }
- }
- }
- return cc;
- }
- var cc = {};
- var brkisses = window.brtest.kisses;
- for ( var key in window.brtest.kisscov ){
- covmerge( cc, window.brtest.kisscov[key] );//key:每个用例
- // brkisses[kiss]= brkisses[kiss] + ',' + key;
- }
- var file;
- var files = [];
- var filter = '';
- var ls = location.search.split('&');
- for( var i = 0; i < ls.length; i++){
- if(ls[i].indexOf('filter')!=-1&&ls[i].indexOf('filterRun')==-1){
- filter = ls[i].split('=')[1];
- }
- }
- for ( file in cc ) {
- if ( !cc.hasOwnProperty( file ) ) {
- continue;
- }
- if(match(file,filter))
- files.push( file );
- }
- files.sort();
- for ( var f = 0; f < files.length; f++ ) {
- file = files[f];
- var lineNumber;
- var num_statements = 0;
- var num_executed = 0;
- var missing = [];
- var fileCC = cc[file];
- var length = fileCC.length;
- var currentConditionalEnd = 0;
- var conditionals = null;
- if ( fileCC.conditionals ) {
- conditionals = fileCC.conditionals;
- }
- var recordCovForBrowser = null;//
- for ( lineNumber = 0; lineNumber < length; lineNumber++ ) {
- var n = fileCC[lineNumber];
- if ( lineNumber === currentConditionalEnd ) {
- currentConditionalEnd = 0;
- } else if ( currentConditionalEnd === 0 && conditionals
- && conditionals[lineNumber] ) {
- currentConditionalEnd = conditionals[lineNumber];
- }
- if ( currentConditionalEnd !== 0 ) {
- (recordCovForBrowser==null)?(recordCovForBrowser='2'):(recordCovForBrowser +=',2');
- continue;
- }
- if ( n === undefined || n === null ) {
- (recordCovForBrowser==null)?(recordCovForBrowser='2'):(recordCovForBrowser +=',2');
- continue;
- }
- if ( n === 0 ) {
- (recordCovForBrowser==null)?(recordCovForBrowser='0'):(recordCovForBrowser +=',0');
- missing.push( lineNumber );
- } else {
- (recordCovForBrowser==null)?(recordCovForBrowser='1'):(recordCovForBrowser +=',1');
- num_executed++;
- }
- num_statements++;
- }
- var percentage = (num_statements === 0 ? 0 : ( 100* num_executed / num_statements ).toFixed(1));
- var kiss = file.replace( '.js', '' );
- // 统计所有用例的覆盖率信息和测试结果
- if ( brkisses[kiss] == undefined )
- brkisses[kiss] = '0;0;_;0;0';
- var info = brkisses[kiss].split( ';_;' );// 覆盖率的处理在最后环节加入到用例的测试结果中
- brkisses[kiss] = info[0] + ';' + percentage + ';' + info[1]+';'+recordCovForBrowser;
- }
- }
- /**
- * 为批量运行提供入口,参数携带batchrun=true
- */
- $( document ).ready(
- function () {
- if ( location.href.search( "[?&,]batchrun=true" ) > 0
- || $( 'input#id_control_runnext' ).attr( 'checked' ) ) {
- run( $( 'div#id_testlist a' ).attr( 'title' ), true );
- }
- } );
|