本期我们将讨论JavaScript测试检查组件的状态和工作模式是否符合预期的话题,并介绍一种可以方便编写测试用例的测试方法。当然,这里的测试是使用自动化的测试手段,这是软件质量保证(QA)的重要环节。就本系列文章中介绍的智能队列而言,我们的测试目标包括:Task对象的创建;第二阶段的代码提供了各种创建方法,需要测试对象创建后的状态。队列中任务的运行顺序:我们提供了优先级和依赖配置两种改变运行顺序的方式,也测试了各种配置对顺序的影响。对于第一个目标,只需检查创建后对象的属性是否符合预期。我们多次提到“满足期望”,这个断言就是为此而设计的。简单来说,断言就是保证被测试表达式的结果为“真”,否则会以某种方式通知测试人员,帮助他们定位断言失败的测试用例。第二个目标稍微复杂一些。因为我们在组件编码的实现过程中隐藏了闭包中的排序队列(_sorted),所以外部是不可访问的。有两种方法可以考虑:(1)重构代码,增加代码的可测试性,有两种重构方法:(a)开启时将debug开关设置为expose _sorted向外;(b)添加独立的文件,以构造的方式拼接代码,最终生成测试版本。(2)测试行为的结果而不是过程。前一种方法本质上深入到组件的运行时状态,而这种方法只检查组件的运行结果。本期选择后两种测试方法,第一种测试方法留给感兴趣的读者练习:)需要注意的是,我个人不赞成第一种方法。先说说这个任务队列的设计理念:它只是一个队列,只负责根据需要调整任务的运行顺序,并不关注任务的个别细节。换句话说,它操作整个任务,不关心任务的具体行为和性能。它是一个安全的队列,用户(“第一期提到的客户”)可以放心地添加任务,而不用担心这个任务信息会被其他客户看到。需要注意的是,还有SmartQueue。Queue=[[],[],[]]在第二个实现代码中,结果是可以从外部访问队列项。代码仅供介绍,可以放心删除SmartQueue。队列=实现安全控制。回到刚才讨论的话题,设置调试开关后,存在潜在的任务信息泄露可能性。进一步说,继续改造代码也可以实现使用debug switch时的安全性,通过将switch的控制权放在SmartQueue的构造函数中,这就需要SmartQueue实现Singleton模式(参见上一篇文章);一旦创建了对象,就不允许修改闭包内的调试标记。在编写具体的测试代码之前,我们设计了一个测试方法来简化测试代码的编写(主要是用例)。简单来说,就是把测试用例从测试本身的代码中分离出来——。前者用语义好的方式写,后者写一次,用来处理前者设置的测试用例。用例编写人员需要按照如下格式编写代码:ul id=' j _ test _ cases ' lip retask=newsq . task({ fn : function(){ log(' unamed ')})/preul liteyoftask . fn=' function '/Li litask . name==' t0 '/Li litask . level===1/Li litask . dependencies . length===0/Li litask . context==window/Li/ul/Li pretask=new sq。task({ fn : function(){ log(' unamed ')},name :' hello'})/preul litask。name===' hello'/li litask。level===1/li/ul/li/ul。Ul ul li测试该代码的断言,并可以编写多个断言。建议使用===和!===运算符增强对数据类型的预期判断。
接下来,我们编写两个助手方法来输出和测试:函数log (str) {node。value=str ' n}函数assert(表达式){ var flageval('flag='表达式);返回typeof(flag)==='boolean '标志;}log用于向文本框追加信息,assert用于测试传入表达式的值。测试方法如下(这里使用jquery):varsq=smart queue,task,total=0,passed=0,failed=0;$('#J_test_cases ')。儿童()。每个(函数(索引){ eval($('pre ',this)。text());task . register();$(‘李’,这个)。每个(function(){ var item=$(this);var flag=assert(item . text());如果(标志)通过;否则失败;item.prepend((标志?font color=' green '[PASS]/font ' : ' font color=' red '[FAIL]/font ')' ');总计;}).换行(' pre/pre ');}).end()。之前(' pTotal: ' total ',passed: ' passed ',failed : ' failed '/p ');sq . fire();这种结构可以改进,比如输出测试指令代替具体代码,增加后操作,这里就不演示了。您还可以查看完整的测试页面,其中包含23个测试用例和完整的测试实现。~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~八卦分割线~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~好了,我们已经体会到了思考和行动的乐趣,已经到了系列文章的结尾,但这只是开始。我们经历了实现一个小的实用组件的全过程,体验了JavaScript的奇妙世界。让我们继续前进~