在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路


Posted in Javascript onMarch 02, 2010

作为一个标准的绝顶的懒人,我想做一个测试工具,可以同时把所有浏览器的测试结果都显示在一个浏览器窗口里,并且列成清晰的表格,便于比较.

这一定会是一个可爱的工具,节省时间不说,而且可以清晰的记录和比较数据.下面说一下我的思路.(之后我将使用这个工具测试一个js的兼容性问题,敬请关注)

本工具已经制作完成,但是不具通用性,需要和后台配合使用,需要和数据库交互,而且后台交互的性能不太好,普通的电脑无法承受(我的3GHZ的cpu,2G内存都不能直接打开多个浏览器窗口,可能是我数据库的操作过于频繁).虽然放在公共服务器上速度可以接受,但是不能拿出来给大家测试,因为多个人运行,再好的服务器也受不了.

工具是js+php+mysql制作的,并不是有的人想象的把多个浏览器引擎整合到一个软件里,我可没那水平.

使用的时候,只需要在js里写好测试数据和测试方法,传到一个测试实例里,然后在所有浏览器里打开一次这个窗口,js会统计数据,然后把数据存储到后台,之后js通过ajax获取所有的数据,将其解析成表格显示在网页中.最后结果是如果你的电脑够强,所有的浏览器里的网页都会显示一个列表,里面有所有浏览器的测试数据,如下:
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
之后就可以比较结果了.是不是很方便呢
原理:
首先将此功能抽象成一个组件,组件接受三个参数,一个是输入对象组,二是测试方法,三是组件配置参数.
在之后的组件初始化阶段,组件将遍历输入对象组中的所有对象,将对象传给测试方法,测试方法返回一个测试数据,组件将测试结果记录在一个对象中.

/** 
* 这是一个测试对象在不同浏览器中属性的对象,可以同时在任何浏览器中测试,需要和后台脚本交互 
* 请设置好输入数据和输出数据后,在要测试的浏览器中打开页面,结果将附加到列表中. 
* 
* @param {array} testObject 待测试的对象列表,每个对象都必须有一个唯一的标示做主键,而且有一个描述, 
* testObject的格式如下{"in1":{obj:**,des:"dd"},"in2":{obj:**,des:"dd"}} 
* @param {function} testMethod 测试的方法,程序会向此方法传入两个参数,一个是对象索引一个是对象.同时在此方法里可以用this引用test实例,此方法必须返回一个字符串,表示执行结果 
* @param {json} config 配置参数 
*/ 
(function(){ 
var CrossBrowserTest=function(testObjects,testMethod,config){

这个组件对对象参数格式和组件内的数据存储器的格式,以及向后台发送字符串的格式,后台返回数据的格式有着严格规定:
其中:testObject的格式如下{"in1":{obj:**,des:"dd"},"in2":{obj:**,des:"dd"}}
组件内的数据存储器的格式如下(this.data):{“in1”:{des:”描述",data{“ie6”:{outDes:"ie6里的输出结果"},”ie7”:{outDes:"ie7里的输出结果"}}},"in2”:…}
在发送数据的时候,用一个函数将json转换成字符串格式,这个函数如下:
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函数转换成一个php的数组,之后存到数据库里.
而从数据库里取数据的时候,php从数据库里取出数据,转换成数组格式,然后用json_encode函数转换成json字符串,传到前台,前台用eval执行得到数据.
在后台,对json数据进行了分解,分解成了一条条的数据,然后存到了数据库里,这里数据库读取频繁,造成性能下降.
数据库有6个字段,分别为:主键,对象主键(区分不同的对象),浏览器类型(相同的对象里有不同浏览器的测试结果),对象的描述,测试的结果,时间.
浏览器的类型测试使用了下述的方法:
M.getBrowser=function(){ 
return { 
//此函数判断浏览器类型,为了简便,返回一个数字表示, 
//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,我不认识你的浏览器!" 
} 
} 
}()

数据是用对象主键和浏览器类型共同区分的(可以获取唯一的数据)
对象初始化完成后,就开始处理数据了,首先在本浏览器里执行一次测试,将测试数据放入一个临时对象里,然后将这个临时对象通过ajax发送到后台,后台把这条数据存到数据库(如果已经存在就不存储了)
然后设置一个定时器,定时到后台取数据,这个取到的数据是后台数据库里存储的,可能包括了多个的浏览器的数据,取到数据后,启动dom构建函数,和渲染函数,更新网页的内容.
基本原理就是这样,这样说真是抽象的很,但是很抱歉,这个东西没法拿出来跟大家分享,不是我不想分享,是实在是有困难.不过如果你感兴趣可以下载源代码,将源代码里的sql导入到一个mysql表里,然后在php文件里配置下,修改下,我这个封装的不是很好,因为考虑到这个东西的重用性也不用太好了.没时间搞别的了.
测试代码打包下载
Javascript 相关文章推荐
javascript 数组排序函数
Aug 20 Javascript
jQuery toggle()设置CSS样式
Nov 05 Javascript
jquery.validate分组验证代码
Mar 17 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
Apr 11 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
Jan 07 Javascript
详解JavaScript for循环中发送AJAX请求问题
Jun 23 Javascript
浅析jquery与checkbox的checked属性的问题
Apr 27 Javascript
BootStrap 超链接变按钮的实现方法
Sep 25 Javascript
AngularJS中$apply方法和$watch方法用法总结
Dec 13 Javascript
学习RxJS之JavaScript框架Cycle.js
Jun 17 Javascript
JQuery插件tablesorter表格排序实现过程解析
May 28 jQuery
一起来看看Vue的核心原理剖析
Mar 24 Vue.js
jQuery对象和DOM对象的相互转化实现代码
Mar 02 #Javascript
Javascript 自定义类型方法小结
Mar 02 #Javascript
Javascript Cookie读写删除操作的函数
Mar 02 #Javascript
28个JS验证函数收集
Mar 02 #Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
Mar 02 #Javascript
javascript 静态对象和构造函数的使用和公私问题
Mar 02 #Javascript
新老版本juqery获取radio对象的方法
Mar 01 #Javascript
You might like
用libTemplate实现静态网页的生成
2006/10/09 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
PHP利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP的mysqli_set_charset()函数讲解
2019/01/23 PHP
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
JavaScript关于select的相关操作说明
2010/01/13 Javascript
JQuery select标签操作代码段
2010/05/16 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
2012/08/06 Javascript
javascript制作网页图片上实现下雨效果
2015/02/26 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
JS、jQuery中select的用法详解
2016/04/21 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
常用python编程模板汇总
2016/02/12 Python
如何在python字符串中输入纯粹的{}
2018/08/22 Python
PyQt QListWidget修改列表项item的行高方法
2019/06/20 Python
Python替换月份为英文缩写的实现方法
2019/07/15 Python
用canvas做一个DVD待机动画的实现代码
2019/04/12 HTML / CSS
新加坡交友网站:be2新加坡
2019/04/10 全球购物
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
电子商务专业学生的学习自我评价
2013/10/27 职场文书
浪漫婚礼主持词
2014/03/14 职场文书
授权委托书
2014/07/31 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
解决python存数据库速度太慢的问题
2021/04/23 Python
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python