jsQunit
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的更多相关文章
- linqjs
Project Descriptionlinq.js - LINQ for JavaScript Features implement all .NET 4.0 methods and many ex ...
随机推荐
- 干货|宏巍软件之Java线程监控之旅
宏巍软件 许向 大家好,我是上海宏巍信息技术有限公司(简称:宏巍软件)的许向,宏巍软件成立于2005年,是一家以电商ERP软件开发为主的高新技术科技型软件公司,致力于为大型网商和电子商务企业提供专业. ...
- C语言学习笔记(一)_hello world程序中涉及的c语言元素
#include <stdio.h> //使用printf函数之前必须include<stdio.h> int main() { int i; //声明一个变量 printf( ...
- 010editor 破解 扩展
1. 注册机注册,注册机搜一下吧 (破解算法各版本通用) 2. 绕过网络验证,每次关闭010editor时都会网络验证,并将验证结果写道本地,所以: HKEY_CURRENT_USER\Softwar ...
- [题解]UVa 10891 Game of Sum
在游戏的任何时刻剩余的都是1 - n中的一个连续子序列.所以可以用dp[i][j]表示在第i个数到第j个数中取数,先手的玩家得到的最大的分值.因为两个人都很聪明,所以等于自己和自己下.基本上每次就都是 ...
- vs2015 现用插件
1.abphelper abp app自动生成接口和input output 2.ankhsvn svn插件 3.c#outline2015 大括号折叠 4.codemaid 格式化 5.go to ...
- Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询
Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询 SQL 中,有SQL Server Profiler可以用来查询性能以及查看外部调用的SQL ...
- OC中类别、扩展、协议与委托
一.类别(category) 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法.(类别,接口部分的定义 ...
- java javacv调用摄像头并拍照
调用摄像头并拍张照片,我一开始用的java的jmf媒体框架,但这个有很多的局限性不好使并且很有麻烦,兜了一圈发现javacv东西,研究之后这东西简单,方便:废话不多说了来重点. javacv官网:点击 ...
- 实用的PHP功能详解(一)_php glob()用法
一.使用glob()查找文件 大部分PHP函数的函数名从字面上都可以理解其用途,但是当你看到 glob() 的时候,你也许并不知道这是用来做什么的,其实glob()和scandir() 一样,可以用来 ...
- PHP数组合并 array_merge 与 + 的差异
在PHP数组合并出过几次问题都没记住,写下来加强一点记忆 PHP数组在合并时,使用 array_merge 与 + 的差异: 1.array_merge(array $array1 [, array ...