手机版

JavaScript单元测试字母表

时间:2021-10-10 来源:互联网 编辑:宝哥软件园 浏览:

前言当前,在软件开发中单元测试越来越受到开发者的重视,它能提高软件的开发效率,而且能保障开发的质量。以往,单元测试往往多见于服务端的开发中,但随着网编程领域的分工逐渐明细,在前端爪哇岛描述语言开发领域中,也可以进行相关的单元测试,以保障前端开发的质量。在服务器端的单元测试中,都有各种各样的测试框架,在Java脚本语言中现在也有一些很优秀的框架,但在本文中,我们将自己动手一步步来实现一个简单的单元测试框架JS。单元测试有很多方面,比较多的是对方法功能检查,对浏览器兼容性检查,本文主要谈第一种。本文检查的射流研究…代码是我以前写的一个射流研究…日期格式化的方法,原文在这里(javascript日期格式化函数,跟C#中的使用方法类似),代码如下:复制代码代码如下:日期。原型。tostring=function(format){ var time={ };时间到了年=今年。getfull year();时间到了TYear=(“时间”.年份)。substr(2);时间到了月份=这个。get month()1;时间到了t月=时间。10个月?0 '时间。每月:次。时间到了日=这个。getdate();时间到了TDay=时间。第10天?0 '时间。第:天。第:天;时间到了小时=这个。gethours();时间到了THour=时间。10小时?0 '时间。小时:时间。小时;time.hour=时间。13小时?时间到了。小时:时间。小时-12;时间到了Thour=time.hour10?0 '时间。时间:小时;时间到了分钟=这个。getminutes();时间到了t .分钟=时间。十分钟?0 '时间。分钟:分钟。时间到了秒=这个。getseconds();时间到了t .秒=时间。第二个10?0 '时间。第二次:次。第二次;时间到了。毫秒=这个。得到毫秒();var oNumber=时间。毫秒/1000;如果(格式!=未定义的格式。替换(/\ s/g ' ')。长度0){ format=format .替换(/yyyy/ig,时间.年份)。替换(/yyy/ig,时间.年份)。替换(/yy/ig,时间.TYear ).替换(/y/ig,时间TYear ).替换(/MM/g,时间t .月)。替换(/M/g,时间。月)。替换(/dd/ig,time .TDay ).替换(/d/ig,时间。日)。替换(/HH/g,时间尽管如此.替换(/H/g,时间。小时)。替换(/hh/g,时间尽管如此.替换为(/h/g,time.hour).更换(/毫米/克,时间(分钟).替换(/m/g,时间。分钟)。替换(/ss/ig,time .分时(同timesharing)秒)。替换(/s/ig,时间。第二)。替换(/fff/ig,时间。毫秒)。替换(/ff/ig,OnEmber。固定为(2)* 100 .替换(/f/ig,OnMonber。ToFixed(1)* 10);} else{ format=time .年份-时间。月-时间。白天。时间是:分钟' : '时间。第二;}返回格式;} 这段代码目前没有发现比较严重的臭虫,本文为了测试,我们把。替换(/MM/g,时间t .月)改为。替换(/MM/g,时间。月份),这个错误是当月份小于10时,没有用两位数表示月份。现在有这么一句话,好的设计都是重构出来的,在本文中也一样,我们从最简单的开始。

第一版:用最原始的警报作为第一版,我们很偷懒的直接用警报来检查,完整代码如下:复制代码代码如下:DOCTYPE html html标题演示/标题元字符集=' utf-8 '/标题正文脚本类型=' text/JavaScript '日期。原型。tostring=function(format){ var time={ };时间到了年=今年。getfull year();时间到了TYear=(“时间”.年份)。substr(2);时间到了月份=这个。get month()1;时间到了t月=时间。10个月?0 '时间。每月:次。时间到了日=这个。getdate();时间到了TDay=时间。第10天?0 '时间。第:天。第:天;时间到了小时=这个。gethours();时间到了THour=时间。10小时?0 '时间。小时:时间。小时;time.hour=时间。13小时?时间到了。小时:时间。小时-12;时间到了Thour=time.hour10?0 '时间。时间:小时;时间到了分钟=这个。getminutes();时间到了t .分钟=时间。十分钟?0 '时间。分钟:分钟。时间到了秒=这个。getseconds();时间到了t .秒=时间。第二个10?0 '时间。第二次:次。第二次;时间到了。毫秒=这个。得到毫秒();var oNumber=时间。毫秒/1000;如果(格式!=未定义的格式。替换(/\ s/g ' ')。长度0){ format=format .替换(/yyyy/ig,时间.年份)。替换(/yyy/ig,time .年份)。替换(/yy/ig,时间.TYear ).替换(/y/ig,时间TYear ).替换(/MM/g,时间。月)。替换(/M/g,时间。月)。替换(/dd/ig,time .TDay ).替换(/d/ig,时间。日)。替换(/HH/g,时间尽管如此.替换(/H/g,时间。小时)。替换(/hh/g,时间尽管如此.替换为(/h/g,time.hour).更换(/毫米/克,时间(分钟).替换(/m/g,时间。分钟)。替换(/ss/ig,time .分时(同timesharing)秒)。替换(/s/ig,时间。第二)。替换(/fff/ig,时间。毫秒)。替换(/ff/ig,OnEmber。固定为(2)* 100 .替换(/f/ig,OnMonber。ToFixed(1)* 10);} else{ format=time .年份-时间。月-时间。白天。时间是:分钟' : '时间。第二;}返回格式;} var date=new Date(2012,3,9);警报(日期。ToString(' yyyy ');警报(日期。ToString(' MM ');/脚本/正文/html运行后会弹出2012 和4 ,观察结果我们知道日期字符串('毫米)方法是有问题的。这种方式很不方便,最大的问题是它只弹出了结果,并没有给出正确或错误的信息,除非对代码非常熟悉,否则很难知道弹出的结果是正是误,下面,我们写一个断言(断言)方法来进行测试,明确给出是正是误的信息。第二版:用维护进行检查断言是表达程序设计人员对于系统应该达到状态的一种预期,比如有一个方法用于把两个数字加起来,对于3 2,我们预期这个方法返回的结果是5,如果确实返回5那么就通过,否则给出错误提示。断言是单元测试的核心,在各种单元测试的框架中都提供了断言功能,这里我们写一个简单的断言(断言)方法:复制代码代码如下:函数断言(消息,结果){ if(!结果){抛出新的错误(消息);}返回真}这个方法接受两个参数,第一个是错误后的提示信息,第二个是断言结果用断言测试代码如下:复制代码代码如下: var日期=新日期(2012,3,9);尝试{ assert('yyyy应返回整年,日期。ToString(' yyyy ')===' 2012 ');}捕获(e){警报('测试失败: ' e消息);}请尝试{ assert('MM应返回完整的月份,日期。tostring(' MM ')===' 04 ');}捕获(e){警报('测试失败: ' e消息);} 运行后会弹出如下窗口

第三版:进行批量测试在第二版中,断言方法可以给出明确的结果,但如果想进行一系列的测试,每个测试都要进行异常捕获,还是不够方便。另外,在一般的测试框架中都可以给出成功的个数,失败的个数,及失败的错误信息。为了可以方便在看到测试结果,这里我们把结果用有颜色的文字显示的页面上,所以这里要写一个小的输出方法打印消息:复制代码代码如下:函数PrintMessage(文本,颜色){ var div=文档。创建元素(' div ');div.innerHTML=文本;div。风格。颜色=颜色;文件。尸体。append child(div);删除div}下面,我们就写一个类似jsTestDriver中的测试案例方法,来进行批量测试:复制代码代码如下:函数testCase(名称,测试){ var Successcount=0;var测试计数=0;用于(测试中的定义变量测试){ testCount尝试{ tests[test]();PrintMessage(测试"成功","# 080");成功计数;} catch(e){ print message(test '失败: ' e . message,' # 800 ');} }打印消息('测试结果: '测试计数'测试,'成功计数'成功',(测试计数-成功计数)'失败',' # 800 ');} 测试代码:复制代码代码如下: var日期=新日期(2012,3,9);testCase('date toString test ',{ yyyy : function(){ assert(' yyyy应返回2012年,日期。ToString(' yyyy ')===' 2012 ');},MM:function(){ assert('MM应该返回04 ',日期。tostring(' MM ')==' 04 ');},dd:function(){ assert('dd应返回09 ',日期。tostring(' DD ')==' 09 ');} });结果为

这样我们一眼就能看出哪个是错的。但这完美吗?我们可以看到,在最后一次测试中,VAR date=NEW date(2012年3月9日)是在testCase之外定义的,testCase的整个测试代码共同使用了date。这里没有问题,因为在每个方法中都没有修改DATE的值。如果在测试方法中修改了DATE的值怎么办?测试结果是不准确的,所以在很多测试框架中都提供了setUp和disterdown方法来统一提供和销毁测试数据。现在我们将向我们的测试用例中添加setUp和disterdown方法。第四版:用统一的测试数据进行批量测试。首先,我们添加setUp和disterdown方法:复制代码如下:testcase ('date tostring ',{setup3360function () {this。日期=new date(2012年3月9日);},拆卸: function(){ delete this . date;},yyyy : function(){ assert(' yyyy应返回2012 ',this . date . tostring(' yyyy ')==' 2012 ');},MM:function(){ assert('MM应该返回04 ',this . date . tostring(' MM ')==' 04 ');},dd:function(){ assert('dd应返回09 ',this . date . tostring(' DD ')==' 09 ');} });由于setUp和disterdown方法不参与测试,我们需要修改testCase代码:复制代码如下:函数测试用例(name,tests){ var success count=0;var test count=0;var Hassetup=type of tests . SEtuP==' function ';var HastEarsown=type of tests . disterdown==' function ';for(测试中的var测试){ if(test==' SEtuP ' | | test==='泪珠'){ continue} testCount尝试{ if(Hassetup){ tests . SEtuP();}测试[测试]();PrintMessage(测试“成功”,“# 080”);if(HastEarsown){ tests . disterdown();}成功计数;} catch(e){ print message(test ' failed : ' e . message,' # 800 ');} } print message(' Test result : ' Test count ' tests,' successCount ' success ',(Test count-success count)' failures ',' # 800 ');}运行后的结果与第三版相同。正如总结和参考文章中提到的,一个好的设计是不断重构的结果。上面的第四版完美吗,离实现还很远吗?这只是一个例子。如果你需要这些知识,我可以在后面写每个测试框架的使用。本文只是JS单元测试的入门示例,让初学者对JS单元测试有一个初步的概念,是一个很有价值的介绍。欢迎补充。本文参考《测试驱动的JavaScript开发》第一章(我觉得还不错,推荐一下)。书中的测试用例也是时间的函数,但是编写复杂,对于初学者来说不容易理解。作者:艺术品。

版权声明:JavaScript单元测试字母表是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。