Cookbook of QUnit
本篇文章是QUnit的简介,可以作为很好的入门教程。文章原址
介绍
自动化测试时软件开发过程中必不可少的一部分,而单元测试则是自动化测试的最为基本的一块,软件的每一个组件,
每一个功能单元都需要经过不停地测试以保证在上线时可以正常的工作。当然,测试也不仅仅只有这些作用,最为人
所知的就是测试驱动设计(test-driven design),测试先于实现进行。先写出一个简单的测试,当然此时运行肯定会
出错,然后我们在开始完成具体的实现,直到测试通过。如果仅仅依靠我们自己实现测试函数,不仅仅难以抓住测试过程
中的各种细节(错误代码,错误位置,执行结果与预期结果差异),而且各个浏览器的兼容性也会让我们抓狂,所以我们
亟需一个解决浏览器差异性和提供详细信息的测试框架,John Resig大神写出了QUnit框架。我等凡人尽管写不出这种富有
调整型的框架,但是很有必要学会使用QUnit。
自动化单元测试
问题
我们想对应用进行单元测试,或者也想从测试驱动设计获益,此时我们需要自己手动写测试函数。但是正如上文所提,测试
细节信息和浏览器兼容性我们难以搞定,我们需要解决它。
解决方案
我们可以使用QUnit,在使用QUnit钱,需要引入qunit.js和qunit.css文件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>QUnit basic example</title>
<link rel="stylesheet" href="//code.jquery.com/qunit/qunit-1.16.0.css">
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
<script src="//code.jquery.com/qunit/qunit-1.16.0.js"></script>
<script>
QUnit.test( "a basic test example", function( assert ) {
var value = "hello";
assert.equal( value, "hello", "We expect value to be hello" );
});
</script>
</body>
</html>
id为qunit-fixture的div标签是必须的,在所有的QUnit测试中都是一样,它是测试夹具。每次测试完都会讲测试夹具内的
内容清空。
我们可以发现并没有在显示的在documentReady之后执行测试,这是因为测试器将会控制测试的开始执行时间,在执行QUnit.test
时,将函数添加到一个等待队列中,知道测试器调用。
断言结果
问题
断言是单元测试必不可少的要素之一。使用者需要将预期的结果和让测试器执行具体实现的结果进行比对,并得出相应
的判断。
方案
QUnit提供了简单的断言。
ok( truthy [, message ] )
最基本的断言就是ok(),它必须提供一个boolean参数(或者可以转化为boolean的参数,在js中貌似都可以类型转换为boolean),
另外一个参数可选。
QUnit.test( "ok test", function( assert ) {
assert.ok( true, "true succeeds" );
assert.ok( "non-empty", "non-empty string succeeds" ); assert.ok( false, "false fails" );
assert.ok( 0, "0 fails" );
assert.ok( NaN, "NaN fails" );
assert.ok( "", "empty string fails" );
assert.ok( null, "null fails" );
assert.ok( undefined, "undefined fails" );
});
equal( actual, expected [, message ] )
equal用“==”操作符来比较actual和expected参数,message为测试通过显示的信息。
QUnit.test( "equal test", function( assert ) {
assert.equal( 0, 0, "Zero, Zero; equal succeeds" );
assert.equal( "", 0, "Empty, Zero; equal succeeds" );
assert.equal( "", "", "Empty, Empty; equal succeeds" );
assert.equal( 0, false, "Zero, false; equal succeeds" ); assert.equal( "three", 3, "Three, 3; equal fails" );
assert.equal( null, false, "null, false; equal fails" );
});
strictEqual()用“===”比较两个参数。
deepEqual( actual, expected [, message ] )
该方法对简单的数值类型也是使用“===”进行比较。而对于对象,则不是使用“===”。它会便利对象的属性,并比较键值对。
(键和值都会比较)。
QUnit.test( "deepEqual test", function( assert ) {
var obj = { foo: "bar" }; assert.deepEqual( obj, { foo: "bar" }, "Two objects can be the same in value" );
});
同步回调
问题
在回调模式中,放在回调函数中的代码可能会阻止断言执行,所以需要通过某种方式提醒断言是否执行。
方案
我们可以使用assert.expect(n)来设定预期执行断言的数量。如果没有执行预期数量的断言,将会报错。
QUnit.test( "a test", function( assert ) {
assert.expect( 2 ); function calc( x, operation ) {
return operation( x );
} var result = calc( 2, function( x ) {
assert.ok( true, "calc() calls operation function" );
return x * x;
}); assert.equal( result, 4, "2 square equals 4" );
});
异步回调
问题
异步回调与测试器的队列和运行测试的方式有冲突。在该测试之后的测试函数将不会被执行。
方案
在异步回调中使用assert之后,调用assert.aysnc(),他会返回一个done函数,在测试执行完毕调用done函数。
经过测试,如果不调用done函数,则末尾切片函数将不会被执行,之后的测试函数也不会被执行。
QUnit.test( "asynchronous test: async input focus", function( assert ) {
var done = assert.async();
var input = $( "#test-input" ).focus();
setTimeout(function() {
assert.equal( document.activeElement, input[0], "Input was focused" );
done();
});
});
测试的原子性
在每次执行test之后,QUnit都会重置 #qunit-fixture的dom div,包括在内的事件。只要测试代码在测试夹具内,不用
手动对夹具进行清理。
组测试
组测试可以保证逻辑类似的测试在一起执行,而且可以添加切片函数。该函数在测试之前和之后执行。
QUnit.module( "module", {
setup: function( assert ) {
assert.ok( true, "one extra assert per test" );
}, teardown: function( assert ) {
assert.ok( true, "and one extra assert after each test" );
}
});
QUnit.test( "test with setup and teardown", function() {
assert.expect( 2 );
});
Cookbook of QUnit的更多相关文章
- 单元测试 Qunit
http://api.qunitjs.com/category/assert/ 测试方法 选中 "Check for Globals" 会暴露全局对象,看你的代码会不会无 ...
- 【odoo14】odoo 14 Development Cookbook【目录篇】
网上已经有大佬翻译过odoo12并且在翻译odoo14了.各位着急的可以自行搜索下... 这本书是为了让自己从odoo12转odoo14学习.也是为了锻炼下自己... odoo 14 Developm ...
- qunit 前端脚本测试用例
首先引用qunit 测试框架文件 <link rel="stylesheet" href="qunit-1.22.0.css"> <scrip ...
- 使用QUnit进行自动化单元测试
前言 前阵子由于项目需求接触了java的单元测试JUnit,就顺带着学习了前端的单元测试:Qunit. 既然跟测试有关,不妨介绍一下测试中的黑盒测试.白盒测试以及单元测试. 1.黑盒测试:所谓的黑盒, ...
- JavaScript测试工具比较: QUnit, Jasmine, and Mocha
1. QUnit A JavaScript Unit Testing framework. QUnit is a powerful, easy-to-use JavaScript unit testi ...
- 在requirejs中使用qunit
requirejs(['QUnit'], function(qunit) { qunit.test('test name', function(assert) { // 一些测试, assert }) ...
- Javascript单元测试之QUnit
首先去Qunit官网下载. Qunit有一个js脚本文件和一个css我们在页面中引入它. <script src="qunit-2.0.1.js"></scrip ...
- Javascript单元测试Unit Testing之QUnit
body{ font: 16px/1.5em 微软雅黑,arial,verdana,helvetica,sans-serif; } QUnit是一个基于JQuery的单元测试Uni ...
- Unity Shaders and Effets Cookbook
Unity Shaders and Effects Cookbook 最近在读 <Unity Shaders and Effects Cookbook> 中文名称:<Unity 着色 ...
随机推荐
- Java中9种IO的读取方式
数据的读写,按照数据类型可以分为两种:字符流和字节流(二者区别?).所以数据读取方式按照数据类型也可以分为两类:字节流的读取和字符流的读取. 一.字节流读取操作: | | |-----1.FileI ...
- 安装使用Oracle OSWbb/OSWbba工具
OSWbb是收集数据,OSWbba 是分析数据,在OSWbb4.0以后,OSWbba已经绑定在OSWbb内. 1.创建目录,上传/解压安装包 [oracle@std ~]$ mkdir oswbb [ ...
- Spket在Eclipse下的安装和配置(图文教程)
一.Spket简介 Spket是一个RIA的开发工具,具有代码自动完成.语法高亮.内容概要等功能,可以帮助开发人员高效的编写JavaScript程序. 效果图: 二.安装Spket 1.去官网(htt ...
- ffmpeg编译与移植问题
1.下载ffmpeg. 下载网址:http://www.ffmpeg.org/download.html 2.解压缩 tar -zxvf ffmpeg-2.0.1.tar.gz 3.配置,生成Make ...
- Android 开发快速导引:Android程序框架【草】
概述 学习一项新技术之前要先了解这个技术的整体框架,这里先简单说一下 Android 的程序结构. Android App 有四个顶层的类:Activity.Service.ContentProvid ...
- CYQ.Data V5 MDataTable 专属篇介绍
前言 以前一两个月才出一篇,这三天有点变态地连续1天1篇(其实都是上周末两天写好的存货). 短期应该没有新的和此框架相关的文章要写了,这应该是最后一篇,大伙且看且珍惜. 前两篇讲数据库读写分离和分布式 ...
- 剑指Offer面试题:25.二叉搜索树与双向链表
一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...
- Linux的tree命令
发现Linux下有个很好的命令,tree,能把目录以树的形式列出来,还支持很强大的参数. 但默认情况下是不带的,得自己去安装,先到这里下载它的代码:http://mama.indstate.edu/u ...
- 从天猫和支付宝身上学习opcity与rgba
不知道什么时候,一个双层透明的对话框悄然流行了起来. 我们在各大网站上都能见到类似这样的对话框: 这样的聚焦更明显,用户体验更好,也显得更加的高大上. 先说点题外话,这种布局如何用CSS+DIV去实现 ...
- QParserGenerator的文法文件介绍
在沉默了数月之后,博主心血来潮想继续介绍QParserGenerator,在这里我们将不再继续介绍任何有关于LALR(1)的算法(那东西只会把你的脑子变成一团浆糊),让我们来看一下QParserGen ...