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. 干货|宏巍软件之Java线程监控之旅

    宏巍软件 许向 大家好,我是上海宏巍信息技术有限公司(简称:宏巍软件)的许向,宏巍软件成立于2005年,是一家以电商ERP软件开发为主的高新技术科技型软件公司,致力于为大型网商和电子商务企业提供专业. ...

  2. C语言学习笔记(一)_hello world程序中涉及的c语言元素

    #include <stdio.h> //使用printf函数之前必须include<stdio.h> int main() { int i; //声明一个变量 printf( ...

  3. 010editor 破解 扩展

    1. 注册机注册,注册机搜一下吧 (破解算法各版本通用) 2. 绕过网络验证,每次关闭010editor时都会网络验证,并将验证结果写道本地,所以: HKEY_CURRENT_USER\Softwar ...

  4. [题解]UVa 10891 Game of Sum

    在游戏的任何时刻剩余的都是1 - n中的一个连续子序列.所以可以用dp[i][j]表示在第i个数到第j个数中取数,先手的玩家得到的最大的分值.因为两个人都很聪明,所以等于自己和自己下.基本上每次就都是 ...

  5. vs2015 现用插件

    1.abphelper abp app自动生成接口和input output 2.ankhsvn svn插件 3.c#outline2015 大括号折叠 4.codemaid 格式化 5.go to ...

  6. Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询

    Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询     SQL 中,有SQL Server Profiler可以用来查询性能以及查看外部调用的SQL ...

  7. OC中类别、扩展、协议与委托

    一.类别(category) 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法.(类别,接口部分的定义 ...

  8. java javacv调用摄像头并拍照

    调用摄像头并拍张照片,我一开始用的java的jmf媒体框架,但这个有很多的局限性不好使并且很有麻烦,兜了一圈发现javacv东西,研究之后这东西简单,方便:废话不多说了来重点. javacv官网:点击 ...

  9. 实用的PHP功能详解(一)_php glob()用法

    一.使用glob()查找文件 大部分PHP函数的函数名从字面上都可以理解其用途,但是当你看到 glob() 的时候,你也许并不知道这是用来做什么的,其实glob()和scandir() 一样,可以用来 ...

  10. PHP数组合并 array_merge 与 + 的差异

    在PHP数组合并出过几次问题都没记住,写下来加强一点记忆 PHP数组在合并时,使用 array_merge 与 + 的差异: 1.array_merge(array $array1 [, array  ...