1:什么是单元测试?

  1.1:单元测试又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。单元测试主要是用来检验程式的内部逻辑,也称为个体测试、结构测试或逻辑驱动测试。通常由撰写程式码的程式设计师负责进行。单元测试在后台开发中非常流行和普及,比如JAVA开发者的JUnit等,而在前端开发中则使用的非常少。究其原因,主要是单元测试更适用于逻辑代码的测试,这对于JAVA等后台编程语言来说测试起来非常方便,但是前端开发很多时候要要UI打交道,UI相关的代码不是不可以进行单元测试,但的确很麻烦,比起逻辑代码来说困难多了,这就导致了单元测试在前端开发没有普及起来。

2:单元测试的优点

  2.1:  单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。

3:javscript中单元测试框架

  3.1: jsUnit 系统化的解决方案,基于XNuit规范.

  3.2: Test.Simple & Test.More 这个是jQuery之父John Resig在他的著作《Pro Javascript》中推荐的测试框架,非常容易上手,非常简洁,适合中小型项目快速引入单元测试         3.3: FireUnit 这个是John Resig另起炉灶做的,在他的博客John Resig - FireUnit: JavaScript Unit Testing Extension,发布了他与Jan Odvarko合作开发的基于Firebug的扩展FireUnit。简单说来,FireUnit给Firebug增加了一个标签面板,并提供了一些简单的JavaScript API来记录和查看测试。

  3.4:QUnit 是jQuery团队开发的JavaScript单元测试工具,可以到http://docs.jquery.com/QUnit中下载

4:断言

  4.1:提取现有代码把他放到不同地方,而不影响现有功能,我们把这一过程称为重构,重构是改善代码设计相当有用的方式。

  4.2:单元测试的基石是断言。“断言是一个命题,预测你的代码的返回结果。如果预测是假的,断言失败,你就知道出了问题。”  

  4.3:

// module模块
module('Module A');

// function isEven(val) { return val % 2 === 0;}
test('isEven()', function() {
    ok(isEven(0), 'Zero is an even number');
    ok( 1 == 1, 'one equals one');
})
module('Module B');
test('test', function() {
    // same和deepEqual相当于===,但是same已被弃用
    same({a: 1}, {a: 1} , 'passes');
    deepEqual( {}, {}, 'fails, these are different objects');

    // equal相当于==,下面的断言是false
    equals( [], [], 'fails, there are different arrays');
})

5:异步测试

  5.1:在前面的示例中,所有的断言都是同步调用的,这意味着他们是一个接着一个运行的。同样 存在着很多异步的函数,例如Ajax请求或通过setTimeout()或sestInterval()调用的方法。

//我们没有写任何断言一样。这是因为断言是被异步执行的,到它被调用的时候,此次测试已经执行完成。Module C: asynchronous test (1, 0, 1)
test('asynchronous test', function() {
    setTimeout(function() {   ok(true);  }, 100)
})  

// 正确写法,使用了stop()去暂停此次测试案例, 并且在断言被调用以后,我们使用start()继续。
test('asynchronous test2', function() {
    stop();setTimeout(function() {ok(true);start(); }, 100)
})

// QUnit提供了一个捷径:asyncTest()
asyncTest('asynchronous test', function() {
    setTimeout(function() {   ok(true); start();  }, 100)
})  

  5.2:setTimeout()通常会调用它自己的回调函数,但如果它是一个自定义的函数(例如:一个Ajax调用)。你如何确认回调函数被调用了呢?并且如果回调函数没有被调用,start()将不会被执行,整个单元测试将被挂起:

, function() {    stop();   expect(3);     ajax(function() {  ok(true);  })     ajax(function() {  ok(true);  ok(true);  })     setTimeout(function() {  start();  }, 2000); 
})

jsQunit的更多相关文章

  1. linqjs

    Project Descriptionlinq.js - LINQ for JavaScript Features implement all .NET 4.0 methods and many ex ...

随机推荐

  1. nullcon HackIM 2016 -- Programming Question 5

    Dont blink your Eyes, you might miss it. But the fatigue and exhaustion rules out any logic, any wil ...

  2. linux命令行下的ftp 多文件下载和目录下载

    安装:yum install ftp 使用:ftp + ip (未进入ftp状态下运行) ----------------------------------------- 目标ftp服务器是一个非标 ...

  3. x-editable 的使用方法

    1.首先在html网页中定义一个a标签(如下<%#%>是asp.net的语法) <a href="#"  data-pk="<%#Eval(&qu ...

  4. 配置BUG-Linux系统下ssh登陆很慢的解决办法

    很多的Linux用户发现连接上Linux服务器在输入用户名之后还要再等一下才能输入密码,时间过长了,现在小编与大家分享一下如何解决ssh登陆问题的问题,希望对您有所帮助 . 1.我们平时登陆Linux ...

  5. RTTI 运行时类型识别 及异常处理

    RTTI   运行时类型识别 typeid  ------  dynamic_cast dynamic_cast 注意事项: 1.只能应用于指针和引用之间的转化 2.要转换的类型中必须包含虚函数 3. ...

  6. jquery blockui 遮罩

    参考 : http://bookshadow.com/weblog/2014/09/26/jquery-blockui-js-introduction/ blockUI.html blockUI.ht ...

  7. chrome浏览器开发者工具之同步修改至本地

    相信好多小伙伴喜爱webpack的热加载技术,省时而又不繁琐,讨厌F5或者Ctrl+F5. 嘿嘿,现在介绍大家一个在浏览器中修改直接同步到本地代码修改的方法--- (程序员都是从0开始数数的!) 第0 ...

  8. mysql计划字段中有多少个逗号,或者某个标识符

    eg:计划url中有多少个小数点 select length('www.mysql.com')-length(REPLACE('www.mysql.com','.',''));

  9. PDFsharp Samples

    http://www.pdfsharp.net/wiki/PDFsharpSamples.ashx http://www.pdfsharp.net/?AspxAutoDetectCookieSuppo ...

  10. JAVA学习笔记(二):eclipse智能提示(转)

    存盘 Ctrl+s(肯定知道)注释代码 Ctrl+/取消注释 Ctrl+\(Eclipse3已经都合并到Ctrl+/了)代码辅助 Alt+/快速修复 Ctrl+1代码格式化 Ctrl+Shift+f整 ...