在一個瀏覽器里呈現(xiàn)所有瀏覽器測試結(jié)果的前端測試工具的思路
更新時間:2010年03月02日 23:09:17 作者:
對前端工程師來說,跨瀏覽器的兼容性問題一直是最頭疼的,測試一個小小的東西,就要打開N個瀏覽器,然后比較來比較去,記錄個瀏覽器的數(shù)據(jù),比較不同,實在是麻煩.
作為一個標(biāo)準(zhǔn)的絕頂?shù)膽腥?我想做一個測試工具,可以同時把所有瀏覽器的測試結(jié)果都顯示在一個瀏覽器窗口里,并且列成清晰的表格,便于比較.
這一定會是一個可愛的工具,節(jié)省時間不說,而且可以清晰的記錄和比較數(shù)據(jù).下面說一下我的思路.(之后我將使用這個工具測試一個js的兼容性問題,敬請關(guān)注)
本工具已經(jīng)制作完成,但是不具通用性,需要和后臺配合使用,需要和數(shù)據(jù)庫交互,而且后臺交互的性能不太好,普通的電腦無法承受(我的3GHZ的cpu,2G內(nèi)存都不能直接打開多個瀏覽器窗口,可能是我數(shù)據(jù)庫的操作過于頻繁).雖然放在公共服務(wù)器上速度可以接受,但是不能拿出來給大家測試,因為多個人運行,再好的服務(wù)器也受不了.
工具是js+php+mysql制作的,并不是有的人想象的把多個瀏覽器引擎整合到一個軟件里,我可沒那水平.
使用的時候,只需要在js里寫好測試數(shù)據(jù)和測試方法,傳到一個測試實例里,然后在所有瀏覽器里打開一次這個窗口,js會統(tǒng)計數(shù)據(jù),然后把數(shù)據(jù)存儲到后臺,之后js通過ajax獲取所有的數(shù)據(jù),將其解析成表格顯示在網(wǎng)頁中.最后結(jié)果是如果你的電腦夠強,所有的瀏覽器里的網(wǎng)頁都會顯示一個列表,里面有所有瀏覽器的測試數(shù)據(jù),如下:

之后就可以比較結(jié)果了.是不是很方便呢
原理:
首先將此功能抽象成一個組件,組件接受三個參數(shù),一個是輸入對象組,二是測試方法,三是組件配置參數(shù).
在之后的組件初始化階段,組件將遍歷輸入對象組中的所有對象,將對象傳給測試方法,測試方法返回一個測試數(shù)據(jù),組件將測試結(jié)果記錄在一個對象中.
/**
* 這是一個測試對象在不同瀏覽器中屬性的對象,可以同時在任何瀏覽器中測試,需要和后臺腳本交互
* 請設(shè)置好輸入數(shù)據(jù)和輸出數(shù)據(jù)后,在要測試的瀏覽器中打開頁面,結(jié)果將附加到列表中.
*
* @param {array} testObject 待測試的對象列表,每個對象都必須有一個唯一的標(biāo)示做主鍵,而且有一個描述,
* testObject的格式如下{"in1":{obj:**,des:"dd"},"in2":{obj:**,des:"dd"}}
* @param {function} testMethod 測試的方法,程序會向此方法傳入兩個參數(shù),一個是對象索引一個是對象.同時在此方法里可以用this引用test實例,此方法必須返回一個字符串,表示執(zhí)行結(jié)果
* @param {json} config 配置參數(shù)
*/
(function(){
var CrossBrowserTest=function(testObjects,testMethod,config){
這個組件對對象參數(shù)格式和組件內(nèi)的數(shù)據(jù)存儲器的格式,以及向后臺發(fā)送字符串的格式,后臺返回數(shù)據(jù)的格式有著嚴格規(guī)定:
其中:testObject的格式如下{"in1":{obj:**,des:"dd"},"in2":{obj:**,des:"dd"}}
組件內(nèi)的數(shù)據(jù)存儲器的格式如下(this.data):{“in1”:{des:”描述",data{“ie6”:{outDes:"ie6里的輸出結(jié)果"},”ie7”:{outDes:"ie7里的輸出結(jié)果"}}},"in2”:…}
在發(fā)送數(shù)據(jù)的時候,用一個函數(shù)將json轉(zhuǎn)換成字符串格式,這個函數(shù)如下:
function obj2str(o){
var r = [];
if(typeof o =="string") return "\""+o+"\"";
if(typeof o == "object"){
if(!o.sort){
r[0]="{"
for(var i in o){
r[r.length]="\""+i+"\"";
r[r.length]=":";
r[r.length]=obj2str(o[i]);
r[r.length]=",";
}
r[r.length-1]="}"
}else{
r[0]="["
for(var i =0;i<o.length;i++){
r[r.length]=obj2str(o[i]);
r[r.length]=",";
}
r[r.length-1]="]"
}
return r.join("");
}
return o.toString();
}
在后臺,php會把這個json字符串通過json_decode函數(shù)轉(zhuǎn)換成一個php的數(shù)組,之后存到數(shù)據(jù)庫里.
而從數(shù)據(jù)庫里取數(shù)據(jù)的時候,php從數(shù)據(jù)庫里取出數(shù)據(jù),轉(zhuǎn)換成數(shù)組格式,然后用json_encode函數(shù)轉(zhuǎn)換成json字符串,傳到前臺,前臺用eval執(zhí)行得到數(shù)據(jù).
在后臺,對json數(shù)據(jù)進行了分解,分解成了一條條的數(shù)據(jù),然后存到了數(shù)據(jù)庫里,這里數(shù)據(jù)庫讀取頻繁,造成性能下降.
數(shù)據(jù)庫有6個字段,分別為:主鍵,對象主鍵(區(qū)分不同的對象),瀏覽器類型(相同的對象里有不同瀏覽器的測試結(jié)果),對象的描述,測試的結(jié)果,時間.
瀏覽器的類型測試使用了下述的方法:
M.getBrowser=function(){
return {
//此函數(shù)判斷瀏覽器類型,為了簡便,返回一個數(shù)字表示,
//1.ie6;2.ie7; 3.ie8;4,Firefox;5.chrome;6.Opera;7.Safari;0.無法檢測的瀏覽器
//其他瀏覽器可以自行添加
whichOS:function(){
var useragent=navigator.userAgent.toLowerCase();
return (/MSIE 6/i.test(useragent)==true&&1)||
(/MSIE 7/i.test(useragent)==true&&2)||(/MSIE 8/i.test(useragent)==true&&3)||
(/Firefox/i.test(useragent)==true&&4)||
(/Chrome/i.test(useragent)==true&&5)||
(/Opera/i.test(useragent)==true&&6)||
(/Safari/i.test(useragent)==true&&7)||0
},
nowOsString:function(){
var useragent=navigator.userAgent.toLowerCase();
return (/MSIE 6/i.test(useragent)==true&&"ie6")||
(/MSIE 7/i.test(useragent)==true&&"ie7")||(/MSIE 8/i.test(useragent)==true&&"ie8")||
(/Firefox/i.test(useragent)==true&&"Firefox")||
(/Chrome/i.test(useragent)==true&&"Chrome")||
(/Opera/i.test(useragent)==true&&"Opera")||
(/Safari/i.test(useragent)==true&&"Safari")||"sorry,我不認識你的瀏覽器!"
}
}
}()
數(shù)據(jù)是用對象主鍵和瀏覽器類型共同區(qū)分的(可以獲取唯一的數(shù)據(jù))
對象初始化完成后,就開始處理數(shù)據(jù)了,首先在本瀏覽器里執(zhí)行一次測試,將測試數(shù)據(jù)放入一個臨時對象里,然后將這個臨時對象通過ajax發(fā)送到后臺,后臺把這條數(shù)據(jù)存到數(shù)據(jù)庫(如果已經(jīng)存在就不存儲了)
然后設(shè)置一個定時器,定時到后臺取數(shù)據(jù),這個取到的數(shù)據(jù)是后臺數(shù)據(jù)庫里存儲的,可能包括了多個的瀏覽器的數(shù)據(jù),取到數(shù)據(jù)后,啟動dom構(gòu)建函數(shù),和渲染函數(shù),更新網(wǎng)頁的內(nèi)容.
基本原理就是這樣,這樣說真是抽象的很,但是很抱歉,這個東西沒法拿出來跟大家分享,不是我不想分享,是實在是有困難.不過如果你感興趣可以下載源代碼,將源代碼里的sql導(dǎo)入到一個mysql表里,然后在php文件里配置下,修改下,我這個封裝的不是很好,因為考慮到這個東西的重用性也不用太好了.沒時間搞別的了.
測試代碼打包下載
這一定會是一個可愛的工具,節(jié)省時間不說,而且可以清晰的記錄和比較數(shù)據(jù).下面說一下我的思路.(之后我將使用這個工具測試一個js的兼容性問題,敬請關(guān)注)
本工具已經(jīng)制作完成,但是不具通用性,需要和后臺配合使用,需要和數(shù)據(jù)庫交互,而且后臺交互的性能不太好,普通的電腦無法承受(我的3GHZ的cpu,2G內(nèi)存都不能直接打開多個瀏覽器窗口,可能是我數(shù)據(jù)庫的操作過于頻繁).雖然放在公共服務(wù)器上速度可以接受,但是不能拿出來給大家測試,因為多個人運行,再好的服務(wù)器也受不了.
工具是js+php+mysql制作的,并不是有的人想象的把多個瀏覽器引擎整合到一個軟件里,我可沒那水平.
使用的時候,只需要在js里寫好測試數(shù)據(jù)和測試方法,傳到一個測試實例里,然后在所有瀏覽器里打開一次這個窗口,js會統(tǒng)計數(shù)據(jù),然后把數(shù)據(jù)存儲到后臺,之后js通過ajax獲取所有的數(shù)據(jù),將其解析成表格顯示在網(wǎng)頁中.最后結(jié)果是如果你的電腦夠強,所有的瀏覽器里的網(wǎng)頁都會顯示一個列表,里面有所有瀏覽器的測試數(shù)據(jù),如下:

之后就可以比較結(jié)果了.是不是很方便呢
原理:
首先將此功能抽象成一個組件,組件接受三個參數(shù),一個是輸入對象組,二是測試方法,三是組件配置參數(shù).
在之后的組件初始化階段,組件將遍歷輸入對象組中的所有對象,將對象傳給測試方法,測試方法返回一個測試數(shù)據(jù),組件將測試結(jié)果記錄在一個對象中.
復(fù)制代碼 代碼如下:
/**
* 這是一個測試對象在不同瀏覽器中屬性的對象,可以同時在任何瀏覽器中測試,需要和后臺腳本交互
* 請設(shè)置好輸入數(shù)據(jù)和輸出數(shù)據(jù)后,在要測試的瀏覽器中打開頁面,結(jié)果將附加到列表中.
*
* @param {array} testObject 待測試的對象列表,每個對象都必須有一個唯一的標(biāo)示做主鍵,而且有一個描述,
* testObject的格式如下{"in1":{obj:**,des:"dd"},"in2":{obj:**,des:"dd"}}
* @param {function} testMethod 測試的方法,程序會向此方法傳入兩個參數(shù),一個是對象索引一個是對象.同時在此方法里可以用this引用test實例,此方法必須返回一個字符串,表示執(zhí)行結(jié)果
* @param {json} config 配置參數(shù)
*/
(function(){
var CrossBrowserTest=function(testObjects,testMethod,config){
這個組件對對象參數(shù)格式和組件內(nèi)的數(shù)據(jù)存儲器的格式,以及向后臺發(fā)送字符串的格式,后臺返回數(shù)據(jù)的格式有著嚴格規(guī)定:
其中:testObject的格式如下{"in1":{obj:**,des:"dd"},"in2":{obj:**,des:"dd"}}
組件內(nèi)的數(shù)據(jù)存儲器的格式如下(this.data):{“in1”:{des:”描述",data{“ie6”:{outDes:"ie6里的輸出結(jié)果"},”ie7”:{outDes:"ie7里的輸出結(jié)果"}}},"in2”:…}
在發(fā)送數(shù)據(jù)的時候,用一個函數(shù)將json轉(zhuǎn)換成字符串格式,這個函數(shù)如下:
復(fù)制代碼 代碼如下:
function obj2str(o){
var r = [];
if(typeof o =="string") return "\""+o+"\"";
if(typeof o == "object"){
if(!o.sort){
r[0]="{"
for(var i in o){
r[r.length]="\""+i+"\"";
r[r.length]=":";
r[r.length]=obj2str(o[i]);
r[r.length]=",";
}
r[r.length-1]="}"
}else{
r[0]="["
for(var i =0;i<o.length;i++){
r[r.length]=obj2str(o[i]);
r[r.length]=",";
}
r[r.length-1]="]"
}
return r.join("");
}
return o.toString();
}
在后臺,php會把這個json字符串通過json_decode函數(shù)轉(zhuǎn)換成一個php的數(shù)組,之后存到數(shù)據(jù)庫里.
而從數(shù)據(jù)庫里取數(shù)據(jù)的時候,php從數(shù)據(jù)庫里取出數(shù)據(jù),轉(zhuǎn)換成數(shù)組格式,然后用json_encode函數(shù)轉(zhuǎn)換成json字符串,傳到前臺,前臺用eval執(zhí)行得到數(shù)據(jù).
在后臺,對json數(shù)據(jù)進行了分解,分解成了一條條的數(shù)據(jù),然后存到了數(shù)據(jù)庫里,這里數(shù)據(jù)庫讀取頻繁,造成性能下降.
數(shù)據(jù)庫有6個字段,分別為:主鍵,對象主鍵(區(qū)分不同的對象),瀏覽器類型(相同的對象里有不同瀏覽器的測試結(jié)果),對象的描述,測試的結(jié)果,時間.
瀏覽器的類型測試使用了下述的方法:
復(fù)制代碼 代碼如下:
M.getBrowser=function(){
return {
//此函數(shù)判斷瀏覽器類型,為了簡便,返回一個數(shù)字表示,
//1.ie6;2.ie7; 3.ie8;4,Firefox;5.chrome;6.Opera;7.Safari;0.無法檢測的瀏覽器
//其他瀏覽器可以自行添加
whichOS:function(){
var useragent=navigator.userAgent.toLowerCase();
return (/MSIE 6/i.test(useragent)==true&&1)||
(/MSIE 7/i.test(useragent)==true&&2)||(/MSIE 8/i.test(useragent)==true&&3)||
(/Firefox/i.test(useragent)==true&&4)||
(/Chrome/i.test(useragent)==true&&5)||
(/Opera/i.test(useragent)==true&&6)||
(/Safari/i.test(useragent)==true&&7)||0
},
nowOsString:function(){
var useragent=navigator.userAgent.toLowerCase();
return (/MSIE 6/i.test(useragent)==true&&"ie6")||
(/MSIE 7/i.test(useragent)==true&&"ie7")||(/MSIE 8/i.test(useragent)==true&&"ie8")||
(/Firefox/i.test(useragent)==true&&"Firefox")||
(/Chrome/i.test(useragent)==true&&"Chrome")||
(/Opera/i.test(useragent)==true&&"Opera")||
(/Safari/i.test(useragent)==true&&"Safari")||"sorry,我不認識你的瀏覽器!"
}
}
}()
數(shù)據(jù)是用對象主鍵和瀏覽器類型共同區(qū)分的(可以獲取唯一的數(shù)據(jù))
對象初始化完成后,就開始處理數(shù)據(jù)了,首先在本瀏覽器里執(zhí)行一次測試,將測試數(shù)據(jù)放入一個臨時對象里,然后將這個臨時對象通過ajax發(fā)送到后臺,后臺把這條數(shù)據(jù)存到數(shù)據(jù)庫(如果已經(jīng)存在就不存儲了)
然后設(shè)置一個定時器,定時到后臺取數(shù)據(jù),這個取到的數(shù)據(jù)是后臺數(shù)據(jù)庫里存儲的,可能包括了多個的瀏覽器的數(shù)據(jù),取到數(shù)據(jù)后,啟動dom構(gòu)建函數(shù),和渲染函數(shù),更新網(wǎng)頁的內(nèi)容.
基本原理就是這樣,這樣說真是抽象的很,但是很抱歉,這個東西沒法拿出來跟大家分享,不是我不想分享,是實在是有困難.不過如果你感興趣可以下載源代碼,將源代碼里的sql導(dǎo)入到一個mysql表里,然后在php文件里配置下,修改下,我這個封裝的不是很好,因為考慮到這個東西的重用性也不用太好了.沒時間搞別的了.
測試代碼打包下載
相關(guān)文章
前端終止請求的3種方式總結(jié)(ajax、axios)
這篇文章主要給大家總結(jié)介紹了關(guān)于前端終止請求的3種方式,其中包括ajax、axios的相關(guān)資料, 取消請求在前端有時候會用到,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-09-09信息頁文內(nèi)畫中畫廣告js實現(xiàn)代碼(文中加載廣告方式)
一般來說文章內(nèi)容中的廣告點擊率更好,也更容易被訪客看到,如果直接將廣告放到頁面頭部會影響網(wǎng)站的速度,所以一般都比較喜歡這種方法,這里分享下實現(xiàn)方法2016-01-01