QUnit入门

标签: 前端开发


1. QUnit是什么?

一个js进行单元测试的库
单元测试就是检验代码是否按预期运作。
代码写的测试比人手测试好得多,因此单元测试是必须的。
官网


2. 如何使用

1)hello world:准备两个文件,一个显示测试结果的页面(有模板),一个测试用例

<!-- test.html -->
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>QUnit Example</title>
  <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.17.1.css">
  <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
  <div id="qunit"></div>
  <div id="qunit-fixture" style="border: 1px solid red"></div>
  <script src="http://code.jquery.com/qunit/qunit-1.17.1.js"></script>
  <script src="test.js"></script>
</body>
</html>

测试用例的一个简单demo

//数字表示共有多少个断言,可有可无
QUnit.test("hello test", 1,  function (assert) {
    assert.ok("hello" == "hello", "hello world successfully");
});

断言还有equal(), deepEqual()等等,详细可参考官网
在浏览器上看test.html结果如下:


  1. 同步回调
QUnit.test("sync callback",  function (assert) {
    var body = $('body');
    body.click(function(){
        assert.ok(true, "body was clicked");
        body.unbind("click");
    });
    body.trigger("click");  //注意这里是jQuery的写法,原生是element.click();
    assert.ok(true, "test");
});

  1. 异步回调
    有两种方法:一是使用var done = assert.async(), 再在异步断言处调用done();另一种是使用QUnit.asnycTest()
//第一种方法
QUnit.test("async callback", 2,  function (assert) {
    var body = $('body');
    var done = assert.async(); //表示存在异步,先暂停测试
    body.click(function(){
        assert.ok(true, "body was clicked");
        done(); //表示异步结束,开始测试
        body.unbind("click");
    });
    setTimeout(function(){
        body.trigger("click");
    }, 1000)
    assert.ok(true, "test");
});
//第二种方法
QUnit.asyncTest("async callback", 2,  function (assert) {
    var body = $('body');
    body.click(function(){
        assert.ok(true, "body was clicked");
        QUnit.start(); //表示异步完成,开始测试
        body.unbind("click");
    });
    setTimeout(function(){
        body.trigger("click");
    }, 1000)
    assert.ok(true, "test");
});

  1. AJAX测试的一种写法
    对于有多个异步读取的页面,可以这样写测试用例
//当完成所以的ajax时调用start开始测试
function createAsyncCounter(count){
        count = count || 1;
        return function(){ --count || QUnit.start()}; 
        //count为零时开始测试
    }

QUnit.asyncTest("ajax test", 2, function(assert){
    //这里只展示1个ajax,根据自己情况而定
    var count = createAsyncCounter(1); 
    var x = $.ajax("https://api.github.com/users/octocat/gists");

    x.done(function(data, status, xhr){
        assert.ok(data,"get data");
        assert.equal(data[0]["id"],"6cad326836d38bd3a7ae","id correct");
    }).always(count); //无论ajax成功与否都执行计数
});

  1. DOM测试
    可以测试dom操作是否达到预期,需要用到测试页面的#qunit-fixture
QUnit.test("dom test", 1,  function (assert) {
    var fixture = $('#qunit-fixture');
    fixture.append('<span>hello!</span>');
    assert.equal($('span', fixture).length, 1, "div append one span");
});

#qunit-fixture每次测试都会自动清除自身内容,因此可复用。


6)分组
使用在测试的方法上面加一句QUnit.module("module_name"); 即可分组


另外分组也可以设置测试前后需要做的事情
QUnit.module("module_name", {setup:function(){//..}, teardown:function(){//...}});


  1. 自定义断言
//定义
QUnit.assert.mod2 = function(value, expect, message){
    var actual = value % 2;
    this.push(actual === expect, actual, expect, message);
}
//使用
QUnit.test( "test", function( assert ) {
    assert.expect( 2 );
    assert.mod2( 2, 0, "2 % 2 == 0" );
    assert.mod2( 3, 1, "3 % 2 == 1" );
});

  1. 测试页面上的工具
    三个checkbox

Hide passed tests
很好理解,就是隐藏通过的测试,勾选之后,通过的测试就不显示出来了,在测试用例多的时候非常有用。而且使用了HTML5的sessionStorage技术,会记住之前没通过的测试,然后页面重新载入的时候只测试之前那部分没有通过的case。
Check for Globals
“全局检查“,如果勾选了这项,在进行测试之前,QUnit会检查测试之前和测试之后window对象中的属性,如果前后不一样,就会显示不通过。
No try-catch
选中则意味着QUnit会在try-catch语句之外运行回调,此时,如果测试抛出异常,测试就会停止。主要是因为有些浏览器的调试工具是相当弱的,尤其IE6,一个未处理的异常要比捕获的异常可以提供更多的信息。即使再次抛出,由于JavaScript不擅长异常处理,原来的堆栈跟踪在大多数浏览器里都丢失了。如果遇到一个异常,无法追溯错误代码的时候,就可以使用这个选项了。

测试用例旁边还有一个rerun可以重新测试


  1. 使用grunt实现自动测试
    很简单,首先安装qunit插件:
    npm install grunt-contrib-qunit --save-dev
    然后在grunt.initConfig里配置 qunit: { files:[test/*.html] }
    添加任务到watch
watch:{
    files:['<%= jshint.files %>', '<%= qunit.files %>'],
    tasks:['jshint', 'qunit']
}

加载库 grunt.loadNpmTasks('grunt-contrib-qunit');
也可以加入到常规任务中 grunt.registerTask('test', ['jshint', 'qunit', 'watch']);
之后每次更新插件都会自动运行测试文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,788评论 6 342
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,605评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,900评论 25 707
  • 我有一个朋友甲,早上六点敲门来找我,我匆匆起来,被子之类都没有收拾就去给他开门,他进来就看到了乱糟糟的屋子,和衣衫...
    小羚阅读 174评论 0 1