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. 第十八周个人作业--The Final

    项目计划   完成这个项目需要的时间:5-7天项目开发  需求分析:    作为一名排球赛事管理者,我希望能够根据比赛查询每场比赛的结果,以便于确定每支球队的比赛名次.  设计文档    由排球比赛用 ...

  2. LNMP添加、删除虚拟主机及伪静态使用教程

    一般情况下每个虚拟主机就是一个网站,网站一般通过域名进行访问.LNMP 1.2的网站添加过程和LNMP 1.1的基本类似,但是增加了FTP和数据库的创建.LNMP1.2的防跨目录也由原来在php.in ...

  3. yum源使用(转)

    一.yum 简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的 ...

  4. IBatis 简易框架搭建

    1.练习框架 ibatis主要dll介绍 IBatisNet.Common.dll 由DataAccess和DataMapper组成的共享程序集 IBatisNet.Common.Logging.Lo ...

  5. 使用Goertzel算法识别DTMF信号

    Goertzel算法 Goertzel算法由Gerald Goertzel在1958年提出,用于数字信号处理,是属于离散傅里叶变换的范畴,目的是从给定的采样中求出某一特定频率信号的能量,用于有效性的评 ...

  6. ios面试技巧

    一.软件开发流程? 软件设计思路和方法的一般过程,包括设计软件的功能和实现的算法和方法.软件的总体结构设计和模块设计.编程和调试.程序联调和测试以及编写.提交程序. 1 相关系统分析员和用户初步了解需 ...

  7. Spring——(一)IoC

    1. 什么是IOC IOC:inversion of Control 控制反转. 控制反转:即控制权由应用程序代码转到了外部容器.(反转:就是控制权的转移).--降低业务对象之间的依赖程度,即实现了解 ...

  8. C代码编译成可执行程序的过程

    C代码通过编译器编译成可执行代码,经历了四个阶段,依次为:预处理.编译.汇编.链接. 接下来详细讲解各个阶段 一.预处理 1.任务:进行宏定义展开.头文件展开.条件编译,不检查语法. 2.命令:gcc ...

  9. 关于Intent的七大重要属性

    在Android 中,Intent用来封装两个Activity之间的调用意图,实现两个Activity之间的跳转,并传递信息. Intent的七大重要属性:ComponentName Action   ...

  10. HTTP、TCP、UDP以及SOCKET之间的区别/联系

    一.TCP/IP代表传输控制协议/网际协议,指的是一系列协组. 可分为四个层次:数据链路层.网络层.传输层和应用层. 在网络层:有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在 ...