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结果如下:

《QUnit入门》

  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入门》

另外分组也可以设置测试前后需要做的事情

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']);
之后每次更新插件都会自动运行测试文件。

    原文作者:philoZhe
    原文地址: https://www.jianshu.com/p/9de3ba9981b8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞