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 = ''+kiss + ':失败/所有:'+errornum + '/' + 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 );
}
} );